最近入手一个pixel7,想着刷个userdebug版本,就不用模拟器调试开发了,结果按照网上的教程,每次刷机后都是卡在goole logo界面,卡了一天多我才找到问题所在,想着记录下,给自己做个备份。
1. 前期准备:
pixel型号: pixel7;
准备刷入版本:Android 15.0.0 (BP1A.250305.019)
2. 代码下载:
代码下载可参考:ubuntu下载和编译Android源码
不过我后面根据这个重新下载代码的时候有点问题,应该是ubuntu版本更新导致的一些依赖库的问题,具体问题不记得了,不过可以根据第一部安装依赖项的时候的报错,去搜索解决方案,问chatgpt可以直接解决。
重点来了,首先下载代码时确定需要分支,这里需要查询对应关系,不同的分支支持的设备不同,我们用的pixel7,所以就用最新的分支,对应关系查询链接:
在表格中可见,android-15.0.0_r20支持的设备中有pixel7,所以repo init的时候采用下面的指令:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-15.0.0_r20
repo sync -j32
代码同步完成之后,还需要下载对应的驱动,首先得查表,根据对应关系,查找pixel7(代号panther)的BP1A.250305.019 该buildId对应的驱动是下图第一个。这里可能链接点不开,我把我下的文件放在附件中,需要的自取,也可以参考这个,不过,亲测没用,最好的办法就是换台电脑,就是这么神奇,我的笔记本就没问题。
下载完成得到压缩包,解压后得到一个.sh文件,将其放入代码的根目录:
执行脚本,中间需要回车确认,并阅读协议之后输入 I ACCEPT。
./extract-google_devices-panther.sh
3. 编译代码:
代码下载完成后,需要进行编译:
source build/envsetup.sh
lunch aosp_panther-bp1a-userdebug
make -j32
这里需要注意lunch的参数,网上一大堆博客都没验证就乱写了,都写lunch aosp_panther-userdebug,简直是捣乱来的,我lunch参数这么写,一刷机就卡goole logo界面,这里参数的含义是以 - 为分隔符,aosp_panther代表的是设备,panther是pixel7的代号,然后bp1a代表的是我们下载的版本代码的buildId中前缀部分,如图1中第一列的内容,然后userdebug版本是我们版本的类型,因为希望能够push编译的jar包,所以需要userdebug版本,此版本性能较差,所以用的时候可能会有卡顿。当然也可以选择其他版本型号:
user 权限受限;适用于生产环境
userdebug 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng 具有额外调试工具的开发配置
4. 刷写版本:
先进入fastboot界面:
能开机的前提下:
adb reboot bootloader
fastboot flashing unlock
终端输出下面内容时,表示成功
如国目前不能正常开机,那就长按电源键,直到关机,再长按电源+音量下键,进入fastboot即可。
接下来就是刷入版本:
fastboot flashall -w
好了,接下来静等开机即可。
5. 验证push jar包:
为了验证userdebug版本是否成功,先随便找一个地方加上log,然后编译,这里修改ActivityRecord.java,为了方便就在onFirstWindowDrawn处加一个日志点,这样只要每个activity的第一帧绘制完成后就会有日志输出。
在代码根目录执行:
make services -j32
cd out/target/product/panther/system/framework/
adb root #root设备
adb remount
adb reboot #刷机后第一次root需要重启
adb root
adb remount
adb shell umount -l system/framework #授权向该目录push文件
adb push services.jar system/framework/
adb shell stop && adb shell start
好了,点击一个应用启动,可以看到日志打印:
从日志可以看出,这里启动的是相册。