加固后ARouter罢工了?看这里

前言

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

话很少说,直接上解决方案android

注意:如下解决方案针对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/.*' ]
        ]
    ]
}
复制代码

至此,加固后没法找到组件的问题已解决,经测试有效。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

想要快速了解目前各类开源的组件化框架特色的,能够看这个: 总结一波安卓组件化开源方案组件化

相关文章
相关标签/搜索