最近有使用腾讯乐固进行apk加固的同窗发现,ARouter在加固后不能正常工做了,找不到组件。在github上也有相应的issue:java
话很少说,直接上解决方案android
注意:如下解决方案针对ARouter版本为目前的最新版1.3.1buildscript {
repositories {
jcenter()
}
dependencies {
//...
classpath 'com.billy.android:autoregister:1.1.3'
}
}
复制代码
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/.*' ]
]
]
}
复制代码
至此,加固后没法找到组件的问题已解决,经测试有效。git
ARouter是在运行时经过读取每一个dex文件中的com.alibaba.android.arouter.routes
包下的全部类经过反射来完成映射表的注册,加固致使这一步工做失败,从而致使ARouter没法正常工做。github
AutoRegister插件从根本上解决了找不到dex文件的问题:经过编译时进行字节码扫描对应3个接口的实现类,生成注册代码到ARouter的LogisticsCenter类中,运行时无需再读取dex文件,从而避免加固的兼容性问题。api
AutoRegister的原理说明文章: AutoRegister:一种更高效的组件自动注册方案(android组件化开发)app
这个方案已经制做ARouter定制版并提交了PR给ARouter,目前已merge到了develop分支,待ARouter官方测试完成后才会正式开放,本文中给出的方案你们能够做为一个临时解决方案,待官方正式发布后采用官方定制版插件便可(能够省去第2步中插件配置相关的代码)。框架
若是对android组件化技术感兴趣,欢迎阅读个人组件化系列文章。ide
想要快速了解目前各类开源的组件化框架特色的,能够看这个: 总结一波安卓组件化开源方案组件化