我是靠谱客的博主 着急树叶,最近开发中收集的这篇文章主要介绍在 macOS 中编译 webrtc android 端代码在 macOS 中编译 webrtc android 端代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在 macOS 中编译 webrtc android 端代码

文章目录

  • 在 macOS 中编译 webrtc android 端代码
    • 1. 前提
    • 2. 编译环境
    • 3. 操作步骤
      • 3.1 替换 llvm-build
      • 3.2 替换 Jdk
      • 3.3 更换 aapt2
      • 3.4 更换 NDK
      • 3.5 修改相关脚本
      • 3.6 编译脚本
    • 4 结束

1. 前提

已提前在 ubuntu 系统中下载好 webrtc 代码并可完整编译,关于如何在 Ubuntu 内下载 webrtc 代码,此处省略一万字。。。

2. 编译环境

  • macos: 10.15 Catalina 系统
  • webrtc: m84 (branch-heads/4147)

3. 操作步骤

3.1 替换 llvm-build

由于 ubuntu 内下载的 llvm-build 不能在 macOS 内运行,而直接下载的 macOS 的 llvm-build是缺少 llvm-ar 文件的,所以需要下载并编译新的 llvm-build。

    1. 编译之前先对原来的进行备份:
mv ./third_party/llvm-build ./third_party/llvm-build-ubuntu
    1. 下载并编译 macOS 端 llvm(此步建议能科学上网,不然中间 clone llvm 仓库的时候可能会断):
# 本地编译 llvm(因为下载的 macOS 版本都没有 llvm-ar 这个程序)
# 若系统没有安装 CMake 或 已安装版本太低,可以去掉 --use-system-cmake 选项,
# 脚本会自行下载最新 CMake 进行编译
./tools/clang/scripts/build.py --without-fuchsia --use-system-cmake

3.2 替换 Jdk

在 Ubuntu 内下载的 Jdk 不能适用于 macOS 系统,需要重新下载。

    1. 首先查看在 Ubuntu 内下载的 webrtc 内的 jdk 版本,并备份;
./third_party/jdk/current/bin/java -version

m84 对应的 jdk 版本是 11.0.4, 命令输出如下

java version "11.0.4" 2019-07-16 LTS
Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS)
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode)

备份 Jdk

mv ./third_party/jdk/current ./third_party/jdk/current_ubuntu
    1. 下载相应或靠近的 macOS 平台的 Jdk 版本, 由于我下载时没找到 11.0.4 的版本,所以下载的是 11.0.8版本,无需下载安装文件,直接下载压缩文件即可,我下载的是 jdk-11.0.8_osx-x64_bin.tar.gz。
    1. 解压缩 jdk-11.0.8_osx-x64_bin.tar.gz后文件夹名称为 jdk-11.0.8.jdk,将 jdk-11.0.8.jdk/Contents/Home 拷贝到原来 Jdk 的位置;
cp -rf <Path>/jdk-11.0.8.jdk/Contents/Home ./third_party/jdk/current

3.3 更换 aapt2

在 ubuntu 内下载的 webrtc android 端代码,aapt2 工具是不能在 mac 中执行的,而通过 AndroidStudio 内 sdk 下载的 aapt2 是精简过的,也不能直接用,需要下载一份完整版的进行替换:
aapt2 介绍
aapt2 4.0.1-6197926 版本 mac 端 下载地址

下载后解压缩 aapt2-4.0.1-6197926-osx.jar后,将 aapt2 文件替换到 third_party/android_build_tools/aapt2 目录

3.4 更换 NDK

下载 macos 端的 ndk,具体下载版本可查看 ./build/config/android/config.gni 内 default_android_ndk_version版本号,m84内此版本号为 “r20”,下载后文件名为 android-ndk-r20-darwin-x86_64.zip,解压到 /Users/<用户名>/android-ndk-r20。

脚本配置:

# 修改 default_android_ndk_root 路径
vi ./build/config/android/config.gni
#修改后 
default_android_ndk_root = /Users/<用户名>/android-ndk-r20

由于 m84 的 android_sdk 内依赖的 cpu_features 路径是 “$android_ndk_root:cpu_features”, 而其他模块依赖 cpu_features 的路径是 “//third_party/android_ndk:cpu_features”,
所以在改了 ndk 路径后编译时会导致so 库链接多重定义错误:

ld.lld: error: duplicate symbol: android_getCpuCount
ld.lld: error: duplicate symbol: android_getCpuFamily
ld.lld: error: duplicate symbol: android_getCpuFeatures
ld.lld: error: duplicate symbol: android_setCpu

所以需要改一下 android_sdk 的 cpu_features 依赖路径,或修改其他模块依赖的 cpu_features 路径,在此修改的是 android_sdk 的依赖路径,主要是只需修改此一处即可。

vi ./third_party/android_sdk/BUILD.gn

# 修改前:
public_deps = [ "$android_ndk_root:cpu_features" ]
# 修改后:
public_deps = [ "//third_party/android_ndk:cpu_features" ]

3.5 修改相关脚本

    1. android 端 webrtc m84版本需要在编译过程中将 java 文件编译的 template 依赖于 ijar,而 ijar 是gn 生成脚本时预编译出来的可执行文件,在 ijar 的 BUILD.gn 内只允许 Ubuntu linux,需要修改下,添加 Mac 平台编译支持, 修改后 diff 如下:
--- a/third_party/ijar/BUILD.gn
+++ b/third_party/ijar/BUILD.gn
@@ -4,7 +4,7 @@

 # A tool that removes all non-interface-specific parts from a .jar file.

-if (is_linux) {
+if (is_linux || is_mac) {
   executable("ijar") {
     sources = [
       "classfile.cc",
    1. 修改 ./build/config/android/config.gni,解决 “注: 某些输入文件使用或覆盖了已过时的 API” 警告错误
     # For local development, it's nice to not fail builds on warnings.
-    java_warnings_as_errors = !is_java_debug
+    # java_warnings_as_errors = !is_java_debug
+    java_warnings_as_errors = false
    1. 解决 so 库链接命令错误问题
diff --git a/build/toolchain/gcc_solink_wrapper.py b/build/toolchain/gcc_solink_wrapper.py
index 5bb7b9513f..c57d0b683d 100755
--- a/build/toolchain/gcc_solink_wrapper.py
+++ b/build/toolchain/gcc_solink_wrapper.py
@@ -144,7 +144,7 @@ def main():
   # Finally, strip the linked shared object file (if desired).
   if args.strip:
     result = subprocess.call(wrapper_utils.CommandToRun(
-        [args.strip, '-o', args.output, args.sofile]))
+        [args.readelf[:-7] + "strip", '-o', args.output, args.sofile]))

   return result
    1. 修改 strip 命令错误
      错误如下:
Traceback (most recent call last):
  File "../../build/toolchain/gcc_link_wrapper.py", line 76, in <module>
    sys.exit(main())
  File "../../build/toolchain/gcc_link_wrapper.py", line 69, in main
    args.strip, '-o', args.output, args.unstripped_file
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 172, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 394, in __init__
    errread, errwrite)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1047, in _execute_child
    raise child_exception
OSError: [Errno 8] Exec format error

修改 build/toolchain/android/BUILD.gn 文件,替换 strip 路径:

diff --git a/build/toolchain/android/BUILD.gn b/build/toolchain/android/BUILD.gn
index ceca1a4657..6a52e64793 100644
--- a/build/toolchain/android/BUILD.gn
+++ b/build/toolchain/android/BUILD.gn
@@ -42,7 +42,9 @@ template("android_clang_toolchain") {
     ld = cxx
     readelf = _tool_prefix + "readelf"
     nm = _tool_prefix + "nm"
-    strip = rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",
+    # strip = rebase_path("//buildtools/third_party/eu-strip/bin/eu-strip",
+    #                     root_build_dir)
+    strip = rebase_path("//third_party/llvm-build/Release+Asserts/bin/llvm-strip",
                         root_build_dir)
     use_unstripped_as_runtime_outputs = android_unstripped_runtime_outputs
    1. 下载并修改 android-sdk-cmdline-tools 路径(使用外部 android_sdk 时需要,比如通过 AndroidStudio 下载的 sdk)
Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Multimap
	at com.android.manifmerger.Merger.createInvoker(Merger.java:189)
	at com.android.manifmerger.Merger.process(Merger.java:94)
	at com.android.manifmerger.Merger.main(Merger.java:42)
Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Multimap
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
	... 3 more

这是因为 m84 版本依赖的 guaua 版本是 guava-27.1-jre.jar,而 AndroidStudio 下载的 sdk的 latest 内可能是 guava-28.1-jre.jar或更高版本。
通过 AndroidStudio 的 sdk manager 下载 Android SDK Command-line Tools 的 1.0 版本,然后修改 build/config/android/internal_rules.gni:

diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 9aacad1d16..b8daa2f8b3 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -1960,7 +1960,7 @@ if (enable_java_templates) {
         "--depfile",
         rebase_path(depfile, root_build_dir),
         "--android-sdk-cmdline-tools",
-        rebase_path("${public_android_sdk_root}/cmdline-tools/latest",
+        rebase_path("${public_android_sdk_root}/cmdline-tools/1.0",
                     root_build_dir),
         "--root-manifest",
         rebase_path(invoker.input_manifest, root_build_dir),

3.6 编译脚本

gn gen out/android_arm --args='target_os="android" target_cpu="arm" is_component_build=false is_debug=false rtc_enable_protobuf=false rtc_include_tests=false rtc_build_tools=false disable_android_lint=false use_errorprone_java_compiler=false'
ninja -j8 -C out/android_arm AppRTCMobile

gn gen out/android_arm64 --args='target_os="android" target_cpu="arm64" is_component_build=false is_debug=false rtc_enable_protobuf=false rtc_include_tests=false rtc_build_tools=false disable_android_lint=false use_errorprone_java_compiler=false'
ninja -j8 -C out/android_arm64 AppRTCMobile

4 结束

恭祝您神功已练成,继续打怪升级。。。

最后

以上就是着急树叶为你收集整理的在 macOS 中编译 webrtc android 端代码在 macOS 中编译 webrtc android 端代码的全部内容,希望文章能够帮你解决在 macOS 中编译 webrtc android 端代码在 macOS 中编译 webrtc android 端代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部