加固的补丁,是指基准包和新包都加固过吗?
加固之后Dex很可能已经不是标准结构了(加了干扰指令、抹去了部分数据项、故意构造非法数据项等等),这样Tinker的DexDiff逻辑很可能会出错,所以暂时不建议对加固的Dex应用这套方案。
@tomystang 如果线上包是加固的,基准包和新包都未加固,打出来的补丁对线上加固的包能起作用么?或者还是说需要用基准包和新包都加固过后打出的加固补丁才有效?
这样也是不支持的。
线上包和本地基准包的角色是一样的,也就是说只有线上包和本地基础包二进制一致,打出的补丁才有意义。如果线上包是加固过,本地基准包未加固,这两个包的二进制肯定就不一致了。
如果这两个包都加固了,由于DexDiff只能识别处理标准结构的Dex,加固过程对Dex做了变形,所以同样也不支持。
此外,加固过的Dex在未经加固逻辑处理之前,原则上应该要做到任何工具都无法识别和修改,包括系统的虚拟机,不然加固方案就很有问题了。
那微信是怎么兼顾tinker和加固呢?
@tomystang 那如果说基准包和新包都未加固生成的补丁,可以给加固后的基准包使用么
@Drizzlezhang 按上面说法看来是不行
@k-lam 微信没有加固dex。
@Drizzlezhang 不行的,因为运行时读取到的基准包肯定是加固后的,这样编译时用未加固的两个包生成的patch就没有意义了。
@TangXiaoLv 嗯嗯,确实是不行的。
对于明确需要加固的产品,我们这边计划提供qzone方式的一个回退实现
@shwenzhang 刚刚试了下360手机助手的加固,确实无法应用补丁,但问题在于360这个不要脸的非要你加固后才可以发布,何解?
@tomystang 微信没有加固是怎么通过360手机助手审核的?
微信不加固dex,那怎么防破解呢?怎么做到安全呢?
同问微信的同学
同 @kongnanlive 的问题,我们项目也遇到了这个问题,怎么办啊- -
就是360渠道强制要求加固,tinker就不能用了,怎么破..
tinker这边后面会推出一种qzone插桩方案的回退版本,但是会导致性能损耗以及补丁包可能过大问题。若应用自己没有主观的加固需求,360市场可以不上,它会自动捉包更新的
@shwenzhang 好的多谢~
360市场可以不上+1
@kongnanlive 我觉得360助手会求着微信上他们平台的吧
@Okai. 我们是没有主动360市场的。
tinker不是支持so更新么, 那么把基准包和新包都加固再用tinker命令进行BsDiff生成新的补丁包也不行么? 感觉360加固后的classes.dex都是一样的 只是so不同
@TangXiaoLv please try with 1.7.0
是否支持加固, tinker的普通模式需要Dex的合成,它并不支持加固,一定要使用加固的app可以使用usePreGeneratedPatchDex模式。
版本1.7.3, usePreGeneratedPatchDex设置为true之后, 360加固亲测,patch成功,但是实际上没有效果
@huyn 不修改mainActivity,之前测试过是没问题的
@shwenzhang MainActivity指的是LAUNCHER吗?我的更新逻辑是在LAUNCHER中启动的Activity当中
对,文档里面就有说。因为360加固会提前加载LAUNCHER
@shwenzhang
这是我的LAUNCHER 的onCreate方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
startActivity(new Intent(this, PluginMainActivity.class));
finish();
}
我要热更新的的部分在PluginMainActivity当中,为了绕过MainActivity,特意让它只做一个跳转
Most helpful comment
@shwenzhang 刚刚试了下360手机助手的加固,确实无法应用补丁,但问题在于360这个不要脸的非要你加固后才可以发布,何解?