升级系统之救砖记录

50天前 · 分享 · 123次阅读

设备:红米某型号手机

往事

大约是去年8月底,当时手机自带的应用商店总【com.xiaomi.market】是能在不经意间被唤起,即使已经冻结。

而且曾经印象中(确信)遇到过两次APP不知道什么时候就更了版本,然后发现应用商店有被使用。但是又不记得自己不小心点开过。。大概是应用商店被唤醒后,又是WIFI状态下,就自己升级了。

之前的处理是关闭数据网络的访问权限,加入冻结列表,能做的限制都上了,不过还是时不时能收到通知,一看是应用商店的。

于是强行用adb卸载了,最开始用的命令还卸载不了,最后搜到一个命令才干掉。

不过重启手机发现不开机了,现象就是卡米。

卡米这个词之前也是了解过的,不过一直认为是刷机包有问题才会导致,没想到卸载自带的APP也会影响。。

解决方案后来也找到了,和网络上的方案大同小异,总之就是修改处理services.jar然后去掉相关的代码,关键词checkSystemSelfProtection

我的情况不太一样的地方是,这个时候我已经无法正常开机了,当前使用的系统版本也不太清楚,好在是解锁了的,所以可以用twrp。

还有就是我手机的services.jar就是个空的,所以操作是基于services.vdex来做的。这个时候的系统是Android 9,一直没有升级系统。

下面是之前的救砖步骤:

- twrp提取/system/framework/oat/arm64/services.vdex
- twrp提取/system/framework/services.jar
- 用vdexExtractor转换services.vdex转换为dex
- dex转smali
- 修改smali去除checkSystemSelfProtection处的检查语句,smali最好保留`.line xxx`
- 回编译为dex,拖入前面提取的services.jar内得到新的services.jar
- 删除系统中的/system/framework/oat/arm64/services.vdex
- 删除系统中的/system/framework/oat/arm64/services.odex
- 不要删系统的/system/framework/oat/arm64/services.art
- psuh修改好的services.jar到/system/framework/services.jar
- 完成以上操作后重启,手机正常开机

事故

周六的时候,起的很晚,写了几行代码之后没什么心情了,于是准备升级下手机系统,毕竟现在主流基本都是Android 11了,加上低版本系统在隐私防护上确实不给力,容易被绕过,高版本总归是好一些的。

加上手机root后就没升级过了,是时候来个大更新了,升级时确实考虑过了变砖的可能性,当时是这样想的:

  • 如果系统OTA,那么应用商店应当是会再次被安装上的,即使我已经卸载过了,它确实仍然在系统中,即/system分区下。并且在/data/system/packages.xml这个配置文件中确实能查到应用商店的信息。

于是最终决定直接OTA,通过系统设置下载的OTA包在/sdcard/downloaded_rom下面,不过文件没了,记得是一个Android 10的版本。

然后重启后一直卡米,最开始我在想,毕竟是大更新,升级久一点也正常,直到长时间卡米出现第二次自动重启,我意识到出问题了。

这个时候最后面出现的logcat信息是:

  • cnss-daemon: terminate: 1Could not terminate loop in 2 seconds! Some bug???

这个错误提示在去年那一次也出现过,不过这回我还没有意识到是卸载了应用商店导致的。

然后我在想,会不会是因为应用商店没有覆盖成功,于是我又下载了最新版的OTA包,系统版本是Android 11,心想怎么也应该是能覆盖掉了。(毕竟services.jar都更新了)

后续都是利用临时刷入twrp做的修改,因为不知道如果永久刷入是不是会有影响。

再次卡米,我意识到确实是应用商店的原因,于是我自然就想到之前的处理方式,直接修改services.jar就行了。

这个时候系统提取到的services.jar是一个完整的jar包,而vdex只有几百k,odex文件比较大,测试都是在修改services.jar基础上进行的(vdex无法解,odex也没有找到好的方案解包)。

不过这一次很不幸,经过反复测试,无论是怎么修改,只要修改或者删除了下面任意文件之一,手机重启后会直接陷入无限重启之中

  • /system/framework/services.jar
  • /system/framework/oat/arm64/services.art
  • /system/framework/oat/arm64/services.odex
  • /system/framework/oat/arm64/services.vdex

起初测试不小心把services.art也删掉了,因为之前查到的信息中都没有提到这个文件,并且之前是在没有删除这个文件的情况下恢复的,我还以为是删除了这个文件导致的。

于是进行了反复测试,发现不管改哪个都会出现无限重启。

并且还有一个不一样的现象,那就是我直接push文件覆盖/system分区文件,或者先复制到/data分区再cp或者mv,都会出现no space left on device,只能删掉无关紧要的文件。

我推测这个错误提示以及无限重启的原因有两个

  • 新版本系统包带来的限制,有额外检查,比如分区实际占用的大小是不是变化了
  • 由于系统没有正确启动过,于是出现上面的情况。
  • 假设刷了OTA包后系统重启成功过,那么修改services.jar并删除vdex和odex后,再重启应该会进行dex2oat才对

总之,修改services.jar的方案这种情况下行不通。当然这一切的最终解决方案是直接重刷工厂镜像(Factory Image),但这需要备份数据,这个过程很漫长,并且还原也很头痛。。

救砖

经过一波分析之后,我知道问题所在了。/system一般情况下是只读分区,即使是刷OTA包,那在启动后也是无法修改的,系统要检查相关的状态,以及变更状态,只能是把数据放在/data分区,至于/vender分区那肯定不是。

是的,关于系统中所有APP的状态,权限等待记录信息,都保存在/data/system下的xml,最为人熟知的是/data/system/packages.xml

然后我根据关键词market找到这样的日志:

2022-03-27T11:15:58.png

根据connot find system app定位到services.jar中具体代码位置

2022-03-27T11:16:58.png

2022-03-27T11:21:17.png

由于修改services.jar的路子行不通,但是都这样了,怎么说都要升级系统,实在不行就备份数据,三清重刷。。

现在的思路改为,让系统恢复应用商店安装了的状态,这样不用修改/system下的东西,也省事。。至于后面怎么限制应用商店后面再说,毕竟手机用不了简直寸步难行。。

前面我说到过,虽然卸载了应用商店,但是它的配置还在这个文件里。然后经历了下面的分析:

<package name="com.xiaomi.market" codePath="/system/app/MiuiSuperMarket" nativeLibraryPath="/system/app/MiuiSuperMarket/lib" primaryCpuAbi="arm64-v8a" publicFlags="941112901" privateFlags="-1408235504" ft="11e8f7d4c00" it="11e8dc5d800" ut="11e8f7d4c00" version="40004227" userId="10103" isOrphaned="true">
  1. 其中路径/system/app/MiuiSuperMarket好像和其他的应用不太一样,其他都是在/system/priv-app下,是不是因为这个路径不对。然后确定了下应用商店就是这个路径,所以这个猜测是错误的。priv-app代表的是预装。这么看应用商店等级更高一点。
  2. /data/system/overlays.xml文件中没有com.xiaomi.market的配置,但是检查分析了下里面的其他应用,似乎没有关联,并且网上没有找到这个文件相关的说明,这个猜测跳过验证。
  3. /data/system/miui-packages.xml这个文件太小了,也不太可能是,跳过验证。
  4. package-cstats.list,这个文件里面确实没有com.xiaomi.market相关的配置,在一篇PMS相关的文件中有提到,结合分析也和APP的安装状态无关。

文件内容示例:

PACKAGE_MANAGER__COMPILER_STATS__1
com.homelink.android
-base.apk:10510
com.android.printspooler
-PrintSpooler.apk:898
com.google.ar.core
-base.apk:1710
  1. preinstall.list,这个文件也没有com.xiaomi.market相关的配置,里面是包名+版本号,但添加配置后测试还是无法开机

文件内容示例:

com.android.email:901907
com.eg.android.AlipayGphone:131
com.miui.userguide:10010203
com.xiaomi.drivemode:10008
  1. packages.list,这个配置文件没有配置状态相关的值,但还是尝试修改测试,还是无法正常开机。

参考: packages.xml和packages.list全解析

文件内容示例:

com.qualcomm.uimremoteserver 1001 0 /data/user/0/com.qualcomm.uimremoteserver platform:privapp:targetSdkVersion=29 3009,1077,1065,3002,3003,3001,3007,1021,1000,2002,1015,1023,1010,3006 0 30
com.miui.userguide 10135 0 /data/user/0/com.miui.userguide default:targetSdkVersion=27 3003 0 10040102
com.qti.confuridialer 10316 0 /data/user/0/com.qti.confuridialer platform:targetSdkVersion=30 none 0 30
com.miui.guardprovider 10126 0 /data/user/0/com.miui.guardprovider platform:targetSdkVersion=29 3003 0 108
  1. cachequota.xml,这里配置了uid,但是尝试添加com.xiaomi.market的配置测试还是无法开机。。

文件内容示例:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<cache-info previousBytes="0">
<quota uid="10191" bytes="545054693" />
<quota uid="10150" bytes="380387624" />
  1. appops.xml,终于我发现有个文件一直被忽略了,这个文件保存的是APP的权限分配的,并且也缺少com.xiaomi.market的配置信息,加上卡米的异常中有一个android.content.pm.PackageManager$NameNotFoundException,那很有可能是这个文件缺少配置导致的。不过,经过测试依然不行,还是开不了机

2022-03-27T11:51:04.png

文件内容示例:

<pkg n="com.xiaomi.simactivate.service">
<uid n="10102" p="false">
<op n="59" tt="1647220065109" tfs="1648224030488" tf="1648263110693" tb="1648263428598" tc="1648263428408" pu="0" />
<op n="60" tt="1647220065109" tfs="1648224030488" tf="1648263110693" tb="1648263428598" tc="1648263428408" pu="0" />
<op n="63" tt="1613288318380" tfs="1622769202300" tf="1588384960284" tb="1648263087956" tc="1648169907649" pu="0" />
<op n="76" tt="1619801682646" tfs="1619801682651" tb="1619801682646" d="5" />
</uid>
  1. 也许一切都有,只是有个状态需要系统来操作处理?因为之前禁用的时候是用的pm命令,所以可能需要通过pm enable相关的东西才行。然而然而,我尝试了相关的命令,并且担心没有对当前次开机生效,还反复重启测试。。最终仍然是无法开机的。
  2. 关键!在测试过程中,会反复使用twrp,用过twrp的人都知道正常情况下需要输入一个手机密码,即锁屏的那个密码才能解密用户分区数据。我发现在解密的时候,总会提示一个用户id为999的数据无法解密,然后注意到一开始提示的是开始解密用户0的数据...是的,一般手机都是一个用户,除非双开应用才有可能是有多个用户。
  3. /data/system/users/0/package-restrictions.xml,最终定位到这个配置文件,因为文件名中就有restriction,根据查到的资料也可以知道确实是配置APP状态的。

这样一来总算找到关键配置文件了

根源

文件/data/system/users/0/package-restrictions.xmlcom.xiaomi.market配置有一个inst="false"

/data/system/users/0/package-restrictions.xml

2022-03-27T11:50:09.png

2022-03-27T11:50:25.png

com.android.server.pm.Settings可以看到其对应ATTR_INSTALLED,即是否安装

后记

于是去掉inst="false",将该文件重新覆盖原有文件,重启,顺利开机。

这个时候已经是下午六点多了,终于,可以觅食了。

其他结合参考分析过的文件:

2022-03-27T11:58:39.png

“顺利”从Android 9升级到Android 11:

2022-03-27T12:00:06.png

变化:

  • root掉了,不过还是解锁状态,后面要root再magisk patch boot.img即可
  • xp模块好像也没了,不过这也在预料之中,总之root相关的都没了
  • 开机的时候居然是飞行模式
  • 相册的截图文件夹又恢复了,之前不知道为何自带相册不显示这个文件夹
  • 微信只能直接访问相册部分的图片,看来权限限制还是有点用处
  • 支付宝提示检查到系统升级了
  • 需要打开v2rayNG的自启动,才能从下拉面板直接开启vpn
  • 图标变大,系统有关字体好像都大了一号,感觉直接步入老年模式了
  • 开启巨无霸APP不会”那么“卡了,但实际上启动似乎还是停耗时的
👍 0

none

最后修改于50天前

评论

贴吧 狗头 原神 小黄脸
收起

贴吧

狗头

原神

小黄脸

目录

avatar

未末

迷失

122

文章数

274

评论数

7

分类