美文网首页
WebRTC-Android编译

WebRTC-Android编译

作者: itcayman | 来源:发表于2020-08-15 12:23 被阅读0次

    一、利用docker的ubantu镜像安装

    1、安装docker,Docker快速入门
    2、下载docker镜像

    docker run --rm -v <WebRTC Android/Linux 代码库的绝对路径>:/webrtc  -it piasy/webrtc-build
    

    上面的piasy/webrtc-build是许建林大神在docker上制作的一个ubantu镜像。
    <WebRTC Android/Linux 代码库的绝对路径>这个括号里的目录是自己电脑上的真实目录,后面的:/webrtc意思是会docker上会有个webrtc目录映射到刚才那个真实目录。以后改真实目录的文件也会体现在docker上的,在docker上改动也会体现在电脑上,非常方便。

    首次执行会下载Docker镜像,需要等会儿。启动成功后,命令行会变成Docker镜像实例的命令行,这个命令行里已经配置好了WebRTC Android/Linux开发所需要的环境了。

    3、更新depot_tools代码

    cd /depot_tools && git pull 
    

    4、务必确保翻墙能力来下载源码

    cd webrtc
    fetch --nohooks webrtc_android
    #上条命令执行完后,可以编辑当前目录下的.gclient文件
    #在taget_os里加上linux,这样这套代码也就可以用于Linux开发了
    

    5、如果中途失败,就执行以下命令gclient sync
    6、执行./build/install-build-deps.sh,这里会下载很多依赖

    二、利用虚拟机的Ubantu安装

    1、安装VMware Workstation
    2、下载Ubantu镜像,选择18.04版本的
    3、利用VMware安装虚拟机,注意:磁盘容量一定要40G以上,因为系统本身就很大,加上源码下载完就要20G,随便就超过30G了。
    4、下载depot_tools

    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
    

    下载完之后需要设置环境变量vi ~/.bashrc,增加以下内容

    export PATH=$PATH:/path/depot_tools  #在当前环境变量追加路径,
    #path是自己的depot_tools文件夹的上级路径
    

    完了,执行source ~/.bashrc,然后执行which gn或者which gclient测试下,有过有内容说明设置成功
    5、务必确保在翻墙环境下载源码

    cd webrtc
    fetch --nohooks webrtc_android
    #上条命令执行完后,可以编辑当前目录下的.gclient文件
    #在taget_os里加上linux,这样这套代码也就可以用于Linux开发了
    

    6、如果中途失败,就执行以下命令gclient sync
    7、执行./build/install-build-deps.sh,这里会下载很多依赖

    四、编译

    1、设置编译参数,生成ninja文件

    gn gen out/build --args='target_os="android" target_cpu="arm" is_debug=false'
    #out/build : 编译生成文件的目录,随意指定
    #target_os : 编译目标平台 android ios 等
    #target_cpu : CPU架构平台 arm arm64 x86 x64等
    i#s_debug : Release模式或者Debug模式
    

    2、编译

    #全量编译
    ninja -C out/build
    #debug编译
    ninja -C out/Debug AppRTCMobile
    

    3、生成aar

    cd webrtc/src
    python tools_webrtc/android/build_aar.py --output "libwebrtc.aar" --arch "armeabi-v7a" "arm64-v8a"
    #成功后你会在src目录下看到libwebrtc.aar文件,里面就是Android开发需要用到的SDK了
    

    4、生成so文件,生成so文件首次会全量编译,后续增量编译速度非常快。如果以后只改C层代码不生成Java或者Object-C的API,这种方法非常适合测试。

    ninja -C out/Debug sdk/android:libjingle_peerconnection_so
    

    五、编译错误锦集

    1、No such file or directory: '/webrtc/src/build/util/LASTCHANGE.committime
    解决方式如下:
    python build/util/lastchange.py build/util/LASTCHANGE
    2、third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory

    ninja: Entering directory `out/ios'
    [1/2732] CXX obj/api/audio_codecs/audio_codecs_api/audio_codec_pair_id.o
    FAILED: obj/api/audio_codecs/audio_codecs_api/audio_codec_pair_id.o 
    ../../third_party/llvm-build/Release+Asserts/bin/clang++ -MMD -MF obj/api/audio_codecs/audio_codecs_api/
    /bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
    ...
    /bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
    ...
    isystem../../buildtools/third_party/libc++abi/trunk/include -fvisibility-inlines-hidden -Wnon-virtual-dtor -Woverloaded-virtual -c ../../api/audio_codecs/ilbc/audio_encoder_ilbc.cc -o obj/api/audio_codecs/ilbc/audio_encoder_ilbc/audio_encoder_ilbc.o
    /bin/sh: ../../third_party/llvm-build/Release+Asserts/bin/clang++: No such file or directory
    ninja: build stopped: subcommand failed.
    

    解决方式如下:
    python src/tools/clang/scripts/update.py

    3、E: Unable to locate package lib32gcc-s1

    E: Unable to locate package lib32gcc-s1
    The following command failed:  apt-get --just-print install libasound2:i386 
    libcap2:i386 libelf-dev:i386 libfontconfig1:i386 libglib2.0-0:i386 libgpm2:i386 
    libncurses5:i386 libnss3:i386 libpango-1.0-0:i386 libpci3:i386 libssl-dev:i386 
    libssl1.0.0:i386 libtinfo-dev:i386 libudev1:i386 libuuid1:i386 libx11-xcb1:i386
     ...
    

    这个是因为之前下载依赖的时候部分失败,解决方式:gclient sync,继续同步下载代码
    4、ld.lld: error: ../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu/libdl.so:1: unknown directive: XSym

    itcayman@ubuntu:~/webrtc/src$ ninja -C out/build sdk/android:libjingle_peerconnection_so 
    ninja: Entering directory `out/build'
    [1/533] LINK clang_x64/protoc
    FAILED: clang_x64/protoc 
    ../../third_party/llvm-build/Release+Asserts/bin/clang++ -Wl,--fatal-warnings -Wl,--build-id -fPIC -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,-z,defs -Wl,--as-needed -fuse-ld=lld -Wl,--icf=all -Wl,--color-diagnostics -m64 -Wl,-O2 -Wl,--gc-sections -rdynamic -nostdlib++ --sysroot=../../build/linux/debian_sid_amd64-sysroot -L../../build/linux/debian_sid_amd64-sysroot/usr/local/lib/x86_64-linux-gnu -L../../build/linux/debian_sid_amd64-sysroot/lib/x86_64-linux-gnu -L../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu -pie -Wl,--disable-new-dtags -Werror -o "clang_x64/protoc" -Wl,--start-group @"clang_x64/protoc.rsp"  -Wl,--end-group  -ldl -lpthread -lrt
    ld.lld: error: ../../build/linux/debian_sid_amd64-sysroot/usr/lib/x86_64-linux-gnu/libdl.so:1: unknown directive: XSym
    >>> XSym
    >>> ^
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    ninja: build stopped: subcommand failed.
    

    这是因为clang链接需要的动态库不对,一般是从硬盘copy WebRTC源码到虚拟机会出现这个问题。解决方案:

    #第一步,删除src/build/linux/debian_sid_amd64-sysroot目录
    rm -rf build/linux/debian_sid_amd64-sysroot
    #第二步,重新下载生成
    build/linux/sysroot_scripts/install-sysroot.py --arch="amd64"
    
    

    5、ERROR at //BUILD.gn:33:17: Can't load input file.

    itcayman@ubuntu:~/webrtc/src$ gn gen out/Debug --args='target_os="android" target_cpu="arm" is_debug=false'
    ERROR at //BUILD.gn:33:17: Can't load input file.
          deps += [ "examples" ]
                    ^---------
    Unable to load:
      /home/itcayman/webrtc/src/examples/BUILD.gn
    I also checked in the secondary tree for:
      /home/itcayman/webrtc/src/build/secondary/examples/BUILD.gn
    
    

    6、gclient sync过程中报错You have unstaged changes.Please commit, stash, or reset.

    Error: 3> 
    3> ____ src/build at a03951acb996e9cea78b4ab575896bf1bfcd9668
    3>  You have unstaged changes.
    3>  Please commit, stash, or reset.
    

    这是因为同步下载依赖的过程中部分文件下载失败,只需要删除掉第一行出现的目录。再次执行gclient sync就行,像上面,只需要执行

    # 第一步,删除对应目录
    rm -rm src/build/
    # 第二步,再次同步下载依赖
    gclient sync
    

    友情提示

    如果编译出现其它错误,一般都会在命令行写出解决方案的,只要执行上面的提示命令一般能解决问题。

    相关文章

      网友评论

          本文标题:WebRTC-Android编译

          本文链接:https://www.haomeiwen.com/subject/prfadktx.html