渣男最近想了解一些安卓方面的東西, 於是就想著整理一個系列出來.
玩安卓嘛, 刷機自然是要做的第一件事, 但是這種教程網上一搜一大堆, 但還是想著整理一下吧, 畢竟我是一隻小菜雞.
名詞解釋 AOSPAOSP, 全稱 Android Open Source Project, 也就是android源碼的簡稱, 使用git管理, 直接編譯aosp後得到的android系統就叫原生android.AOSP 託管在谷歌的伺服器上, 國內有提供清華源下載.
鏡像 - image常見的鏡像名稱有:Factory Images(工廠鏡像)、OTA Image(升級包)、ROM 包(廠商包)
Factory Images(工廠鏡像)
顧名思義, 就是手機出廠時安裝的系統鏡像.
Google親兒子, Nexus和Pixel系列適配的工廠鏡像
下載連結:https://developers.google.com/android/images#angler
OTA Image(升級包)
OTA, over-the-air, 在線下載的意思;OTA Image, 即是工廠鏡像在經過時間累積的更新包,主要升級基礎作業系統、系統分區上安裝的只讀應用或時區規則.
OTA Image 分為 差量(Incremental OTA )升級 和 全量(Full OTA)升級, 全量包在Google有下載連結(https://developers.google.com/android/ota)
簡單提一下A/B系統更新, 即在OTA升級過程中使用的一種無縫更新手段, 在磁碟上開闢A/B存儲空間, 從而在OTA更新期間不會打斷用戶 和 失敗回滾
Driver Binaries(驅動)
開放不開源的安卓, 把驅動放在了HAL(硬體抽象)層, 具體實現由廠商向處理, 從而實現開源和商業化完美結合.
這也就是不同的安卓手機為什麼不能隨便刷來刷去的原因.當然於Google親兒子系列來講:驅動自然是有的搞, Nexus 6P以前Google有專門提供驅動的二進位文件(https://developers.google.com/android/drivers), 後續驅動則需要從工廠鏡像中分離vendor.img, 再放入構建的AOSP生成自定義ROM.
如果不考慮從AOSP構建原生安卓的話, 那麼驅動的問題不是我們考慮的內容.
ROM 包(廠商包)
現在對於ROM包就很好理解了, 無非就是廠商在保證安卓框架不變的情況下自定義了部分安卓驅動, 加入了一些私有元素得到的安卓鏡像文件.
當然對於非兒子系列手機, 也不是不能編譯AOSP刷入手機, 可以下載手機型號對應的CM(Cyanogenmod團隊的簡稱)源碼進行編譯, 具體流程 百度一下.
代號安卓代號
安卓代號是依據字母表排列的, 常見的安卓代號和Windows磁碟命名一樣, 沒有A/B(沒見過不代表不存在哦), 從Android1.0開始, 以吃的命名Cupcake(紙杯蛋糕)、Donut(甜甜圈)、Eclair(閃電泡芙)、Froyo(優格冰淇淋)、Gingerbread(薑餅)、Honeycomb(蜂巢)[來源請求]、Ice Cream Sandwich(冰淇淋三明治)、Jelly Bean(果凍豆)、KitKat(奇巧巧克力)、Lollipop(棒棒糖)、Marshmallow(棉花糖)、Nougat(牛軋糖)、Oreo(奧利奧)、Pie(派), 但從 Android10 也就是Android Q 開始 便沒有這種命名方式了.
API 級別
API 級別, 是Android 平臺版本提供的框架 API 修訂版, 利用它和底層 Android 系統進行交互, 每個 Android 版本正好對應於一個 API 級別.
如:
名稱代號版本API級別Android 8Oreo8.026SDK/NDK
簡單說,
SDK(sortware development kit, 軟體開發工具包)是 安卓app開發使用的api(java層);
NDK(Native Development Kit)是 安卓app支持C開發的開端(SO, 底層)
編譯代號
AOSP源碼每個版本都有一個編譯代號,例如:官網提供(https://source.android.com/source/build-numbers.html#source-code-tags-and-builds)分支號android-7.1.2_r12, 7.1.2 是大版本號,r12是小版本號, 編譯代號則是N2G47W
編譯代號分支號版本支持的親兒子N2G47Wandroid-7.1.2_r12NougatNexus 5X、Nexus 6P、Pixel C兒子代號
Google親兒子系列手機代號名稱,如:
Nexus 6P 對應代號 angler
Pixel 5 對應代號 redfin
命令fastboot命令含義fastboot devices顯示連接的 Android 設備的序列號fastboot oem/flashing unlock解開 bootloader 鎖(舊設備是oem, Nexus5以後是flashing)fastboot oem/flashing lock恢復 bootloader 鎖(同上)fastboot flash [filename]在 bootloader 模式中向設備刷入文件Recovery安卓中的Recovery是指手機的 Recovery Mode(恢復模式,俗稱工廠模式)。這是一種可以對安卓手機內部的數據或系統進行修改的模式。Recovery 的定位類似 PC 平臺的 WinPE,在這個模式下我們可以刷入新的 ROM 包,或者對已有的系統進行備份或升級,也可以在此恢復出廠設置。
官方的(手機出廠自帶的) Recovery 做了限制,無法刷入第三方的 ROM 包(刷機包),因此一般我們要先刷入第三方的 Recovery( 大名鼎鼎的 twrp ),以解除限制和獲得更多功能。
刷機基本刷機
網上教程很多, 就不過多介紹了.
adb reboot bootloader, 重啟手機至bootloader解壓鏡像, 執行flash-all腳本即可(原生或廠商rom到這 就已經刷機完畢了)..root (nexus 6P, android 8)
下載twrp 官網提供的angler Recovery 鏡像(https://dl.twrp.me/angler/);下載新版 Magisk(https://github.com/topjohnwu/Magisk/releases)到手機sd卡目錄adb reboot bootloader, 重啟至bootloader.fastboot flash recovery twrp.img執行完上一步, 別重啟, 否則會恢復到原來的狀態.. 按住音量鍵, 選擇Recover MOde 啟動 TWRP, 此時twrp會修補ROM, 防止恢復可能遇到的問題 fastboot: error: Couldn't parse partition size '0x'.剛遇到這個問題我也沒看懂.. 簡單查了一下, 說是沒區分清楚AB區..
文章1(https://gitlab.e.foundation/e/backlog/-/issues/1636/), 解決方法使用命令, but 沒用
# switch a/b slot
fastboot getvar current-slot
fastboot --set-active=a
fastboot flash boot_a boot.img最終解決方案, (忘記在哪裡了, 沒留下連結
fastboot flash bootloader bootloader-angler-angler-03.79.img
fastboot reboot-bootloader
sleep 5
fastboot flash radio radio-angler-angler-03.87.img
fastboot reboot-bootloader
sleep 5
#fastboot -w update image-angler-opm6.171019.030.h1.zip
fastboot flash vendor vendor.img
fastboot reboot-bootloader
sleep 5
fastboot flash system system.img
fastboot flash:raw boot boot.img // 重點是這裡.
fastboot flash recovery recovery.img
https問題(時區)現象: 剛裝完連接好wifi後, 網頁打不開, 提示https危險;應用也打不開, 提示網絡錯誤.. 等等
由於是原生鏡像的問題, 連接的是Google的伺服器, 在初始化設置時沒有獲得時區設置,導致 https 時間戳 不正確, 從而連不上網..
解決方案: 修改時間即可
chmod問題現象: 已有root權限 在執行chmod時提示Operation not permitted, 可能 是在操作 system分區, 則需將system 分區掛載為可讀可寫..
解決方案, 操作步驟:
1、mount ;獲取system的掛載點,如/dev/block/mmcblk0p43 /system
angler:/ # mount | grep system
輸出
/dev/block/mmcblk0p43 on /system type ext4 (ro,seclabel,relatime,inode_readahead_blks=8)
/sbin/.magisk/block/system on /sbin/.magisk/mirror/system type ext4 (ro,seclabel,relatime,inode_readahead_blks=8)
...2、mount -o remount -rw /dev/block/mmcblk0p43 ;通過mount命令重新掛載根目錄修改讀寫權權限, (system的掛載點)
3、此時, chmod 便有修改system裡面文件的的權限
4、關於android 中的remount, 居然沒有--help列印,記錄一下:
mount -o remount -rw /system
mount -o remount,rw /system
總結 應該是 史上 最不正經的安卓刷機教程 了, 主要是 安卓刷機 也太大眾了;由於新公眾號 不能在文章直接留言, so, 如果有需要或有問題, 可直接發送內容到公眾號即可;