一、配置环境
1、Android的编译,需要在Linux下进行,所以 《虚拟机》+ 《Ubuntu》 先准备好。Ubuntu需要预留50G的空间,当然40G应该也可以吧。反正20G是可定不行的。我一开始是20G,后来下载完的webRTC实在太大了,又重新卸载并安装了Ubuntu(当然,如果你会扩容,就忽略我的做法)。
2、安装git工具
sudo apt-get install git
3、在终端上执行脚本。(前两条,一条一条的输入,后面的可以一次性复制过去)
git config --global user.email "<your email>"
git config --global user.name "<your name>"
git config --global url.http://120.92.49.206:3232/chromiumsrc/webrtc.git.insteadOf https://chromium.googlesource.com/external/webrtc.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/base.git.insteadOf https://chromium.googlesource.com/chromium/src/base
git config --global url.http://120.92.49.206:3232/chromiumsrc/build.git.insteadOf https://chromium.googlesource.com/chromium/src/build
git config --global url.http://120.92.49.206:3232/chromiumsrc/buildtools.git.insteadOf https://chromium.googlesource.com/chromium/src/buildtools
git config --global url.http://120.92.49.206:3232/chromiumsrc/gradle.git.insteadOf https://chromium.googlesource.com/external/github.com/gradle/gradle.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/ios.git.insteadOf https://chromium.googlesource.com/chromium/src/ios.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/testing.git.insteadOf https://chromium.googlesource.com/chromium/src/testing
git config --global url.http://120.92.49.206:3232/chromiumsrc/third_party.git.insteadOf https://chromium.googlesource.com/chromium/src/third_party
git config --global url.http://120.92.49.206:3232/chromiumsrc/clang-format.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/cfe/tools/clang-format.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libcxx.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/libcxx.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libcxxabi.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/libcxxabi.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libunwind.git.insteadOf https://chromium.googlesource.com/external/llvm.org/libunwind.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/android_ndk.git.insteadOf https://chromium.googlesource.com/android_ndk.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/android_tools.git.insteadOf https://chromium.googlesource.com/android_tools.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/auto.git.insteadOf https://chromium.googlesource.com/external/github.com/google/auto.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/catapult.git.insteadOf https://chromium.googlesource.com/catapult.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/compact_enc_det.git.insteadOf https://chromium.googlesource.com/external/github.com/google/compact_enc_det.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/colorama.git.insteadOf https://chromium.googlesource.com/external/colorama.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/depot_tools.git.insteadOf https://chromium.googlesource.com/chromium/tools/depot_tools.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/errorprone.git.insteadOf https://chromium.googlesource.com/chromium/third_party/errorprone.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/ffmpeg.git.insteadOf https://chromium.googlesource.com/chromium/third_party/ffmpeg.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/findbugs.git.insteadOf https://chromium.googlesource.com/chromium/deps/findbugs.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/freetype2.git.insteadOf https://chromium.googlesource.com/chromium/src/third_party/freetype2.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/harfbuzz.git.insteadOf https://chromium.googlesource.com/external/github.com/harfbuzz/harfbuzz.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/gtest-parallel.git.insteadOf https://chromium.googlesource.com/external/github.com/google/gtest-parallel
git config --global url.http://120.92.49.206:3232/chromiumsrc/googletest.git.insteadOf https://chromium.googlesource.com/external/github.com/google/googletest.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/icu.git.insteadOf https://chromium.googlesource.com/chromium/deps/icu.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/jsr-305.git.insteadOf https://chromium.googlesource.com/external/jsr-305.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/jsoncpp.git.insteadOf https://chromium.googlesource.com/external/github.com/open-source-parsers/jsoncpp.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/junit.git.insteadOf https://chromium.googlesource.com/external/junit.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/fuzzer.git.insteadOf https://chromium.googlesource.com/chromium/llvm-project/compiler-rt/lib/fuzzer.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libjpeg_turbo.git.insteadOf https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libsrtp.git.insteadOf https://chromium.googlesource.com/chromium/deps/libsrtp.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libvpx.git.insteadOf https://chromium.googlesource.com/webm/libvpx.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/libyuv.git.insteadOf https://chromium.googlesource.com/libyuv/libyuv.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/linux-syscall-support.git.insteadOf https://chromium.googlesource.com/linux-syscall-support.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/mockito.git.insteadOf https://chromium.googlesource.com/external/mockito/mockito.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/nasm.git.insteadOf https://chromium.googlesource.com/chromium/deps/nasm.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/openh264.git.insteadOf https://chromium.googlesource.com/external/github.com/cisco/openh264
git config --global url.http://120.92.49.206:3232/chromiumsrc/requests.git.insteadOf https://chromium.googlesource.com/external/github.com/kennethreitz/requests.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/robolectric.git.insteadOf https://chromium.googlesource.com/external/robolectric.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/ub-uiautomator.git.insteadOf https://chromium.googlesource.com/chromium/third_party/ub-uiautomator.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/usrsctp.git.insteadOf https://chromium.googlesource.com/external/github.com/sctplab/usrsctp
git config --global url.http://120.92.49.206:3232/chromiumsrc/binaries.git.insteadOf https://chromium.googlesource.com/chromium/deps/yasm/binaries.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/patched-yasm.git.insteadOf https://chromium.googlesource.com/chromium/deps/yasm/patched-yasm.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/tools.git.insteadOf https://chromium.googlesource.com/chromium/src/tools
git config --global url.http://120.92.49.206:3232/chromiumsrc/client-py.git.insteadOf https://chromium.googlesource.com/infra/luci/client-py.git
git config --global url.http://120.92.49.206:3232/chromiumsrc/boringssl.git.insteadOf https://boringssl.googlesource.com/boringssl.git
4、指定同步目录:我在home/user下面,新建了一个webRTC的文件夹,并进入,即home/user/webRTC 目录,设置为当前目录。
#指定当前目录为同步目录,也可以指定其他路径
export WORKSPACE=`pwd`
5、切换到当前目录(cd $WORKSPACE),然后下载并安装depot_tools
cd $WORKSPACE
rm -rf depot_tools && git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
cd $WORKSPACE/depot_tools && git checkout gitlab
chmod +x $WORKSPACE/depot_tools/cipd
export PATH=$PATH:$WORKSPACE/depot_tools
6、同步webRTC(最后一行,开始下载,然后等待漫长的一个多小时)
rm -rf $WORKSPACE/webrtc && mkdir $WORKSPACE/webrtc
cd $WORKSPACE/webrtc && gclient config --name src https://chromium.googlesource.com/external/webrtc.git@gitlab
export CDS_CLANG_BUCKET_OVERRIDE=http://120.92.49.206:3232/chromiumsrc/commondatastorage/raw/master/public/chromium-browser-clang
#cd ~/depot_tools; git fetch; git reset --hard origin/gitlab; chmod +x ~/depot_tools/cipd
cd $WORKSPACE/webrtc && gclient sync --patch-ref=https://chromium.googlesource.com/chromium/src/build.git@gitlab
二、编译
安装依赖项时,需要sudo 权限。
编译生成的库,存放在 src/out/Release
编译完成后,就可以在src/out/Release/apks目录下找到AppRTCMobile.apk了
# 安装依赖
apt-get install -y software-properties-common # 前面加:sudo
add-apt-repository -y ppa:openjdk-r/ppa # 前面加:sudo
./build/install-build-deps-android.sh # src/build/有这个sh,直接sudo 执行
# 添加安卓平台
cd $WORKSPACE/webrtc
echo "target_os = [ 'android' ]" >>.gclient
# 同步
export PATH=$PATH:$WORKSPACE/depot_tools
export CDS_CLANG_BUCKET_OVERRIDE=http://120.92.49.206:3232/chromiumsrc/commondatastorage/raw/master/public/chromium-browser-clang
# 时间稍长
cd $WORKSPACE/webrtc && gclient sync --patch-ref=https://chromium.googlesource.com/chromium/src/build.git@gitlab
# 编译
cd $WORKSPACE/webrtc/src
gn gen out/Release_arm64 "--args=is_debug=false target_os=\"android\" target_cpu=\"arm64\""
ninja -C out/Release_arm64
编译其他版本:
a)编译arm debug版本
gn gen out/Debug_arm32 "--args=target_os=\"android\" target_cpu=\"arm\""
ninja -C out/Debug_arm32
b)编译arm64 debug版本
gn gen out/Debug_arm64 "--args=target_os=\"android\" target_cpu=\"arm64\""
ninja -C out/Debug_arm64
c)编译arm release版本
gn gen out/Release_arm32 "--args=target_os=\"android\" target_cpu=\"arm\" is_debug=false"
ninja -C out/Release_arm32
d)编译arm64 release版本
gn gen out/Release_arm64 "--args=target_os=\"android\" target_cpu=\"arm64\" is_debug=false"
ninja -C out/Release_arm64
三、编译过程,出现的问题:
当程序编译到一半出错时,输入:ninja -C out/Release_arm64 >> release_arm64.log
即可得到错误日志,主要问题如下:
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1340, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
全部日志内容:
ninja: Entering directory `out/Release_arm64'
[1/8060] STAMP obj/system_wrappers/field_trial.stamp
[2/8060] CC obj/third_party/boringssl/boringssl/err_data.o
[3/8060] CXX obj/system_wrappers/event_wrapper/event.o
[4/8060] CXX obj/test/test_renderer_generic/video_renderer.o
[5/8060] STAMP obj/test/field_trial.stamp
[6/8060] CXX obj/test/fileutils/file_utils.o
[7/8060] CXX obj/video/video/call_stats.o
[8/8060] CXX obj/test/scenario/column_printer/column_printer.o
[9/8060] CXX obj/stats/rtc_stats_test_utils/rtc_test_stats.o
[10/8060] CXX obj/test/pc/e2e/single_process_encoded_image_data_injector/single_process_encoded_image_data_injector.o
[11/8060] ACTION //sdk/android:generated_base_jni__jni_gen(//build/toolchain/android:android_clang_arm64)
[12/8060] ACTION //sdk/android:generated_base_jni__jni_gen(//build/toolchain/android:android_clang_arm64)
[13/8060] ACTION //base:anchor_functions_buildflags(//build/toolchain/android:android_clang_arm64)
[14/8060] STAMP obj/base/anchor_functions_buildflags.stamp
[15/8060] ACTION //sdk/android:generated_base_jni__jni_gen(//build/toolchain/android:android_clang_arm64)
[16/8060] CXX obj/test/fake_video_codecs/fake_vp8_decoder.o
[17/8060] ACTION //base:android_runtime_jni_headers__jni_Runnable(//build/toolchain/android:android_clang_arm64)
FAILED: gen/base/android_runtime_jni_headers/base/jni/Runnable_jni.h
python ../../base/android/jni_generator/jni_generator.py --jar_file ../../third_party/android_sdk/public/platforms/android-28/android.jar --input_file java/lang/Runnable.class --ptr_type=long --output_dir gen/base/android_runtime_jni_headers/base/jni --includes ../../../../../../../base/android/jni_generator/jni_generator_helper.h
Traceback (most recent call last):
File "../../base/android/jni_generator/jni_generator.py", line 1628, in <module>
sys.exit(main(sys.argv))
File "../../base/android/jni_generator/jni_generator.py", line 1624, in main
GenerateJNIHeader(input_file, output_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 1532, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 847, in CreateFromClass
stderr=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1340, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
[18/8060] ACTION //sdk/android:generated_base_jni__jni_gen(//build/toolchain/android:android_clang_arm64)
[19/8060] ACTION //base:base_android_java_enums_srcjar(//build/toolchain/android:android_clang_arm64)
[20/8060] ACTION //base:android_runtime_jni_headers__jni_Runtime(//build/toolchain/android:android_clang_arm64)
FAILED: gen/base/android_runtime_jni_headers/base/jni/Runtime_jni.h
python ../../base/android/jni_generator/jni_generator.py --jar_file ../../third_party/android_sdk/public/platforms/android-28/android.jar --input_file java/lang/Runtime.class --ptr_type=long --output_dir gen/base/android_runtime_jni_headers/base/jni --includes ../../../../../../../base/android/jni_generator/jni_generator_helper.h
Traceback (most recent call last):
File "../../base/android/jni_generator/jni_generator.py", line 1628, in <module>
sys.exit(main(sys.argv))
File "../../base/android/jni_generator/jni_generator.py", line 1624, in main
GenerateJNIHeader(input_file, output_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 1532, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File "../../base/android/jni_generator/jni_generator.py", line 847, in CreateFromClass
stderr=subprocess.PIPE)
File "/usr/lib/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1340, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
[21/8060] CXX obj/test/fake_video_codecs/fake_vp8_encoder.o
[22/8060] CXX obj/video/video_stream_decoder_impl/video_stream_decoder_impl.o
ninja: build stopped: subcommand failed.
1. 怀疑是python和java版本的问题,查看python版本,和java版本:
执行:sudo apt-get install openjdk-8-jre-headless, 然后再执行ninja ,并没有解决。
2. 从网上查的解决方案:sudo apt-get install git git-core,然后再执行ninja ,并没有解决。
3. 怀疑是64位编译不过去,直接编译debug32位的,试一下, 还是不行。
4. 认真看看报错信息,发现:
在out/debug或者release的路径下,就没有这两个文件,所以报错了。
gen/base/android_runtime_jni_headers/base/jni/Runnable_jni.h
gen/base/android_runtime_jni_headers/base/jni/Runtime_jni.h
再进一步检查,发现在 下面这句话执行的时候,就报错了。
./build/install-build-deps-android.sh
错误信息如下:
Aborted (core dumped)
Reading package lists... Done
E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/cache/app-info -a -e /usr/bin/appstreamcli; then appstreamcli refresh > /dev/null; fi'
E: Sub-process returned an error code
网上找的解决方案(参考链接:https://forum.siduction.org/index.php?topic=6174.0):
先执行: sudo apt-get remove libappstream3 // 好像是不让16.04版本更新,
然后执行:sudo ./build/install-build-deps-android.sh // 这里卡了好久,直接ctrl+z 停了。最后也还是不行。
5. 看看有哪些进程开着的,kill掉一些进行,然后重新执行【安装依赖】,最后证明,是路径没有搞对,最后通过了。
关机重启,重新执行,通过。
c++编译出来的动态库:*.so .
但是java不能直接用,需要引用:libjingle_peerconnection_java.jar,←这里面的jar文件 将来都可能会用到。
四、测试
编译好之后,apk在这里:webrtc/src/out/release_aem64/apks/AppRTCMobile.apk
把这个apk,放在Android机上,安装。
打开这个浏览器:https://appr.tc/ ,生成随机码,JOIN, 然后手机端输入相同的号码,进行测试。
我这里出现的问题:
浏览器端提示这个错误:
Messages:
WebSocket open error: WebSocket error.
WebSocket register error: WebSocket error.
手机端提示这个错误:
Connection error
Room IO error:
java.net.SocketTimeoutException:
connect timed out
——请科学上网。