环境准备
操作系统: Ubuntu16.04 + Win10
剩余空间: 200G以上(我是新买了一条240G的Nvme固态来编译)
硬件配置: 16G内存 i7-7700HQ
配置解释: 一开始, 我是用win10自带的Ubuntu16.04, 结果各种bug(编译的时候, 应该跟内核有关, 自带的Ubuntu的内核是高度定制的), 卒; 然后想想用虚拟机, 也是Ubuntu16.04, 又出现各种bug, 也是编译的时候, 卒; 最后很无奈, 买了一条新固态来装双系统, 第一次装的是Ubuntu18.04, 结果编译到98%就跑不下去了...卒; 最后的最后, 才装回16.04, 编译成功了...这一路的艰辛, 恐怕难有人体会.
目标系统: Android9 Pie
目标架构: aosp_arm64-eng
心理准备: 推荐先看0x04 几点注意.
0x00 下载aosp源码
- 下载好每月更新的初始化包:https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar, 并放到要编译的硬盘或文件夹里.
- 在
bash
里运行如下命令:
tar xvf aosp-latest.tar
- 解压之后, 再配好
repo
:
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo #使用tuna的git-repo镜像
chmod a+x ~/bin/repo
- 配好
repo
环境之后, 再修改repo源:vim ~/bin/repo
:
# 将这行
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
# 改为这行
REPO_URL = 'https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
- 开始更新初始化包:
cd aosp # 进入刚刚解压aosp-latest.tar后的aosp目录(该目录有一个.repo)
repo sync
0x01 编译aosp源码
- 安装jdk环境(已装请忽略, 可装最新版, 后面编译看运气):
sudo apt-get update
sudo apt-get install openjdk-8-jdk
- 安装依赖环境(不装的话, 后面编译看运气)
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
或者你可以直接copy一条命令:
sudo apt-get install git ccache automake lzop bison gperf build-essential zip curl zlib1g-dev g++-multilib python-networkx libxml2-utils bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev liblz4-tool make optipng maven libc6-dev linux-libc-dev gcc-multilib g++-5-multilib libssl-dev
- 配置git环境
$ git config --global user.name "github账号"
$ git config --global user.email "github密码"
- 进入到刚刚解压好的
aosp
这个目录, 输入如下命令(一定要注意命令先后顺序):
关于lunch
的对象, 参考如下表格(根据手机型号编译, 如果是emulator, 那就无所谓了), 例如我的是Nexus 6P, 当我进入到fastboot的时候能显示我的代号是:angler
, 所以编译选项就是:aosp_angler-userdebug
.
设备 | 代号 | 编译配置 |
---|---|---|
Pixel XL | marlin | aosp_marlin-userdebug |
Pixel | sailfish | aosp_sailfish-userdebug |
HiKey | hikey | hikey-userdebug |
Nexus 6P | angler | aosp_angler-userdebug |
Nexus 5X | bullhead | aosp_bullhead-userdebug |
Nexus 6 | shamu | aosp_shamu-userdebug |
Nexus Player | fugu | aosp_fugu-userdebug |
Nexus 9 | volantis (flounder) | aosp_flounder-userdebug |
Nexus 5 (GSM/LTE) | hammerhead | aosp_hammerhead-userdebug |
Nexus 7 (WLAN) | razor (flo) | aosp_flo-userdebug |
Nexus 7(移动版) | razorg (deb) | aosp_deb-userdebug |
Nexus 10 | mantaray (manta) | full_manta-userdebug |
Nexus 4 | occam (mako) | full_mako-userdebug |
Nexus 7 (WLAN) | nakasi (grouper) | full_grouper-userdebug |
Nexus 7(移动版) | nakasig (tilapia) | full_tilapia-userdebug |
Galaxy Nexus (GSM/HSPA+) | yakju (maguro) | full_maguro-userdebug |
Galaxy Nexus (Verizon) | mysid (toro) | aosp_toro-userdebug |
Galaxy Nexus(试验版) | mysidspr (toroplus) | aosp_toroplus-userdebug |
Motorola Xoom(美国 WLAN 版) | wingray | full_wingray-userdebug |
Nexus S | soju (crespo) | full_crespo-userdebug |
Nexus S 4G | sojus (crespo4g) | full_crespo4g-userdebug |
source build/envsetup.sh
# 下面的aosp_arm-eng是根据编译的目标机器来编译的, 如果你想考虑其他的, 可以在lunch后tab
lunch aosp_arm64-eng
# 鉴于我的cpu有8个processor, 所有开了8*2=16条线程编译. 查看processor方式: cat /proc/cpuinfo
make -j16
对于lunch的版本解释, 如下:
编译类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
这时候就可以慢慢等着Successful(更有可能是error)出现吧.
0x02 运行系统
ource build/envsetup.sh
# 下面输入你刚刚编译的目标系统架构 我的如下
lunch aosp_arm64-eng
emulator
等等...怎么变成Q版本了 2333
0x03 刷入手机
- 解锁手机(对于谷歌耳机而言)
# 对于新款设备(2015 年及之后发布的设备):
fastboot flashing unlock
# 对于老款设备(2014 年及之前发布的设备):
fastboot oem unlock
- 进入fastboot(也可以在关机状态下, 按住
关机键+音量下键
)
# 在手机正常开机状态下,打开开发者模式,允许adb调试,输入如下命令
adb reboot bootloader
- 开始刷机, 在aosp目录下进入
out/target/product/generic_arm64
:
fastboot flash boot boot.img
fastboot flash recovery recovery.img
fastboot flash system system.img
fastboot flash userdata userdata.img
- 或者在aosp根目录下:
fastboot -w flashall
0x04 几点注意
- 不推荐最新版的Ubuntu(如果你时间很多, 喜欢调error, 那尽情装吧)
- 千万不要在zsh编译, 不然肯定error. (当初就是贪zsh炫酷, 又浪费了很多时间)
- 不推荐在虚拟机/Docker编译aosp, 编译几十上百G的工程, 出个error绝对很容易, 任意一个变量都可能让你调一天都解决不了.
- 网上的教程不要看太多, 容易乱(包括我的), 最好还是跟着官方文档走, 那个比较稳. 如果真要找, 那就找和自己编译的环境一样的高质blog, 不然浪费的是自己的时间.
- 如果硬盘太小, 编译到后面肯定不够容量, 当初我就是因为没有把初始化包删掉(30多G), 导致编译到99%出现了error, 原因就是因为容量不够.
- 编译路径不要含有中文
- 实在解决不了的bug, 可以在评论区一起讨论, 坚持就是胜利, 相信自己坚持就能编译成功.
0x05 关于编译介绍
- 在aosp根目录下,
out
目录是编译之后产生的, 具体介绍如下:
-
out/target/product/[generic]/system
: 其中,[]
表示的目录是根据你lunch
选项生成的, 例如generic_arm64
表示生成的是arm
架构的64问系统. -
out/target/product/generic/system/apk
: Android系统自带的apk文件 -
out/target/product/generic/system/bin
: 一些可执行文件(比如C编译的执行) -
out/target/product/generic/system/lib
: 动态链接库; -
out/targer/product/generic/system/lib/hw
: 硬件抽象层文件
- 模块编译:
当在aosp根目录下执行了source build/envsetup.sh
之后, 生成了一系列可执行的命令, 如下:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
command -help
可以查看这些命令的具体用法mmm
命令是用来编译指定目录的所有模块的mm
命令是用来编译当前目录的所有模块的
- 编译
framework
# 先在framework/base目录下执行
mmm core/res/ # 生成framework-res.apk
# 然后再返回aosp目录,单独编译framework
mmm frameworks/base
编译好模块后,还要重新打包一下system.img
文件(重打包命令如下),这样我们把system.img运行在模拟器上时,就可以看到我们的程序了。
make snod
0x06 aosp相关推荐
安装sublime(破解版): https://www.yejinmo.com/sublime-text-3-3103/
AS Sublime风格主题:https://github.com/OtaK/jetbrains-monokai-sublime
aosp源码打包下载: https://android.googlesource.com/?format=HTML
aosp源码在线阅读: http://androidxref.com/
安卓进阶, 几种通信方式: https://blog.csdn.net/u011240877/article/details/72863432
学习Java很棒的网站(有在线Java IDE可以用案例): https://www.geeksforgeeks.org
0x07 编译相关推荐
https://blog.csdn.net/fuchaosz/article/details/51487585
https://blog.csdn.net/lyb2518/article/details/77072792
https://blog.csdn.net/tyyj90/article/details/53443913
https://blog.csdn.net/litefish/article/details/51864248
官方教程:
下载: https://source.android.com/setup/build/requirements
编译: https://source.android.com/setup/build/requirements
0x08 几个错误修复
1. repo sync错误: error: .repo/manifests/contains uncommitted changes
cd .repo/manifests
git stash
git clean -f -d
还是不行. 试用如下命令(也是在manifests目录下)
git config core.filemode false