源码准备
要想使用AOSP的源码,为Google Pixel编译镜像,第一步当然是下载AOSP的源码啦(当然开发环境得先搭建好,具体搭建请自行百度),问题是AOSP网站我们是上不去的,就更不用说下载源码了,不过好在我们有清华大学镜像源(https://mirrors.tuna.tsinghua.edu.cn/ ), 具体下载可以参考上面的网址,当然也可以按照我的博客来进行操作。
– 首先是下载repo工具,请下载,并执行chmod a+x repo,为repo添加可执行权限
- 通过mkdir aosp创建文件夹,将repo工具放到soap文件夹下
-
查看下面的tag截图,我们下载Branch为android-8.1.0_r10的源码
-
首先执行
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
,然后在通过./repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r10
完成初始化 -
接下来repo sync就可以了,但是因为考虑到网络的原因,sync的过程中可能会意外断开,我们不可能一直守着看的,所以通过下面的脚本来完成代码的下载。将下面的内容保存为start_repo.sh,然后该脚本执行权限
chmod a+x start_repo.sh
,然后就是等待了,推荐网上睡觉扔在那里下载,第二天就可以用了
1 2 3 4 5 6 7 8 |
#!/bin/bash echo "======start repo sync======" ./repo sync -j4 while [ $? = 1 ]; do echo "======sync failed, re-sync again======" sleep 3 ./repo sync -j4 done |
源码下载完毕了,但是要想适配Google Pixel手机,还需要下载硬件支持包,下载地址如下:
- Google支持包:链接: https://pan.baidu.com/s/1mjbQW6O 密码: tv98
- qcom支持包:链接: https://pan.baidu.com/s/1ggNyp95 密码: 5pg1夹
下载完上面两个压缩包后,解压到aosp所在的文件夹,得到两个shell脚本,分别是extract-google_devices-sailfish.sh 和 extract-qcom-sailfish.sh,分别执行这两个shell脚本,按回车阅读条款,需要注意在最后需要输入 I ACCEPT后才会解压相应的文件。解压后会在更目录下多出一个vendor文件里面有google_devices和qcom文件夹就代表已经解压成功了。
编译
既然源码已经有了,那么接下来就是编译了,编译就相对简单多了:
source build/envsetup.sh
- 然后执行lunch,选择aosp_sailfish-userdebug
- 最后执行
make -j4 2>&1 | tee build.log
userdebug、user和eng版本的区别请自行百度了解啦,这里博主就不展开了。
因为上面-j4表示使用4个线程进行编译,如果CPU支持的线程比较多,可以进行相应的修改,接下来就是漫长的等待了,CPU为I7 4790,使用8个线程进行编译,需要两个小时左右,编译完成后相应的镜像会在out/target/product/sailfish 路径下。
刷机
为了保险期间,建议更新bootloader到相应的版本,如果使用的是r10的源码,可以到:链接: https://pan.baidu.com/s/1smLHWpZ 密码: gmb6 这里下载该版本的bootloader和radio文件。
刷机前,需要特别注意在setting->User & accounts中将Google account remove掉,否则刷完机后会要求登录刷机前的Google账户才允许进入launcher界面。这一点是需要特别注意的。
将下载到的文件解压到任意目录,进入到该目录,将已经开机的手机连到电脑中,执行:
adb reboot bootloader
,如果提示adb或者下面的fastboot没有找到的话,请检查adb或者fastboot的路径有没有包含到环境变量中,如果adb和fastboot都配置好了,但是无论如何都提示没有授权,可以选择执行sudo -i,使用root用户来刷机,当然切换到root用户后,也需要将adb和fastboot的路径配置到root用户的环境变量中- 经过上面一步后,手机现在进入到fastboot模式了,然后执行
./flash-base.sh
即可更行bootloader和radio了 - 然后将路径切换到out/target/product/sailfish下,下面我们刷入其他镜像文件
- 首先是boot.img,执行
fastboot flash boot_a boot.img
和fastboot flash boot_b boot.img
- 接下来是system.img,执行
fastboot flash system system.img
和fastboot flash system_b system_other.img
- 最后是vendor.img,执行
fastboot flash vendor vendor.img
- 当然如果你有自己定义,例如破解电信4G的modem,可以执行
fastboot flash modem modem.img
- 首先是boot.img,执行
- 最后通过fastboot reboot,重启手机
到这里就完成刷机过程了,这个过程中因为没有执行双清,所以可能重启后会有一些其他的问题,例如下面的图片,其实也可以等到重启后出问题了,再到setting中进行factory reset解决。
下面欣赏一下刷完机后的Home Screen吧
也许有的朋友可能会感觉到奇怪,为什么我的截图里面还会有Google套件,例如play store和chrome等,这就是因为前面我没有执行双清的缘故,所以会有这些APP的图标,但是其实就算有图标,其实也是用不了的,点击就会删退,所以还是老老实实在刷机的时候执行fastboot erase cache
和 fastboot erase userdata
吧,如果没有执行,那开机后到setting进行factory reset也行。
编译内核
通过上面的方法编译的镜像中使用的内核是事先已经编译好了的,如果想修改内核相关内容就需要自行下载内核源码进行编译了。我们也是通过清华大学镜像源进行下载啦。进入到源码根目录下的kernel文件夹中执行git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm
,就可以下载到相应msm的内核源码了,进入msm文件夹中,通过git checkout remotes/origin/android-msm-marlin-3.18-oreo-mr1-preview2
获取到源码
下面我们修改内核目录下的Makefile文件,修改内容如下:
1 2 3 4 5 6 7 |
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile -ARCH ?= $(SUBARCH) -CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%) +ARCH ?= arm64 +CROSS_COMPILE ?= aarch64-linux-android- # Architecture as present in compile. |
然后记得在aosp目录上进行source,lunch操作,否则会导致找不到交叉编译链的。首先执行make marlin_defconfig
,得到.config文件后,直接执行make -j4即可。
在编译过程中出现如下错误:
1 2 |
/bin/sh: 1: lz4c: not found arch/arm64/boot/Makefile:36: recipe for target 'arch/arm64/boot/Image.lz4' failed |
显然是lz4c没有找到,应该就是有依赖工具没有安装,通过sudo apt-get install liblz4-tool
安装即可,继续make -j4编译,最后得到arch/arm64/boot/Image.lz4-dtb
将上面编译得到的Image.lz4-deb文件复制到aosp源码目录下的device/google/marlin-kernel路径即可,然后到aosp源码根目录下执行make bootimage
。最后按照前面所写的内容,使用fastboot刷写boot_a和boot_b分区即可。如下截图可以看到kernel是使用jimmy@jimmy的机器编译的
OK,基本的编译内容就到这里了。