编译AOSP并刷入Pixel设备
我的设备是*鱼上淘的Pixel 2, 2015年之后的设备刷写步骤基本一致(Pixel 2XL, Pixel 3, Pixel 3XL, Pixel 4)
上一篇博客讲了如何下载编译AOSP, 但只能编译出模拟器版本, 缺少厂商驱动(没有vendor目录), 不能用来刷机, 因此首先要下载厂商驱动
下载驱动
https://developers.google.com/android/drivers 包含AOSP非master分支Nexus and Pixel设备的驱动. 这里我们下载 驱动 与上篇提到的分支 android-8.1.0_r35 对应
查看代码版本方法: https://source.android.com/docs/setup/about/build-numbers#source-code-tags-and-builds
或者看看日志
cd .repo/manifests
git log
将下载的2个tar文件放到aosp根目录 解压, 安装驱动
# 解压
tar xf qcom-walleye-opm2.171026.006.g1-04505987.tgz
tar xf google_devices-walleye-opm2.171026.006.g1-6e1b64f9.tgz
# 解压得到2个sh自释放文件 extract-google_devices-walleye.sh extract-qcom-walleye.sh # 安装 sh extract-google_devices-walleye.sh sh extract-qcom-walleye.sh # 看完license输入 I ACCEPT 安装完成, 此时ls会看到vendor文件夹
重新编译AOSP
source build/envsetup.sh
lunch aosp_walleye-userdebug
# 这次想日志看全点
make -j$(nproc) > make.log.txt 2>&1 &
tail -f make.log.txt
# 经历漫长的等待后, 编译出镜像
刷写镜像
1. 解锁
参考 https://www.cnblogs.com/ciml/p/13949911.html
2. 刷写设备
adb reboot bootloader
fastboot flashall -w # -w选项意思wipe data, 会清空手机上的所有数据
# 注意! 此命令需要在刚才编译源码的同一终端窗口内执行, 或者执行过lunch的终端中, 否则环境变量中没有如 $ANDROID_PRODUCT_OUT 的变量
# 当然也可手动赋值 ANDROID_PRODUCT_OUT变量指向最终的编译输出目录 <your-aosp-path>/out/target/product/walleye
刷好设备, 即可体验原版Android系统了, 但原版系统连上WiFi后, 总是提示网络连接不可用
为啥嗫-因为原版系统的网络探针访问的是Google的服务器,不够科xue的网络肯定是连不上了. 这个WiFi图标让人很不爽,下面我们来改点东西修复它.
修改Captive Portal Server
打开 vim frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java 可以看到如下两行代码
// Default configuration values for captive portal detection probes. private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204"; private static final String DEFAULT_HTTP_URL = "http://connectivitycheck.gstatic.com/generate_204";
这就是AOSP默认的检测网络是否畅通的探针地址, AOSP默认使用https (如果你没有通过adb修改的话)
现在修改为如下:
// https://captive.v2ex.co/generate_204 is also acceptable
// 这里我们改为小米的, V2EX的也可以, 我测试这里小米的快一点 private static final String DEFAULT_HTTPS_URL = "https://connect.rom.miui.com/generate_204"; private static final String DEFAULT_HTTP_URL = "http://connect.rom.miui.com/generate_204";
重新编译, 生成亲的系统镜像, 因为framework位于system.img, 所以这里我们单独刷system分区就可以.
# 重新编译, 成功后 可见类似输出
[ 99% 615/616] Install system fs image: out/target/product/walleye/system.img
out/target/product/walleye/system.img+ maxsize=2740531200 blocksize=135168 total=1077064032 reserve=27709440
[100% 616/616] Target vbmeta image: out/target/product/walleye/vbmeta.img
单刷system分区
fastboot flash system system.img fastboot flash system_a system_other.img fastboot set_active b # 将slot b设为启动分区 fastboot reboot
由于Android8之后采用A/B更新, 所以有2套分区, 刷分区方式和以往不同, 参考: https://wertherzhang.com/android8-partiton-table/
补充一下: 一般修改framework目录的代码, 重新编译单刷system分区即可, 但有时可能会更新到其它分区的镜像, 要以make的最终结果为准, 比如上面我的日志, vbmeta.img镜像也有更新, 则vbmeta.img也要刷入设备, 还有一种方法是到out目录下, 执行 ls -tl 看哪些镜像的修改时间是最新的, 就刷哪些. 如果有漏刷则可能导致无法进入Android系统.