Android組件化混淆
每個module在創(chuàng)建之后,都會自帶一個proguard-rule.pro的自定義混淆文件,每個moudule可以有自己的混淆規(guī)則。
但是在組件化中,如果每個moudule都使用自身混淆,則會出現(xiàn)重復混淆的現(xiàn)象,造成查詢不到資源文件的問題。
解決這個問題的關鍵就是:保證在apk生成的時候只有一次混淆。
方案一:在app模塊設置混淆,其他模塊關閉混淆
優(yōu)點:所有混淆規(guī)則在app模塊的proguard-rule.pro文件中統(tǒng)一管理
缺點:移除某些模塊后,需手動移除app模塊中的混淆規(guī)則。理論上混淆規(guī)則添加多了不會造成崩潰或者編譯不通過,但是會影響編譯效率
方案二:用Gradle命令將其他模塊的proguard-rule.pro文件合成并覆蓋app模塊的proguard-rule.pro文件
優(yōu)點:將混淆文件解耦到每個模塊中
缺點:需要編寫Gradle命令來配置操作,每次生成新的混淆文件都會有合成操作,也會對編譯效率造成影響。
方案三:組件模塊將自己的proguard-rule.pro文件打包到aar中
優(yōu)點:將混淆文件解耦到每個模塊中,并且不會影響編譯效率
具體使用如下:
添加一個屬性到Library module 的 build.gradle 文件中:
defaultConfig {
consumerProguardFiles 'proguard-rule.pro'
}
consumerProguardFiles屬性:
庫中可以依賴此標志來指定庫的混淆方式,consumerProguardFiles屬性會將*.pro文件打包進 aar 中,庫混淆時會自動使用此混淆配置文件。
用consumerProguardFiles方式加入的混淆有如下特性:
- 庫的
proguard-rule.pro會打包進aar中 - 此配置只對此aar進行混淆配置,只對庫文件有效,對應用程序無效
當app模塊將全部代碼匯總混淆時,Library 模塊會被打包為 release aar,然后被引用匯總,通過proguard-rule.pro規(guī)則各自混淆,保證只混淆一次。
組件化工程中具體混淆用法:
我們可以將固定的第三方混淆放到base模塊的proguard-rule.pro文件中,每個模塊獨有的第三方引用庫混淆放到各自的proguard-rule.pro文件中,在app模塊的proguard-rule.pro文件中放入Android基礎屬性的混淆聲明,如四大組件和全局的混淆等配置。這樣可以最大限度的完成混淆解耦操作。
