前言
前幾天我已經刷了Lineageos21(一加七Pro刷lineageos21(kernelsu+gapps)),但是體驗下來有兩個很嚴重的bug:無法接打電話,沒有聲音。
收簡訊倒是很正常,但電話打進來只會顯示號碼,不會顯示接聽介面(對方那邊顯示正在通話中,也就是結束通話了),撥打電話會顯示已結束。
測試發現是刷了kernelsu核心導致的,如果只是刷gapps使用正常,所以想自己編譯一個kernelsu試試。
MicroG
下載地址: https://github.com/FriendlyNeighborhoodShane/MinMicroG_releases/releases
正好又在酷安看到這個可以替代gapps的東西,在酷安搜尋沐浴森林客
這個人,他有幾篇關於MicroG的安裝和使用說的很詳細。
相比於gapps的優點:
- 開源
- 省電
- 簡潔,可以只安裝gapps裡面某個APP
安裝方式
- 作為magisk/kernelsu外掛刷入
- 在recovery模式下刷入
- 刷入帶有MicroG的系統
這裡為了方便我直接選擇第三種,MicroG專門為lineage建立了一個專案(LineageOS for microG)①,將microg直接內建在系統刷機包裡。這個專案也是開源的:https://github.com/lineageos4microg/lineageos4microg.github.io
,裡面還提供了docker映象用於編譯。
microg需要依賴簽名欺騙(Signature Spoofing
),因為microg提供的元件和谷歌官方的APP簽名不一樣,這樣就無法過谷歌的驗證。
而lineage官方拒絕加入該補丁②, 所以microG組織只能自己另開一個專案。 另外,其他一些支援簽名欺騙的ROM:https://github.com/microg/GmsCore/wiki/Signature-Spoofing
如果不想重新刷系統,可以用一個叫FakeGApps③的xposed外掛達到同樣的效果。使用看後面
LineageOS for microG
去官網下載刷機包刷入即可,步驟和官方的lineage是一樣的,而且也提供了很多裝置的刷機包。
kernelsu
編譯具體可以看之前的兩篇文章:
- 為一加七Pro(LineageOs17.1 4.14核心版本)編譯KernelSu
- wsl2-ubuntu20編譯Lineage17(Android10)
這裡補充幾個內容
下載裝置樹
breakfast guacamole
下載裝置樹提示失敗(只有Lineageos21才需要自己下載,之前的版本都會自動下載),原因應該是下面的提示:
那隻能自己去github下載了,首先在官方倉庫(https://github.com/LineageOS
)裡搜尋guacamole
可以知道一加七Pro的倉庫是android_device_oneplus_guacamole
下載到指定的目錄裡:
git clone https://github.com/LineageOS/android_device_oneplus_guacamole -b lineage-21 device/oneplus/guacamole
根據倉庫裡的lineage.dependencies
檔案可以知道還需要另一個倉庫:
git clone https://github.com/LineageOS/android_device_oneplus_sm8150-common -b lineage-21 device/oneplus/sm8150-common
[
{
"repository": "android_device_oneplus_sm8150-common",
"target_path": "device/oneplus/sm8150-common"
}
]
以此類推把剩下的倉庫也下載了:
git clone https://github.com/LineageOS/android_hardware_oplus -b lineage-21 hardware/oplus
git clone https://github.com/LineageOS/android_kernel_oneplus_sm8150 -b lineage-21 kernel/oneplus/sm8150
提取blob
溫馨提示:有時候從刷機包裡提取會有一些檔案說不存在,這個時候試試從已安裝的手機利用adb提取。 我在Lineage21從刷機包裡提取沒問題,但是Lineage20很多檔案不存在,用adb提取正常
官方文件: https://wiki.lineageos.org/extracting_blobs_from_zips#extracting-proprietary-blobs-from-payload-based-otas
首先假設當前路徑就是lineage原始碼的根路徑,接著執行以下步驟:
mkdir system_dump/
cd system_dump/
安裝依賴:
sudo apt-get install python3-protobuf
下載對應的工具(此時在system_dump
目錄):
git clone https://github.com/LineageOS/android_prebuilts_extract-tools android/prebuilts/extract-tools
git clone https://github.com/LineageOS/android_tools_extract-utils android/tools/extract-utils
git clone https://github.com/LineageOS/android_system_update_engine android/system/update_engine
然後去官網下載最新的刷機包解壓:
unzip lineage-*.zip
提取payload.bin裡的img檔案
./android/prebuilts/extract-tools/linux-x86/bin/ota_extractor --payload ./payload.bin
掛載img檔案,後面三個檔案不存在,可以不執行
mkdir system/
sudo mount -o ro system.img system/
sudo mount -o ro vendor.img system/vendor/
sudo mount -o ro odm.img system/odm/
sudo mount -o ro product.img system/product/
sudo mount -o ro system_ext.img system/system_ext/
接著cd到裝置的根路徑,提取檔案:
pwd
看一下當前絕對路徑
cd ../device/oneplus/guacamole/
./extract-files.sh 上面看到的絕對路徑
也就是system_dump
返回原始碼根路徑,解除安裝並刪除多餘檔案
sudo umount -R system_dump/system/
rm -rf system_dump/
從adb裝置提取blob
連線adb,在device/oneplus/guacamole/
下執行./extract-files.sh
就會提取。
如果從刷機包提取有很多失敗,就可以用這種方式,需要先在手機刷入相應的系統。
編譯核心
source build/envsetup.sh
breakfast guacamole
make bootimage
然後就能看到核心檔案,刷入手機依舊是老問題,無法接打電話,沒有聲音。翻了下issue,沒有人提出這個問題,難道只有一加七Pro這個裝置存在這個問題。
本來順便編譯下系統,但是不透過,也沒顯示錯誤,只看到一堆警告,就沒再試了。
排查原因
因為之前使用Lineageos17+kernelsu沒問題,為了進一步確認是新系統還是新版本kernelsu的問題,我又試了kernelsu之前的版本,還是一樣,一刷就沒聲音。
那感覺是Lineageos21和kernelsu存在相容問題,我又去測試了Lineageos20
降級Lineageos20(Android13)
直接在recovery刷的話會顯示denying OTA because it's SPL downgrade
,需要重新刷一遍dtbo.img、vbmeta.img和 boot.img。
如果沒有這三個檔案,可以看上面提取blob的方法用ota_extractor提取img。
降級到Lineageos20沒出現沒聲音和無法接打電話的情況,那就是Lineageos21和kernelsu不相容的問題了。不過在Lineageos20剛開始開啟kernelsu管理器看沒生效,當我第二天打算繼續降級到Lineageos19.1的時候,開啟管理器一看又生效了,也是奇怪,重啟又沒了。
核心使用github的和自己編譯的都有這種情況,只能繼續降級到Lineageos19.1了。
降級Lineageos19.1(Android12)
也是一樣的問題,編譯核心時下載的原始碼kernelsu版本換成v0.9.4(11838)
就可以了,看來是0.9.5就開始加入了不支援gki裝置的程式碼。
刷機
最後就選擇了Lineageos19.1+kernelsu v0.9.4(11838),然後開始刷microg
microg
https://github.com/FriendlyNeighborhoodShane/MinMicroG_releases/releases
選MinMicroG-Minimal-2.12.0-20230729205934.zip
或MinMicroG-MinimalIAP-2.12.0-20230729205917.zip
,後者就多個了谷歌商店。
我在kernelsu作為模組刷入失敗,所以在recovery刷入,輸完重啟開啟執行adb shell npem
給microg授權一些許可權,因為我發現有兩個許可權在介面授權沒響應。
ZygiskNext
https://github.com/Dr-TSNG/ZygiskNext/releases
刷這個是因為需要安裝lsposed,下載zip在kernelsu管理器作為模組刷入
lsposed
https://github.com/mywalkb/LSPosed_mod
下載LSPosed-v1.9.3_mod-7244-zygisk-release.zip
作為模組刷入
FakeGApps
https://github.com/whew-inc/FakeGApps/releases
下載安裝,然後在lsposed啟用勾選系統框架,重啟就會看到microg設定的自我檢查->簽名偽裝支援生效了,然後把其他未勾選的許可權勾選上就可以,這個時候開啟microg的自我檢查應該全部都勾選了
safetynet-fix
https://github.com/Displax/safetynet-fix/releases/tag/v2.3.1-MOD_3.0
下載後作為模組刷入,用於透過safetynet驗證。
Shamiko
https://github.com/LSPosed/LSPosed.github.io/releases
下載後作為模組刷入,這個是為了隱藏Zygisk注入痕跡的,如果沒安裝lsposed,就不需要用它來隱藏
Hide-My-Applist
https://github.com/Dr-TSNG/Hide-My-Applist
在lsposed裡啟用,用來隱藏root有關的應用的
測試
然後在microg設定裡新增谷歌賬號->註冊裝置->開啟雲端訊息推送->開啟SafetyNet, (這些過程都需要科學)
可以看到safetynet測試都透過了,但是我在谷歌商店下載的一些測試軟體都顯示未透過,不清楚哪裡的問題,遇到了打不開的APP再說。
APP檢測
Momo
沒有檢測到root和lsposed,這幾個就不用管了,一般APP都懶得檢測這些。
Ruru
全部透過檢測
Hunter
這個可能存在shamiko就很牛逼了,不過只是maybe,只要不是很嚴的APP都是疑罪從無。下面幾個就不用看了,APP如果檢測lineage系統的話感覺也不合理。並不是只有逆向人員才用lineage,正常使用者也會使用。
引用連結
https://lineage.microg.org/#
https://review.lineageos.org/c/LineageOS/android_frameworks_base/+/195284
https://github.com/whew-inc/FakeGApps/releases
本文由部落格一文多發平臺 OpenWrite 釋出!