加固後ARouter罷工了?看這裡

齊翊發表於2018-03-09

前言

最近有使用騰訊樂固進行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元件化技術感興趣,歡迎閱讀我的元件化系列文章

想要快速瞭解目前各種開源的元件化框架特點的,可以看這個: 總結一波安卓元件化開源方案

相關文章