前言
最近有使用騰訊樂固進行apk加固的同學發現,ARouter在加固後不能正常工作了,找不到元件。在github上也有相應的issue:
話不多說,直接上解決方案
注意:以下解決方案針對ARouter版本為目前的最新版1.3.1解決方案(共2步)
- 在工程根目錄新增對AutoRegister外掛的依賴:
buildscript {
repositories {
jcenter()
}
dependencies {
//...
classpath 'com.billy.android:autoregister:1.1.3'
}
}
複製程式碼
- 在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元件化技術感興趣,歡迎閱讀我的元件化系列文章。
想要快速瞭解目前各種開源的元件化框架特點的,可以看這個: 總結一波安卓元件化開源方案