webrtc ndk的编译 只编译libwebrtc.a

created by 杨金彪

编译脚本Manual Compilation

Manually compile the source code for each particular cpu type.

gn gen out/Debug_x86 --args='is_component_build=false rtc_include_tests=false target_os="android" target_cpu="x86"  treat_warnings_as_errors=false'

for release

gn gen out/Debug_x86 --args='is_debug=false is_component_build=false rtc_include_tests=false target_os="android" target_cpu="x86"  treat_warnings_as_errors=false'

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了

gn gen out/release_arm64 --args='target_os=“android” target_cpu=“arm64” treat_warnings_as_errors=false rtc_include_tests=false ’

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

ninja -C out/Debug sdk/android:libjingle_peerconnection_so
  • To build for ARM64: use target_cpu="arm64"
  • To build for 32-bit x86: use target_cpu="x86"
  • To build for 64-bit x64: use target_cpu="x64"

webrtc examples androidnativeapi

  1. libwebrtc.a
    利用命令:nm -C -g --defined-only libwebrtc.a查看库中包含的符号,你们发现基本所有的API都包含在里面,所以说,它可以作为ndk开发的依赖库。
  2. libjingle_peerconnection_so.so
    利用命令:nm -C -g --defined-only libjingle_peerconnection_so.so查看它所包含的符号,发现很少,而且仅包括类似Java_org_webrtc_xxxxx相关的符号,该库应该是与webrtc java SDK匹配使用的,它并不能作为ndk开发的依赖库。

2、gradle 构建文件生成
Android studio 项目是依赖gradle进行构建编译的,在上面步骤编译出来的项目并没有gradle依赖文件,因此还需要进行编译生成

build/android/gradle/generate_gradle.py --output-directory $PWD/out/myWebRTC \
--target "//webrtc/examples:AppRTCMobile" --use-gradle-process-resources \
--split-projects
不编译android libjingle.so进行的修改

在这里插入图片描述

书上例子的资源

Building a video conference using SimpleWebRTC
Creating an application using RTCMultiConnection
Developing a simple WebRTC chat using PeerJS
Making a simple video chat with rtc.io
Using OpenTok to create a WebRTC application
Creating a multiuser conference using WebRTCO

编译安卓可能需要安装的库Preparing the system

First of all, you need to install the necessary system packages:
sudo apt-get install git git-svn subversion g++ pkg-config gtk±2.0
libnss3-dev libudev-dev ant gcc-multilib lib32z1 lib32stdc++6

1.6 was able to build the demo successfully.
1.Download the Oracle JDK from its home page at http://www.oracle.com/
technetwork/java/javase/downloads/index.html.
In case there is no download link on such an old JDK, you can try another URL:
http://www.oracle.com/technetwork/java/javasebusiness/
downloads/java-archive-downloads-javase6-419409.html.

gn gen out/linux --args=¡®is_debug=false target_os=¡°linux¡± target_cpu=¡°x64¡± treat_warnings_as_errors=false is_component_build=false is_clang=false rtc_include_tests=false rtc_use_h264=true rtc_enable_protobuf=false use_rtti=true use_custom_libcxx=false treat_warnings_as_errors=false use_ozone=true rtc_build_ssl=false rtc_ssl_root="/home/yang/code/openssl-1.0.2t"¡¯ --ide=qtcreator

来自书本webrtc book cook的编译方法

After you’ve prepared the environment and installed the necessary system components and
packages, you can continue to build the demo application:

  1. Prepare Android-specific build dependencies:
    cd ~/dev/trunk
    source ./build/android/envsetup.sh
  2. Configure the build scripts:
    export GYP_DEFINES="$GYP_DEFINES build_with_libjingle=1 build_
    with_chromium=0 libjingle_java=1 OS=android"
    gclient runhooks
  3. Build the WebRTC code with the demo application:
    ninja -C out/Debug -j 5 AppRTCDemo
    After the last command, you can find the compiled Android packet with the demo application
    at ~/dev/trunk/out/Debug/AppRTCDemo-debug.apk.

头文件的提取

find webrtc -name "*.h" | xargs -I {} cp --parents {} <path to store headers>

Using Android Studio

Note: This is known to be broken at the moment. See bug: https://bugs.webrtc.org/9282

  1. Build the project normally (out/Debug should be the directory you used when generating the build files using GN):

    ninja -C out/Debug AppRTCMobile
    
  2. Generate the project files:

    build/android/gradle/generate_gradle.py --output-directory $PWD/out/Debug \
    
    
    
    --target "//examples:AppRTCMobile" --use-gradle-process-resources \
    
    
    
    --split-projects --canary
    
  3. Import the project in Android Studio. (Do not just open it.) The project is located in out/Debug/gradle. If asked which SDK to use, choose to use Android Studio’s SDK. When asked whether to use the Gradle wrapper, press “OK”.

  4. Ensure target webrtc > examples > AppRTCMobile is selected and press Run. AppRTCMobile should now start on the device.

If you do any changes to the C++ code, you have to compile the project using ninja after the changes (see step 1).

Note: Only “arm” is supported as the target_cpu when using Android Studio. This still allows you to run the application on 64-bit ARM devices. x86-based devices are not supported right now.

android studio  使用库里的webrtc的配置
implementation 'org.webrtc:google-webrtc:1.0.32006'
(Android NDK r21b)的下载路径

https://dl.google.com/android/repository/android-ndk-r21b-windows-x86_64.zip
https://dl.google.com/android/repository/android-ndk-r21b-darwin-x86_64.zip
https://dl.google.com/android/repository/android-ndk-r21b-linux-x86_64.zip

cmakelist库的配置

默认情况下,cmake 会输出 4 种 ABI(“armeabi-v7a” , “arm64-v8a”, “x86”, “x86_64”),如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J6l80IIa-1605776095921)(android-sdk.assets/20190829165130477.png)]

android链接小技巧

android在链接时会依赖库的链接顺序,如果你觉得这样很难搞清楚先后顺序,可以试一下把所有静态库.a合并为一个大的整体库liball.a,在同一个库中的.o文件是没有顺序问题的。****

声网的下载 gclinet sync步骤出现

curl: (7) Failed to connect to chrome-infra-packages.appspot.com port 443: Connection timed out

解决方法:

export DEPOT_TOOLS_UPDATE=0

sudo apt install libc6-dev-i386

sudo apt install gcc-multilib gcc-8-multilib linux-libc-dev

安装编译需要依赖的工具
$ cd /webrtc/src
$ ./build/install-build-deps.sh
$ ./build/install-build-deps-android.sh
123

需要注意webrtc需要使用jdk 8 编译,ubuntu 16 默认安装jdk 8,如果使用ubuntu 14需要自己手动安装;

编译webrtc aar库文件
$ sudo ./tools_webrtc/android/build_aar.py

libpci3:i386 libx11-xcb1:i386 linux-libc-dev:i386 apache2-bin binutils binutils-aarch64-linux-gnu binutils-arm-linux-gnueabihf binutils-mips64el-linux-gnuabi64 binutils-mipsel-linux-gnu bison bzip2 cdbs curl dbus-x11 devscripts dpkg-dev elfutils fakeroot flex g+±8-multilib git-core gperf lib32gcc1 lib32stdc++6 libapache2-mod-php7.3 libappindicator3-1 libappindicator3-dev libasound2 libasound2-dev libatk1.0-0 libatspi2.0-0 libatspi2.0-dev libbluetooth-dev libbrlapi0.6 libbrlapi-dev libbz2-1.0 libbz2-dev libc6 libc6-dev libc6-i386 libcairo2 libcairo2-dev libcap2 libcap-dev libcups2 libcups2-dev libcurl4-gnutls-dev libdrm2 libdrm-dev libelf-dev libevdev2 libevdev-dev libexpat1 libffi6 libffi-dev libfontconfig1 libfreetype6 libgbm1 libgbm-dev libglib2.0-0 libglib2.0-dev libglu1-mesa-dev libgnome-keyring0 libgnome-keyring-dev libgtk-3-0 libgtk-3-dev libinput10 libinput-dev libjpeg-dev libkrb5-dev libnspr4 libnspr4-dev libnss3 libnss3-dev libpam0g libpam0g-dev libpango1.0-0 libpci3 libpci-dev libpcre3 libpixman-1-0 libpng16-16 libpulse0 libpulse-dev libsctp-dev libspeechd2 libspeechd-dev libsqlite3-0 libsqlite3-dev libssl-dev libstdc++6 libudev1 libudev-dev libuuid1 libvulkan1 libvulkan-dev libwayland-egl1-mesa libwww-perl libx11-6 libx11-xcb1 libxau6 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxdmcp6 libxext6 libxfixes3 libxi6 libxinerama1 libxkbcommon-dev libxrandr2 libxrender1 libxslt1-dev libxss-dev libxt-dev libxtst6 libxtst-dev locales openbox p7zip patch perl php7.3-cgi pkg-config python python-crypto python-dev python-numpy python-openssl python-psutil python-yaml rpm ruby subversion uuid-dev wdiff x11-utils xcompmgr xz-utils zip zlib1g

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mk0GrzcS-1605776095923)(android-sdk.assets/image-20201109112922757.png)]

The WebRTC Java binding enables Java access to the native WebRTC library which itself provides WebRTC support. The Tyrus websocket client enables the websocket access required to communicate with WebRTC Session Controller. Finally, the SLF4J logging library enables you to plug in a logging framework of your choice to create persistent log files for application monitoring and troubleshooting.

webrtc封装sdk(五)编译webrtc android遇到的问题

按照官方的编译步骤就可以编译出android版本的各个静态库libxxx.a
当我们使用这些静态库,并且还需要编译自己写的那些c++代码时,可能会遇到以下两个问题

  • 自己本地的android ndk和webrtc内部使用的ndk版本不同
  • ndk版本相同但是stl的libc++库类型不同,如llvm-libc++,gnustl,stlport等

以上两个问题会导致如下类型的链接错误:

undefined reference to 'std::__ndk1::locale::~locale()'
undefined reference to 'std::__ndk1::ctype<char>::id'
undefined reference to 'std::__ndk1::ios_base::clear(unsigned int)'
undefined reference to 'std::__ndk1::ios_base::getloc() const'
1234

如果需要查找到底哪个libstdc++.a含有这写符号,可以ndk目录下批量nm|grep一下看看。

下面讲解一下如何解决上面两个问题。

1、和webrtc使用相同版本的ndk

仔细阅读webrtc源码中的文件build/config/android/config.gni,可以发现webrtc默认使用的ndk版本和sdk版本为r12b:

    if (!defined(default_android_ndk_root)) {
    default_android_ndk_root = "//third_party/android_tools/ndk"
    default_android_ndk_version = "r12b"
    default_android_ndk_major_version = 12
  } else {
    assert(defined(default_android_ndk_version))
    assert(defined(default_android_ndk_major_version))
  }
12345678

并且可以发现webrtc使用的是llvm-libc++类型的c++库为:

android_libcpp_root = "$android_ndk_root/sources/cxx-stl/llvm-libc++"
1

我们根据这个版本去下载一个同样版本的ndk: https://dl.google.com/android/repository/android-ndk-r12-darwin-x86_64.zip
安装到系统或者直接使用webrtc中的ndk。

进入ndk目录,并且执行以下命令创建standalone toolchain,重点关注参数–stl=libc++

参数也可以取其它值,可以阅读以下make-standalone-toolchain.sh脚本的内容。

./build/tools/make-standalone-toolchain.sh --platform=android-16 \
--install-dir=./my-android-toolchain --stl=libc++
12

把生成的my-android-toolchain拷贝到~/my-android-toolchain,
这样就生成了和webrtc相同版本的ndk
##2、使用llvm-libc++类型的toolchain编译自己的代码

我们使用cmake>=3.7.2版本和上一步生成的~/my-android-toolchain
就可以很简单的编译我们自己项目的android版本

cmake_minimum_required(VERSION 3.7)
project(webrtc_test)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic -std=c++11")
include_directories(${PROJECT_SOURCE_DIR} "./include/")
FILE(GLOB SOURCE
"./*.cc")
add_library(webrtc_test ${SOURCE})
12345678

使用如下命令来运行cmake:

cmake -DCMAKE_SYSTEM_NAME=Android \
-DCMAKE_ANDROID_STANDALONE_TOOLCHAIN=~/my-android-toolchain \
-DCMAKE_BUILD_TYPE=Debug .. 
cmake --build .
1234

这样就完成了android sdk的编译,怎么样很简单吧?

注意这里一定要是用cmake 3.7.2的版本,因为低版本不支持DCMAKE_ANDROID_STANDALONE_TOOLCHAIN参数
目前测试cmake 3.8无法编译通过,所以推荐使用cmake 3.7.2

有的朋友以前可能会使用一个开源项目叫做android-cmake来编译android
里面有一个toolchain配置文件android.toolchain.cmake
但是目前这个文件只支持ndk版本小于等于r10d的版本
在高版本ndk中由于ndk目录结构发生改变,无法再使用android.toolchain.cmake文件了
所以建议大家以后放弃使用android.toolchain.cmake文件,而直接使用系统安装的cmake+standalone-toolchain即可。

3、android链接小技巧

android在链接时会依赖库的链接顺序,如果你觉得这样很难搞清楚先后顺序,可以试一下把所有静态库.a合并为一个大的整体库liball.a,在同一个库中的.o文件是没有顺序问题的。

(本文基于webrtc branch55编写,在macos 10.12上测试)

关键词:webrtc android 编译 webrtc链接

背景:

在janus视频网关下进行音视频会议开发已经有一定的时间了,pc,android,ios都处于打磨产品的阶段了,基本的功能都已经实现了。
为了让我们的产品往更好的方向走,更加通用,我们决定出开发一套sdk,在pc,android,ios下跨平台。

编译的艰辛:

虽然我可以在linux和windows下都能够进行开发,
但是第一次在android平台下进行ndk的开发,这里经历的困难,血和泪也只有我自己清楚。

步骤:

1、第一步编译出android下的libwebrtc.a(具体webrtc在android下编译,大家自己网上搜索),开始我们的webrtc代码是m74版本。
2、编译链接库,在m74版本链接库的时候就出现了出现了各种链接不上std::_1,
因为第一次在ndk下开发,不会怀疑别人的问题更何况是google,更多考虑的是自己的问题,所以,修改各种配置。大约经历一天一夜之后,我也开始怀疑谷歌了,翻墙各种搜索,
https://groups.google.com/forum/#!topic/discuss-webrtc/o-zDdrq09yk
下发现,m74确实存在问题,后来在其他人的提示下,我们退回到72版本,是稳定版本,果然问题解决了。
3、写测试,demo我们也简单的写了几个例子通过了。
但是问题又来了,在关键的函数CreatePeerConnectionFactory函数时奔溃了,于是我们又上网搜索,回退版本,还是一样。
4、经历了各种艰辛搜索,android studio 打出日志,check g_jvm failed,才醒悟过来发现jvm未初始化,主要还是对java和android开发不清楚,对这样的描述不是特别敏感
不像写c++那样当出现link 2001,2019 这些错误的时候,能想到具体是哪里的问题。于是初始化 webrtc::JVM::Initialize,还没完,运行还是会报错:如未发现org.webrtc等文件,发现是要导入jar,
后来索性导入libwebrtc.jar ,
5、运行成功。

最后在这里和各位小伙伴分享一下在android studio下编译libwebrtc.a 和应用,后续肯定还会有其他的问题,也希望有其他小伙伴和我一起来完成这任务。
也感谢在这期间给我帮助的小伙伴。

以下的是三年的博客=========

-DANDROID_STL=c++_static 使用 libc++ runtime,否则编译时会报一大堆 undefined reference 错误(完整报错见附录,详细解释见后文);

选择 runtime 版本

安卓系统默认只提供了一个非常简单的 C++ 运行时环境:system。它不包含 STL、异常、RTTI 等特性,那我们的代码里面就不能使用这些特性,例如不能使用 std::string 或者 std::vector,不能使用 try-catch,不能使用 typeid 操作符。不过好在 NDK 提供了其他辅助的运行时环境,它们能提供不同的 STL 实现,异常和 RTTI 支持。

  • system:最基本的 C++ 运行时;
  • gabi++_static/gabi++_shared:GAbi++ 运行时,包括异常、RTTI 支持;
  • stlport_static/stlport_shared:STLport 运行时,包括异常、RTTI、STLport 的 STL 实现;
  • gnustl_static/gnustl_shared:GNU STL 运行时,包括异常、RTTI、GNU STL 的实现;
  • c++_static/c++_shared:LLVM libc++ 运行时,包括异常、RTTI、LLVM libc++ 的 STL 实现;

如何选择运行时环境,主要考虑两个问题:哪个 STL 实现?静态还是动态?

选择哪个 STL 实现,可以参考以下方面:

  • 是否活跃维护:STLport 已经好几年没有更新了,source forge 上面最新版本还是 14 年 7 月的版本;
  • License:GNU STL 使用 GPLv3 许可,这可是“病毒许可”,小公司也许可以无所谓,人家根本不会注意到你,但大公司就要小心了;
  • libc++ 虽然有将它们都取而代之的雄心壮志,但仍不够稳定
  • 最后但也同样重要的:编译依赖库时能统一为哪一 STL;

由于我们这里并不追求极致的稳定性,当然更主要还是因为 WebRTC 是用 libc++ 编译的,所以我选用了 libc++ 这一运行时环境。前面就已经提到,我们必须使用 libc++ runtime,否则会报一大堆 undefined reference 错误,这是因为各个运行时库的二进制接口并不兼容,编译的时候混用 STL 实现,很容易遇到 undefined reference 错误。

链接静态依赖库(英文里叫做 link against)时,会把库中的目标文件打包到自己的库里面来,这样就可以不带着依赖库了,但如果我们有多个库都依赖了同一个库,那链接静态依赖库就会导致同样的目标文件被包含了多份,这样既占用了磁盘空间,也会占用运行时内存,而且 C++ 运行时库如果同时存在多份,可能会导致各种诡异的问题。此外,我们使用的依赖库可能别的程序也使用了(尤其是 C++ 运行时库),而如果操作系统中运行的多个程序如果要加载同一个动态库,那实际上只会加载一份,所以链接动态依赖库还有可能减少整个系统的内存占用。

最后,依赖库可以动态与静态混用,只要编译使用的 STL 一致即可,而 C++ 运行时库其实也是我们的依赖库,因此我们使用静态还是动态版本,与其他依赖库没有直接关系,即使用 c++_shared 或者 c++_static 与其他的依赖库没有直接关系。

交叉编译安卓平台可用的库

很多开源项目提供的都是利用 Autotools 构建,即 ./autogen.sh && ./configure && make install 的方式,但这样编出来的库目标平台并不是安卓,无法直接用于 NDK 开发。如果直接使用这样编出来的静态库,编译时可能会报错 no archive symbol table (run ranlib)

因此我们需要交叉编译到安卓目标平台,NDK 为我们提供了 make_standalone_toolchain.py 工具,可以创建 standalone toolchain,然后我们在 configure 和 make 时使用我们创建的 toolchain 即可。其中最关键的一步就是环境变量的设置(把创建好的 toolchain 目录加入到 PATH 中,且确保环境变量中正确设置 CCCXX 等)。

五、编译错误锦集

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

友情提示

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

You could also run ‘git status’ to see if the directory is in the correct state. If there is a lot of weird stuff going on there, you could clean that whole directory, and in third_party/android_tools then run:

$ git clean -xfd

If the commit in that repository is wrong you could try running these commands:

$ gclient sync

$ build/install-build-deps-android.sh

$ gclient runhooks

Finally gooleplay download the software, select y.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值