在 macOS 中编译 webrtc android 端代码

在 macOS 中编译 webrtc android 端代码

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 结束

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目前尚未发布 Emacs 30,因此还没有 Emacs 30 的源代码可供下载和编译。不过,如果 Emacs 30 发布后你需要在 macOS编译它,你可以尝试按照以下步骤进行: 1. 安装 Xcode:在 macOS编译 Emacs 需要安装 Xcode 开发工具。你可以在 App Store 上下载并安装 Xcode。 2. 安装 Homebrew:Homebrew 是一个非常流行的 macOS 包管理器,你可以使用它来安装必要的依赖项。你可以在终输入以下命令来安装 Homebrew: ``` /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" ``` 3. 安装依赖项:在终输入以下命令来安装 Emacs 编译所需的依赖项: ``` brew install autoconf automake texinfo gtk+3 gnutls libxml2 librsvg imagemagick@6 ``` 4. 下载 Emacs 30 源代码:当 Emacs 30 发布后,你可以从 Emacs 官网或者 GitHub 上下载 Emacs 30 的源代码。 5. 配置和编译 Emacs:在终进入 Emacs 30 源代码目录,并执行以下命令来配置和编译 Emacs: ``` ./configure --with-native-compilation --with-modules --with-harfbuzz=no --with-cairo=no --with-json=no --with-xwidgets --with-imagemagick --with-jpeg --with-png --with-rsvg --with-tiff --with-xml2 --with-gnutls --with-gpm=no --without-gconf --without-gsettings --without-makeinfo --without-pop --without-mailutils make -j4 ``` 这将会进行 Emacs 的配置和编译。这可能需要一些时间,具体时间取决于你的机器性能。 6. 安装 Emacs:在终输入以下命令来安装 Emacs: ``` sudo make install ``` 这将会将 Emacs 安装到 /usr/local/bin 目录下。 完成以上步骤后,你就可以在终输入 emacs 命令来启动 Emacs 30 了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值