前言

前几天我已经刷了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

编译具体可以看之前的两篇文章:

这里补充几个内容

下载设备树

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 发布!