编译AOSP源码, 定制Android系统
环境搭建
参考文献
-
准备系统
下载并安装
Ubuntu 16.4 LTS -
更换国内镜像源(可选)
打开
software & updates,选择最佳镜像源,随后close->reload->install->reboot. -
更新软件
$ sudo apt-get update -
安装
openjdk$ sudo apt-get install openjdk-8-jdkJDK支持的版本:Android 7.0 (Nougat) – Android 8.0 (Oreo):
Ubuntu:OpenJDK 8
Mac OS X:JDK 8u45 或更高版本Android **5.x **(Lollipop) – Android 6.0 (Marshmallow):
Ubuntu:OpenJDK 7
Mac OS X:jdk-7u71-macosx-x64.dmgAndroid 2.3.x (Gingerbread) – Android 4.4.x (KitKat):
Ubuntu:Java JDK 6
Mac OS X:Java JDK 6Android 1.5 (Cupcake) – Android 2.2.x (Froyo):
Ubuntu:Java JDK 5 -
安装依赖包
$ sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig -
如需使用 SELinux 工具进行策略分析,您还需要安装
python-networkx软件包$ sudo apt-get install python-networkx -
如果您使用的是 LDAP 并且希望运行 ART 主机测试,还需要安装
libnss-sss:i386软件包。$ sudo apt-get install libnss-sss:i386 -
开启缓存(可选)
开启缓存后, 当再次编译时, 只需编译改动过的对应模块即可, 会节省很多时间.
-
安装
ccache$ sudo apt-get install ccache -
在
home主目录的.bashrc中加入:export USE_CCACHE=1 -
指定缓存目录,也需要在
.bashrc中加入,默认为当前用户目录下的.ccacheexport CCACHE_DIR=/home/fejq/.ccache -
在修改了~/.bashrc 后记得source 下,或者直接重启虚拟机,不然刚刚添加的变量不会生效。
$ source ~/.bashrc -
配置缓存最大小,这个参数保存在
CCACHE_DIR所在的目录# 配置缓存最大小 $ ccache -M 100G -
查看缓存状态
$ ccache -s
-
下载源码
参考文献
-
安装
Repo-
确保主目录
/home下有一个 bin/ 目录,并且该目录包含在路径中$ mkdir ~/bin # 添加bin目录到环境变量 $ PATH=~/bin:$PATH # 打印环境变量 $ echo $PATH -
下载
Repo工具,并确保它可执行curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo可能需要更改DNS:
sudo gedit /etc/network/interfaces在末尾追加:
dns-nameservers 8.8.8.8 -
初始化仓库
初始化仓库:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest如果提示无法连接到 gerrit.googlesource.com,请参照git-repo的帮助页面的更新一节。
如果需要某个特定的 Android 版本(列表):
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.0.0_r35 -
同步源码树
repo sync同步过程受网络状况影响,在同步过程中可能会出现错误,卡住不动等现象,此时,皆可由手动重新执行
repo sync命令来解决,亦可通过以下脚本来自动执行新建脚本
repo-sync.sh当出现错误而导致同步停止时,重新开始同步
#!/bin/bash echo "======= start repo sync =======" # 进入同步目录(之前执行了repo init的目录) cd ~/AOSP/android-8.0.0_r35 repo sync -j4 while [ $? == 1 ]; do echo "====== sync failed! re-sync again =====" sleep 3 repo sync -j4当同步卡住不动时,重新开始同步
安装网络监测工具
ifstatsudo apt-get install ifstat运行脚本
#!/bin/bash #杀掉repo sync进程 kill_reposync() { PID=`ps aux |grep python|grep [r]epo |awk '{print $2}'` [[ -n $PID ]] && kill $PID } #启动reposync进程 start_reposync() { repo sync & } #重启reposync进程 restart_sync() { kill_reposync start_reposync } #网络检测相关阈值 th_net_value="30" #实际检测,repo sync卡住时,网卡入口数据小于10 th_retry_times=100 #低于网络检测阈值次数限制 ((count_low=0)) restart_sync while [[ 1 ]]; do # 用ifstat检测网速 cur_speed=`ifstat 1 1 | tail -n 1 | awk '{print $1}'` result=$(echo "$cur_speed < $th_net_value" | bc) if [[ $result == "1" ]]; then ((count_low++)) else ((count_low=0)) fi if ((count_low > th_retry_times)); then ((count_low=0)) echo "restart repo sync" restart_sync fi done参考:
关于使用repo时repo init和repo sync失败的一个解决方案
最后, 需保证下载的源码,有对应的驱动支持
如:
Nexus 5X
有对Android 7.1.1的驱动支持,代号为NMF26F`:Nexus 5X binaries for Android 7.1.1 (NMF26F)搜索
build号为NMF26F的源码版本,可以找到android-7.1.1_r1,即该版本的源码有对Nexus 5X的支持
也可通过以下连接来下载对应的源码:
链接:https://pan.baidu.com/s/1sB0Z684n4OBxp5eTDOfJog
提取码:9l4c -
开始编译
-
清理
$ make clobber -
设置环境
$ source build/envsetup.sh -
选择目标
$ lunch$ lunch product_name-build_variant # eg:lunch aosp_bullhead-eng -
开始编译
$ time make -j4
问题
-
08:48:52 ckati failed with: signal: killed build/core/main.mk:21: recipe for target 'run_soong_ui' failed make: *** [run_soong_ui] Error 1解决方案:在make之前调用
export LC_ALL=C

浙公网安备 33010602011771号