Tinker: 问题:能不能打加固的补丁?

Created on 29 Sep 2016  ·  27Comments  ·  Source: Tencent/tinker

enhancement

Most helpful comment

@shwenzhang 刚刚试了下360手机助手的加固,确实无法应用补丁,但问题在于360这个不要脸的非要你加固后才可以发布,何解?

All 27 comments

加固的补丁,是指基准包和新包都加固过吗?
加固之后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,特意让它只做一个跳转

Was this page helpful?
0 / 5 - 0 ratings