MIUISupermarket移植

VerifyError

1
java.lang.VerifyError: Verifier rejected class com.xiaomi.market.util.UIUtils: void com.xiaomi.market.util.UIUtils.setStatusBarDarkMode(android.app.Activity, boolean) failed to verify: void com.xiaomi.market.util.UIUtils.setStatusBarDarkMode(android.app.Activity, boolean): [0x15] type Undefined unexpected as arg to if-eqz/if-nez (declaration of 'com.xiaomi.market.util.UIUtils' appears in /data/app/~~pH0reBrzyfvMag1T-TAoDw==/com.xiaomi.market-EzZXS_MznmhQs5NCCbvqfA==/base.apk!classes2.dex)
  • 一般出现VerifyError都是因为对smali代码修改,导致无法通过验证。当前遇到过的情况有:
    • 插入代码时无意覆盖了下面会用到的寄存器的值,导致寄存器类型不匹配等问题。
    • 对方法参数类型修改但未修改调用时传入的参数
    • 传递参数时传递了类型不匹配的参数

ClassNotFound

在xiaomi商店中使用了Lmiui/os/Build类,该类继承Landroid/os/Build,且存在于小米系统中,导致类找不到。导致运行时闪退。

对于这类小米系统中才能获取到的类,采用等价替换的方法进行修复。如在Lmiui/os/Build中有:

  • IS_INTERNATIONAL_BUILD
  • IS_ALPHA_BUILD
  • IS_DEVELOPMENT_VERSION
  • IS_INTERNATIONAL_BUILD
  • getRegion()
    等字段和方法,可以在miui中查看一下对应的值,然后手动修改smali代码,将值替换为对应的值。

Dex方法数限制

1
org.jf.util.ExceptionWithContext: Error while writing instruction at code offset 0x2

在apktools打包smali时报错,
对smali修改时添加了很多方法,导致一个dex内方法数超过65,535,导致打包失败。

解决方法:在smali源码目录中新建文sources_dex${n}目录,将代码放入该位置,重新编译,即可将代码打包入新的dex文件中。

应用无法安装

MIUI魔改了PackageInstaller
当使用packageinstaller获取session写入安装包后,使用commit传入一个PendingIntent对象,用于接收应用安装结果的广播。而该通知的内容被魔改,导致收到原生系统的广播时,无法正确处理后续的逻辑,导致安装失败。

  • 中间还尝试过使用ACTION_VIEWACTION_INSTALL_PACKAGEstartActivity启动安装器,但这两个ACTION在安卓10后被废弃了,导致没有Activity响应该Intent,无法进行安装。
  • 使用ACTION安装apk时,如果apk文件在私有存储空间内,要使用FileProvider。

未解决的问题

  • 无法卸载
  • 无法暂停任务
  • 安装后没有调用session的abandon()方法
  • 首页顶部标题栏与系统状态栏之间存在空白部分

另外

中间还有一个MIUISettingsProvider的类找不到,我当时直接把miui中的SettingsProvider替换到PixelOS的SettingsProvider中,导手机致变砖,救砖救了好久。

作者

Meow Meow Liu

发布于

2024-07-13

更新于

2024-08-19

许可协议

评论