最近有使用騰訊樂固進行apk加固的同窗發現,ARouter在加固後不能正常工做了,找不到組件。在github上也有相應的issue:java
話很少說,直接上解決方案android
注意:如下解決方案針對ARouter版本爲目前的最新版1.3.1buildscript {
repositories {
jcenter()
}
dependencies {
//...
classpath 'com.billy.android:autoregister:1.1.3'
}
}
複製代碼
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
想要快速瞭解目前各類開源的組件化框架特色的,能夠看這個: 總結一波安卓組件化開源方案組件化