ubuntu/mac android aosp源码编译遇到的坑

兵马未动粮草先行 先熟悉你要准备的东西

// 源码下载地址,使用官方的下载就好。我司网络自带梯子,没梯子的可以用国内镜像,我喜欢官方的方式,比较直接少走弯路
https://source.android.com/source/downloading?hl=zh-cn

//源代码标记和细分版本 根据设备查看支持的android版本分支有哪些
https://source.android.google.cn/source/build-numbers#source-code-tags-and-builds

//选择设备编译系统 根据设备选择  "编译配置" lunch 那一步会用到
https://source.android.google.cn/source/running#selecting-device-build

//下载驱动 解压到源码根目录 (对应驱动查看请参考下边的 lunch 这一步)
//执行下载的sh驱动脚本,同意授权 最后输入 "I ACCEPT"
https://developers.google.cn/android/drivers

正常的编译流程(一路绿灯的情况下,可惜我的每个步骤都不顺利,踩了不少坑。。。如果一切顺利的话也就不会有这篇文章了/(ㄒoㄒ)/~~)

重点是第三步  重点是第三步  重点是第三步
1: make clobber //清除缓存
2: source build/envsetup.sh  //添加依赖
3: lunch     //选择序号,我的nexus6p选择24 。angler, 注意:输入好序号以后,回车,看结果。要仔细看下PRODUCT是否是自己想要的,再根据BUILD_ID 去下载驱动 解压到源码根目录,执行驱动先授权同意以后。再输入第四步的make命令
4: make -j12 //开12个线程,查看逻辑cpu个数 cat /proc/cpuinfo |grep "processor"|wc -l                  

安装一些所需的环境(非必须)

//这一步骤 是安装所需的一些环境,可以先不用安装 如果出问题了,再安装,避免安装一些用不到的软件,放在这里的目的是有备无患

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt-get install libssl-dev

错误问题整理

一、BFD: libncurses.so.5: cannot open shared object file: No such file or directory


1.sudo apt install apt-file 

2.sudo apt-file update

3.sudo apt-file find libncurses.so.5

4.sudo apt install libncurses5

二、 build/core/main.mk:21: recipe for target 'run_soong_ui' failed make:[run_soong_ui] Error 1
或者
ninja: build stopped: subcommand failed.ninja failed with: exit status 1

# 步骤1   ***这两行非常重要。如果出现问题一定要先试试这两行命令设置***
setopt shwordsplit 
export LC_ALL=C //去除所有本地化的设置,让命令能正确执行。 

## 如果不行,继续下一步问题排查,这个一般不会出现端口问题,以防万一先检查,没有被占用,直接进入步骤3
# 步骤2
1:查看端口是否被占用 
netstat -ap | grep 8076 //默认是8076和8077,检查这两个
//如果占用直接修改 $HOME/.jack-setting  $HOME/.jack-server/config.properties  源码dir/build/envsetup.sh 
***修改后保证这三个文件里边的端口保持一致***


# 步骤3
Jack server already installed in "$HOME/.jack-server"
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/wujing/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
No Jack server running. Try 'jack-admin start-server'
No Jack server running. Try 'jack-admin start-server'
[ 18% 11296/61548] cc out/soong/.intermediates/external/vixl/libvixl-arm/linux_x86_static/obj/external/vixl/src/aarch32/disasm-aarch32.o
ninja: build stopped: subcommand failed.
11:25:40 ninja failed with: exit status 1
make: *** [build/core/main.mk:21: run_soong_ui] Error 1

# 这个错误,就按照提示做
1.jack-diagnose //查看有没报错信息

# 然后是编译停 继续编译 ,服务停了,继续开启服务,如此反复好几次(本以为每次中断重新开启,每次都是增量编译,来个几次又何妨,结果到90%左右这个方式就不好使了,无奈找新的解决方案)
2.jack-admin start-server //手动开启服务,我是单开一个窗口开启服务的

如果反复还是不行,就另辟蹊径使用终极方案吧

终极方案一

vim 打开/etc/java-8-openjdk/security/java.security 
全局搜索找到TLSv1这行,把TLSv1, TLSv1.1,这两个变量删除后保存
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA,
  
重新打开服务即可
jack-admin kill-serve
jack-admin start-serve

如果终极方案一还不行,算了,别太为难自己,把电脑摔了吧(开玩笑啦。。。)

终极方案二 终结者

//禁用jack 编译方式,编译速度稍微慢一些,总比不能编译好

make ANDROID_COMPILE_WITH_JACK=false -j12 

//PS:本人终极方案一 解决了,这个没有尝试。不过理论上是可以的,因为肯定不会报make相关的编译问题了。(可能会有其他的小坑) 

以上是编译aosp问题总结
========================分割线==========================

刷机篇

在启动时按住相应的组合键或使用以下命令使设备进入 fastboot 模式:

adb reboot bootloader
在设备处于 fastboot 模式后,运行以下命令:

fastboot flashall -w
-w 选项会清除设备上的 /data 分区;该选项在您第一次刷写特定设备时非常有用,但在其他情况下则没必要使用。

注意:在 Motorola Xoom 上通过 fastboot 创建的文件系统无法发挥最佳作用。
建议您使用 $ adb reboot recovery 命令通过恢复功能来重新创建文件系统。
在执行恢复操作时,打开菜单(同时按电源键和音量调高键),擦除缓存分区,然后擦除数据。
如果出现 fastboot: error: ANDROID_PRODUCT_OUT not set错误

直接在命令行中设置临时变量就行

export ANDROID_PRODUCT_OUT=编译生成的绝对路径   

我的编译生成路径是 home/UserName/source/android8.0/out/target/product/angler
PS: /out/target/product/这个是自动生成的公共目录
    /angler 是根据不同的手机生成的特定rom的目录,这块根据自己的手机选择相应的目录

以上是刷机问题总结
========================分割线==========================

开启多线程加快,加快编译速度

总核数 = 物理CPU个数 X 每颗物理CPU的核数\
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l   //我的是1 就一个cpu,没啥说的,公司的统一配置 Intel® Core™ i7-8700 CPU @ 3.20GHz × 12 

查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq   //我的是6核心

查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l  //我的是12

查看线程总数
grep 'processor' /proc/cpuinfo | sort -u | wc -l  //我的是12

总结:
我的线程总数和逻辑cpu个数一样都是 12, 编译时我一般用 -j24,为了电脑不太卡还能干其他活,我用-j12
我的内存条是32G的,开12个线程,基本不卡

参考文献

参考1:stack overflow

参考2:Android源码下载(可编译)

Jack server 错误问题解决办法

你可能感兴趣的:(ubuntu/mac android aosp源码编译遇到的坑)