首页 / 新闻资讯 / 加固后热更新失效怎么办?各平台对Tinker、Sophix等...
APP加固和热更新,本质上是一对矛盾体。

加固要做的是代码保护——混淆、加密、加壳,让逆向工程师看不懂;热更新要做的是动态替换——修补类、替换资源、更新SO库,让APP运行时能加载新代码。两者碰撞的结果往往是:加固把热更新框架的类加载器路径改了,热更新补丁找不到原始类,合成失败、签名校验不通过、甚至直接闪退。
去年我们团队就栽在这个坑里。先用免费工具加固,Tinker补丁下发后崩溃率飙到8%;换了付费平台,又遇到Sophix补丁加载时抛出ClassNotFoundException。折腾了两周才搞明白:不是加固不行,是加固方案和热更新框架没做适配。
Tinker是微信开源的热修复框架,也是Bugly热更新的底层实现。它的加固兼容性演进经历了一个关键节点。

Tinker 1.7.9以下版本:加固后补丁加载基本不可用。原因在于Tinker的补丁合成机制依赖对原始Dex的解析,而加固改变了Dex的文件结构,导致Tinker在patch.info解析阶段直接报错。
Tinker 1.7.9 ~ 1.9.0版本:Bugly在1.3.0及以上版本中增加了加固模式开关,需要在tinker-support.gradle中显式开启:
// 是否使用加固模式,默认为falseisProtectedApp = true开启后,Tinker会调整补丁合成策略,绕过部分加固对Dex的修改影响。
Tinker 1.9.13.1版本:这是官方明确宣布修复加固模式问题的版本。更新日志中写道:“解决了加固模式和Android P下patch加载失败的问题”。实测发现,这个版本对常见加固平台(360加固、梆梆、乐固)的兼容性明显提升,补丁加载成功率从80%左右提升到95%以上。
实测结论:
isProtectedApp = true,加固后热更新基本可用Sophix对加固的支持相对成熟,阿里云官方文档明确列出了兼容的加固平台。
官方兼容列表:
关键操作原则:加固包的热修复,补丁必须用加固前的包来打。
正确流程是:
如果直接用加固后的包打补丁,会出现ClassNotFoundException或pre-verified异常。
特殊配置:如果是梆梆加固,需要在Sophix配置中忽略sophix文件夹,否则加固工具会干扰Sophix的类加载逻辑。
实测踩坑:我们在某次适配中发现,加固后走非加固模式,部分华为、荣耀手机崩溃率10%左右。日志显示是外部类与内部类加载器不一致导致的——加固用了自定义类加载器,破坏了双亲委派机制。解决方案是调用Sophix的加固模式API,强制使用加固专属的类加载器。

AndFix(已废弃):基于Native层的Method替换,加固后基本不可用。加固会改变方法的索引或内联部分代码,AndFix找不到原始方法地址。不推荐。
Robust(美团):Instant Run方案,加固后兼容性尚可,但补丁包体积会被放大。实测360加固后可用,但补丁大小从几十KB膨胀到2-3MB。
加固为了加载解密后的Dex,通常会创建自己的ClassLoader(如梆梆的ProtectedClassLoader、360的ShellClassLoader)。热更新框架在初始化时会保存原始的PathClassLoader,但加固后的ClassLoader层级变了,热更新框架可能找不到补丁中的类。
表现在日志上:ClassNotFoundException,但类明明在补丁包里。
解决方案:热更新框架需要感知加固的存在,使用加固暴露的ClassLoader而非系统默认的。Tinker的isProtectedApp和Sophix的加固模式API都是干这件事的。
加固后的APK会被重新签名(加固工具的签名或企业自己的签名)。热更新框架在生成补丁时,会校验基础包和补丁包的签名是否一致。如果加固改变了签名信息,补丁合成时会报签名校验失败。
表现在日志上:Signature check failed。
解决方案:打补丁时必须用加固前的原始包作为base包,而非加固后的包。
Android Gradle插件默认开启资源优化(android.enableResourceOptimizations=true),该优化会修改资源的索引。加固工具也可能对资源进行二次压缩。两者叠加后,Sophix在生成补丁时比对代码差异会异常,补丁包体积异常膨胀(改一行代码生成几MB的补丁)。
表现在日志上:running.log中diff项目远超预期。
解决方案:在gradle.properties中关闭资源优化:
android.enableResourceOptimizations=false来自阿里云官方文档的明确要求。
| 热更新框架 | 最低版本要求 | 关键配置 | 已知兼容的加固平台 | 不兼容场景 |
|---|---|---|---|---|
| Tinker (Bugly) | 1.7.9+(推荐1.9.13.1) | isProtectedApp = true | 360加固、梆梆、乐固 | Walle渠道包加固后需重签名 |
| Sophix | 3.2.0+ | 加固模式API + 关闭资源优化 | 爱加密、梆梆、360、聚安全 | 乐固的SO修复有问题 |
| Robust | 无明确版本 | 无特殊配置 | 360加固(实测) | 补丁体积膨胀严重 |
基于实测和线上踩坑经验,总结以下清单:
加固前的准备
android.enableResourceOptimizations=false打补丁时
集成配置
isProtectedApp = truesophix文件夹上线前验证
如果你现在还在方案选型阶段,我的建议是:
新项目/可升级框架:选Tinker 1.9.13.1 + Bugly热更新,加固兼容性已经比较成熟,社区活跃度高,踩坑有解决方案。
已在使用阿里云生态:Sophix + 爱加密/梆梆/360都是官方测试过的组合,注意乐固避坑就好。
千万别做的事:用免费加固跑Tinker 1.7.0以下版本,这组合崩到亲妈都不认识。
回到最开始的案例,我们最终怎么解决的?Tinker升级到1.9.13.1、开启isProtectedApp、补丁全部用加固前包生成。上线半年,热更新补丁发了12次,没有一次因为加固导致补丁失效。技术选型对了,加固和热更新完全可以共存。