AOSP编译安卓8

0x01 下载并同步AOSP源码

中科大镜像源

http://mirrors.ustc.edu.cn/help/aosp.html

image-20230919215216103

使用md5sum验证一个软件包是否损坏。

安装好git之后需要配置一下用户名和邮箱,这里其实可以随便填不需要真的有用

1
2
$ git config --global user.email hbxjyzx@sina.com
$ git config --global user.name "Red256"

然后配置一下repo工具

1
2
3
4
5
6
7
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'

还要创建一个python的软链接,编译系统要求python版本在3.5以上

1
sudo ln -s /usr/bin/python3.8 /usr/bin/python

然后就可以使用init来同步指定版本的安卓源码了

1
2
3
4
5
6
7
8
9
10
11
12
13
#切换到aosp目录下,去执行以下指令
$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.1.0_r1
repo: reusing existing repo client checkout in /home/red256/Desktop/AOSP/aosp
.repo/manifests/: discarding 682 commits

Testing colorized output (for 'repo diff', 'repo status'):
black red green yellow blue magenta cyan white
bold dim ul reverse
Enable color display in this user account (y/N)? y

repo has been initialized in /home/red256/Desktop/AOSP/aosp
#看到这个显示了就可以执行以下指令来进行同步了
$ repo sync

获取到详细安卓版本的网站:https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn

image-20230920232044326

需要安装openjdk8

1
sudo apt install openjdk-8-jdk

这里建议直接使用AOSP中的openjdk,在~/.bashrc文件中添加以下的内容

1
2
export JAVA_HOME=/root/aosp/prebuilts/jdk/jdk8/linux-x86/ 
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin

添加依赖参考:https://source.android.com/docs/setup/build/initializing?hl=zh-cn

1
sudo apt-get install git-core gnupg flex bison build-essential zip zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig ninja-build curl

然后还得需要下载好手机对应的驱动相关的东西,这里我使用的是Nexus5x,最后支持的是android-8.1.0_r52版本的安卓代码,于是我先切换一下代码。之后需要下载一个驱动,这里我下载好了,在这个网站:https://developers.google.com/android/drivers?hl=zh-cn

image-20230921003915439

需要将该压缩包移动到aosp目录下,然后解压出来

image-20230921005208645

解压出来是两个sh脚本,执行就可以了

image-20230922222204226

判断手机对应的内核是否存在,访问链接:https://source.android.google.cn/docs/setup/build/building-kernels?hl=zh-cn,如果没有的话,需要另外下载或者编译了。

image-20230921004153638

开始编译源码,首先要导出一点点环境变量

1
2
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
export LC_ALL=C

然后这里才开始编译

1
2
3
4
5
make clobber
source build/envsetup.sh #导出一些环境变量
lunch #选择机型
#增加编译产品选项,修改aosp/device/google/marlin/AndroidProducts.mk
make -j8

就开始编译,需要经过很长的时间才能完成编译

image-20230922232638010

tips:这里我编译的是android8的版本,要注意将python的版本换成python2.7的。

finally,编译成功了,去out/target/product/bullhead文件夹就可以找到编译出来的成果。

image-20230923181008539

0x02 刷机

先去google下载刷机包:

https://developers.google.com/android/images?hl=zh-cn#bullhead

image-20230923182430920

下载好并解压之后是这样子的

image-20230923183234511

然后其中比较关键需要修改的是这个image-xxx.zip中的文件,可以看到这里存在的都是很多img文件,这个是google的成品系统,而AOSP其实是半成品,我们要将我们自己编译的img文件覆盖掉这4个img文件。

image-20230923185441884

首先将该zip包解压出来,然后删除所有的img文件,然后将我们编译好的img文件都拷贝进来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ > 7z x image-bullhead-opm1.171019.011.zip -oimage-bullhead-opm1.171019.011
$ > cd image-bullhead-opm1.171019.011/
$ > rm *.img
$ > cp ~/Desktop/aosp/out/target/product/bullhead/*.img .
$ > ll
total 1395244
drwx------ 2 red256 red256 4096 9月 23 22:24 ./
drwxr-x--- 3 red256 red256 4096 9月 23 22:22 ../
-rw-r--r-- 1 red256 red256 101 1月 1 2009 android-info.txt
-rw-rw-r-- 1 red256 red256 12072232 9月 23 22:24 boot.img
-rw-r--r-- 1 red256 red256 5824660 9月 23 22:24 cache.img
-rw-rw-r-- 1 red256 red256 1236169 9月 23 22:24 ramdisk.img
-rw-rw-r-- 1 red256 red256 7014805 9月 23 22:24 ramdisk-recovery.img
-rw-rw-r-- 1 red256 red256 17851692 9月 23 22:24 recovery.img
-rw-rw-r-- 1 red256 red256 1045118324 9月 23 22:24 system.img
-rw-r--r-- 1 red256 red256 149605164 9月 23 22:24 userdata.img
-rw-r----- 1 red256 red256 189980260 9月 23 22:24 vendor.img
$ > zip -r image-bullhead-opm1.171019.011.zip *
$ > mv image-bullhead-opm1.171019.011.zip ../
#将adb导出到环境变量里,尽量使用AOSP自带的,apt-get安装的可能会有BUG
$ > export PATH=~/Desktop/aosp/out/host/linux-x86/bin:$PATH

然后将手机设置到fastboot模式中

1
2
3
$ > adb reboot bootloader
$ > fastboot devices
$ > ./flash-all.sh

终于成功刷入了,截个图纪念一下

image-20230923230024200

0x03 疑难杂症

AOSP无法联网

解:使用adb执行:adb shell settings put global captive_portal_mode 0

参考链接:

https://blog.seeflower.dev/archives/12/

https://reao.io/19

https://blog.seeflower.dev/archives/12/

https://bbs.kanxue.com/thread-277361.htm

https://blog.csdn.net/qq23001186/article/details/122438294