加固后ARouter罢工了?看这里

3,651 阅读2分钟

前言

最近有使用腾讯乐固进行apk加固的同学发现,ARouter在加固后不能正常工作了,找不到组件。在github上也有相应的issue:

话不多说,直接上解决方案

注意:以下解决方案针对ARouter版本为目前的最新版1.3.1

解决方案(共2步)

  1. 在工程根目录添加对AutoRegister插件的依赖:
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        //...
        classpath 'com.billy.android:autoregister:1.1.3'
    }
}
  1. 在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组件化技术感兴趣,欢迎阅读我的组件化系列文章

想要快速了解目前各种开源的组件化框架特点的,可以看这个: 总结一波安卓组件化开源方案