Android组件化混淆
每个module在创建之后,都会自带一个proguard-rule.pro
的自定义混淆文件,每个moudule可以有自己的混淆规则。
但是在组件化中,如果每个moudule都使用自身混淆,则会出现重复混淆的现象,造成查询不到资源文件的问题。
解决这个问题的关键就是:保证在apk生成的时候只有一次混淆。
方案一:在app模块设置混淆,其他模块关闭混淆
优点:所有混淆规则在app模块的proguard-rule.pro
文件中统一管理
缺点:移除某些模块后,需手动移除app模块中的混淆规则。理论上混淆规则添加多了不会造成崩溃或者编译不通过,但是会影响编译效率
方案二:用Gradle命令将其他模块的proguard-rule.pro
文件合成并覆盖app模块的proguard-rule.pro
文件
优点:将混淆文件解耦到每个模块中
缺点:需要编写Gradle命令来配置操作,每次生成新的混淆文件都会有合成操作,也会对编译效率造成影响。
方案三:组件模块将自己的proguard-rule.pro
文件打包到aar中
优点:将混淆文件解耦到每个模块中,并且不会影响编译效率
具体使用如下:
添加一个属性到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
规则各自混淆,保证只混淆一次。
组件化工程中具体混淆用法:
我们可以将固定的第三方混淆放到base模块的proguard-rule.pro
文件中,每个模块独有的第三方引用库混淆放到各自的proguard-rule.pro
文件中,在app模块的proguard-rule.pro
文件中放入Android基础属性的混淆声明,如四大组件和全局的混淆等配置。这样可以最大限度的完成混淆解耦操作。
网友评论