加固后ARouter罢工了?看这里

文章介绍了ARouter在经过腾讯乐固加固后无法找到组件的问题,以及如何通过使用AutoRegister插件在编译时生成注册代码,避免运行时读取dex文件,从而解决加固的兼容性问题。该方案已被合并到ARouter的develop分支,等待官方测试后正式发布。
摘要由CSDN通过智能技术生成

前言

最近有使用腾讯乐固进行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
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值