我的設備是*魚上淘的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 對應
將下載的2個tar文件放到aosp根目錄 解壓, 安裝驅動
# 解壓得到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
# 經歷漫長的等待后, 編譯出鏡像
刷寫鏡像
1. 解鎖
參考 https://www.cnblogs.com/ciml/p/13949911.html
2. 刷寫設備
fastboot flashall -w # -w選項意思wipe data, 會清空手機上的所有數據
# 注意! 此命令需要在剛才編譯源碼的同一終端窗口內執行, 或者執行過lunch的終端中, 否則環境變量中沒有如 $OUT 的變量
刷好設備, 即可體驗原版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系統.