2021年6月20日

WeChat8Xposed通用hook框架适配新版微信–修复NotificationManagerCompat适配异常

作者 huruwo

测试NotificationManagerCompat类无法找到

没有找到 NotificationManagerCompat

没有找到 NotificationManagerCompat

scriptjava.lang.Error: Failed to evaluate NotificationManagerCompat       at 
com.gh0u1l5.wechatmagician.spellbook.mirror.android.support.v4.app.Classes$$special$$inlined$wxLazy$1.invoke(WechatGlobal.kt:112)       at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)       at 
com.gh0u1l5.wechatmagician.spellbook.WechatGlobal$UnitTestLazyImpl.getValue(WechatGlobal.kt:138)       at 
com.gh0u1l5.wechatmagician.spellbook.util.MirrorUtil.generateReportWithForceEval(MirrorUtil.kt:64)       at 
com.gh0u1l5.wechatmagician.spellbook.MirrorUnitTest.verifyPackage(MirrorUnitTest.kt:84)       at 
com.gh0u1l5.wechatmagician.spellbook.MirrorUnitTest.verifyPlayStorePackage8_0_6(MirrorUnitTest.kt:152)       at java.lang.reflect.Method.invoke(Native Method)       at 
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)       at 
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)       at 
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)       at 
org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)       at 
androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:80)       at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)       at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)       at 
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)       at org.junit.runners.ParentRunner.run(ParentRunner.java:363)       at 
androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)       at org.junit.runners.Suite.runChild(Suite.java:128)       at org.junit.runners.Suite.runChild(Suite.java:27)       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)       at org.junit.runners.ParentRunner.run(ParentRunner.java:363)       at org.junit.runner.JUnitCore.run(JUnitCore.java:137)       at org.junit.runner.JUnitCore.run(JUnitCore.java:115)       at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)       at 
androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:388)       at 
android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2091)

思考为什么

做过开发都知道NotificationManagerCompat就是一个关于通知信息的东西

如果我们要hook关于通知的行为 就要hook NotificationManagerCompat这个类的相关方法

同时这个方法也就处于我们的v4/v7的兼容包下面

分析解决问题

旧版特征值过滤器

object Classes {
    val NotificationManagerCompat: Class<*> by wxLazy("NotificationManagerCompat") {
        findClassesFromPackage(wxLoader!!, wxClasses!!, "android.support.v4.app")
                .filterByField("android.app.NotificationManager")
                .firstOrNull()
    }
}

不难看出 就是 找 android.support.v4.app 目录下 带 android.app.NotificationManager 变量值的类

jadx静态分析apk

老办法 jadx打开apk文件

分析包结构目录

显然在旧版的android.support.v4.app 目录下也就是没有所谓的NotificationManagerCompat

androidx代替v4/v7

日常做安卓开发的我稍微的想了一分钟,不难得出。微信在高版本的微信里面使用了

androidx代替v4/v7

具体的可以看这个 https://developer.android.google.cn/jetpack/androidx/

反正我的软件也做了这个兼容的切换

同理修复路径

任意的搜索android.app.NotificationManager 这个类的引用关系,不难找到在androidx.core.app 下面有这个的引用。也就是说
新版的 androidx.core.app 代替了原版的 android.support.v4.app

调整特征值

object Classes {
    val NotificationManagerCompat: Class<*> by wxLazy("NotificationManagerCompat") {
        findClassesFromPackage(wxLoader!!, wxClasses!!, "androidx.core.app")
                .filterByField("android.app.NotificationManager")
                .firstOrNull()
    }
}

跑测试文件验证

已经成功 不再报错 NotificationManagerCompat 类无法找到了

而是其他的类。