前言
最近有使用腾讯乐固进行apk加固的同学发现,ARouter在加固后不能正常工作了,找不到组件。在github上也有相应的issue:
话不多说,直接上解决方案
注意:以下解决方案针对ARouter版本为目前的最新版1.3.1
解决方案(共2步)
1、在工程根目录添加对AutoRegister插件的依赖:
buildscript {
repositories {
jcenter()
}
dependencies {
//...
classpath 'com.billy.android:autoregister:1.1.3'
}
}
2、在application module下的build.gradle文件最后添加AutoRegister插件的配置信息:
apply plugin: 'auto-register'
autoregister {
registerInfo = [
[
'scanInterface' : 'com.alibaba.android.arouter.facade.template.IRouteRoot'
, 'codeInsertToClassName' : 'com.alibaba.android.arouter.core.LogisticsCenter'
, 'codeInsertToMethodName': 'loadRouterMap'//static方法
, 'registerMethodName' : 'registerRouteRoot' //static方法
, 'include' : [ 'com/alibaba/android/arouter/routes/.*' ]
],
[
'scanInterface' : 'com.alibaba.android.arouter.facade.template.IInterceptorGroup'
, 'codeInsertToClassName' : 'com.alibaba.android.arouter.core.LogisticsCenter'
, 'codeInsertToMethodName': 'loadRouterMap'//static方法
, 'registerMethodName' : 'registerInterceptor' //static方法
, 'include' : [ 'com/alibaba/android/arouter/routes/.*' ]
],
[
'scanInterface' : 'com.alibaba.android.arouter.facade.template.IProviderGroup'
, 'codeInsertToClassName' : 'com.alibaba.android.arouter.core.LogisticsCenter'
, 'codeInsertToMethodName': 'loadRouterMap'//static方法
, 'registerMethodName' : 'registerProvider' //static方法
, 'include' : [ 'com/alibaba/android/arouter/routes/.*' ]
]
]
}
至此,加固后无法找到组件的问题已解决,经测试有效。
原理
ARouter是在运行时通过读取每个dex文件中的com.alibaba.android.arouter.routes
包下的所有类通过反射来完成映射表的注册,加固导致这一步工作失败,从而导致ARouter无法正常工作。
AutoRegister插件从根本上解决了找不到dex文件的问题:通过编译时进行字节码扫描对应3个接口的实现类,生成注册代码到ARouter的LogisticsCenter类中,运行时无需再读取dex文件,从而避免加固的兼容性问题。
AutoRegister的原理说明文章: AutoRegister:一种更高效的组件自动注册方案(android组件化开发)
后记
这个方案已经制作ARouter定制版并提交了PR给ARouter,目前已merge到了develop分支,待ARouter官方测试完成后才会正式开放,本文中给出的方案大家可以作为一个临时解决方案,待官方正式发布后采用官方定制版插件即可(可以省去第2步中插件配置相关的代码)。
题外话
如果对android组件化技术感兴趣,欢迎阅读我的组件化系列文章。
想要快速了解目前各种开源的组件化框架特点的,可以看这个: 总结一波安卓组件化开源方案
作者:齐翊
链接:https://juejin.cn/post/6844903573394817037
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。