一加七Pro刷Lineageos21(kernelsu+MicroG)

Python成长路發表於2024-06-07

前言

前幾天我已經刷了Lineageos21(一加七Pro刷lineageos21(kernelsu+gapps)),但是體驗下來有兩個很嚴重的bug:無法接打電話,沒有聲音。

收簡訊倒是很正常,但電話打進來只會顯示號碼,不會顯示接聽介面(對方那邊顯示正在通話中,也就是結束通話了),撥打電話會顯示已結束。

測試發現是刷了kernelsu核心導致的,如果只是刷gapps使用正常,所以想自己編譯一個kernelsu試試。

MicroG

下載地址: https://github.com/FriendlyNeighborhoodShane/MinMicroG_releases/releases

正好又在酷安看到這個可以替代gapps的東西,在酷安搜尋沐浴森林客這個人,他有幾篇關於MicroG的安裝和使用說的很詳細。

相比於gapps的優點:

  • 開源
  • 省電
  • 簡潔,可以只安裝gapps裡面某個APP

安裝方式

  1. 作為magisk/kernelsu外掛刷入
  2. 在recovery模式下刷入
  3. 刷入帶有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.zipMinMicroG-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,正常使用者也會使用。

引用連結

  1. https://lineage.microg.org/#
  2. https://review.lineageos.org/c/LineageOS/android_frameworks_base/+/195284
  3. https://github.com/whew-inc/FakeGApps/releases

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章