概述
在 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。
-
- 编译之前先对原来的进行备份:
mv ./third_party/llvm-build ./third_party/llvm-build-ubuntu
-
- 下载并编译 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 系统,需要重新下载。
-
- 首先查看在 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
-
- 下载相应或靠近的 macOS 平台的 Jdk 版本, 由于我下载时没找到 11.0.4 的版本,所以下载的是 11.0.8版本,无需下载安装文件,直接下载压缩文件即可,我下载的是 jdk-11.0.8_osx-x64_bin.tar.gz。
-
- 解压缩 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 修改相关脚本
-
- 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",
-
- 修改 ./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
-
- 解决 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
-
- 修改 strip 命令错误
错误如下:
- 修改 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
-
- 下载并修改 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 端代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复