什么时候支持compose啊?
用apktool 对加固后的包 反编译再重新打包 签名
不太懂什么意思
这个 apktool.jar
https://apktool.org/
那个问题我看过,我查过谷歌的issue,应该compose的问题。它错误实现某些接口,但可能因为一般情况没加载那些错误类不报错,但依然有概率触发,而对compose加固可能导致会强行加载那些类文件而报错。 绕过那些错误类就行,项目是处理字节码的,除了后面新加的几个新字节码不支持不能转化那些方法,其他的问题应该不大。还有不要去加固开源库,纯粹给逆向送子弹,别人只需要拿开源库的字节码跟你随机化后的进行对比就能搞清楚你opcode映射,完全绕过分析vm。
遇到 IncompatibleClassChangeError: Found interface androidx.compose.ui.graphics.drawscope.DrawScope, but class was expected
Apktool 那边的issue ,也会有这个问题,
不是这库的问题,即使spliteDex 方法那里什么都不做,直接写到shellexpool里,compose 也有问题.
那个dex2c库,也会有compose的问题,
现在解决方式nmmp-project 的产物Apk 有用apktool重打包一次就可以了(反编译->重打包 什么都不用改,不要 —no-res 参数)
具体原因没实际测试,但报错看着是compose错误实现某些接口导致不兼容,这个哪怕不额外处理dex,compose也有几率报错。
dexdump W 08-22 17:46:04 52701 1675785 dex_file_verifier.cc:3552] This dex file is invalid and will be rejected in the future. Error is: Interface virtual method 45635(Landroidx/compose/ui/graphics/drawscope/DrawScope;.offsetSize-PENXr5M) is not public,应该是 dexVersion 不兼容的问题。
传默认的 Opcodes.getDefault() 默认是 35,对于 38 或者更高版本的,修改后的 dex 变成 35,出现新版本语法不兼容的。
DexBackedDexFile.fromInputStream(null, new BufferedInputStream(new FileInputStream(config.getImplDexFile()))) 第一个参数不传,会从原dex读取Opcodes,injectInstructionAndWriteToFile 的 dexPool 的共享我也去掉了,就不报这个错误了。
倒没仔细区分dex版本差异,当时用了默认的。改成从原dex获得版本这个改动不错。最大问题还是没实现几个方法调用指令。
过滤了compose一些相关接口,我加固compose项目时候之前的崩溃问题解决了,作者你可以去看看 @maoabc
还有一个,我之前碰到的compose项目崩溃问题是因为使用了xml布局和compose混合开发出现的崩溃 #120