加固後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

想要快速瞭解目前各類開源的組件化框架特色的,能夠看這個: 總結一波安卓組件化開源方案組件化

相關文章
相關標籤/搜索