多模块Android SDK库项目的Proguard混淆配置相关问题咨询
Android多模块SDK Proguard混淆方案说明
1. 多模块发布时Proguard的默认运行逻辑
默认情况下,Android库模块的混淆是独立执行的,逻辑如下:
- 每个模块开启
minifyEnabled true后,会单独对自身代码执行混淆流程,生成各自的混淆映射表 - 默认配置下,如果shared模块作为本地依赖被功能1、功能2模块引用,功能模块编译时会把shared模块的未混淆class和自身class合并后再执行混淆,这会导致两个功能模块里的shared类被重复混淆,类名/方法名映射不一致,最终运行时抛出类找不到、方法找不到的异常
- 如果是单独发布三个模块的AAR(shared单独发布,功能1、功能2依赖远程的shared AAR),那么shared模块发布时已经完成混淆,功能1、功能2编译时只会对自身代码做混淆,此时需要保证shared模块对外暴露的API没有被混淆,才能被功能模块正常引用
2. 是否所有模块会分别独立混淆
默认开启混淆的情况下,每个模块的混淆流程是独立的,各自生成独立的mapping映射文件,没有全局统一的映射规则同步机制,会导致跨模块引用的类/方法名不匹配。
3. 多模块统一混淆实现方案
根据你的发布形式不同,选择对应的配置方案即可:
3.1 功能模块打包时内置shared代码(只发布功能1、功能2两个AAR)
这种场景的配置最简单,统一混淆的成本最低:
- 所有模块中,仅在最终打包的功能1、功能2模块开启
minifyEnabled true,shared模块关闭混淆,避免公共代码被提前处理 - 项目根目录创建全局统一的混淆配置文件
proguard-global.pro,所有功能模块的proguard配置都引用这一份文件,避免规则不一致 - shared模块配置
consumerProguardFiles 'consumer-rules.pro',用于声明跨模块调用需要保留的符号规则
配置示例:
功能模块build.gradle配置:
android { buildTypes { release { minifyEnabled true // 引用全局统一混淆规则 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), '../proguard-global.pro' // 声明给SDK接入方用的混淆规则 consumerProguardFiles 'consumer-rules.pro' } } dependencies { implementation project(':shared') } }
shared模块build.gradle配置:
android { buildTypes { release { // 关闭混淆,公共代码交由功能模块打包时统一处理 minifyEnabled false consumerProguardFiles 'consumer-rules.pro' } } }
该模式下功能模块编译时会合并所有依赖的代码统一做混淆,自动保证跨模块引用的符号一致,不需要额外添加shared类的keep规则,除非你需要保留shared模块的对外API不被混淆。
3.2 三个模块单独发布(shared、功能1、功能2都作为独立AAR上传)
如果需要三个模块独立发布,彼此为远程依赖关系,按以下配置:
- shared模块单独开启混淆,在它的
consumer-rules.pro中keep所有对外暴露的API,保证依赖它的功能模块可以正常引用 - 功能1、功能2模块各自开启混淆,全局混淆规则中添加shared模块公开API的keep规则,避免功能模块混淆时误裁剪shared的公开符号
- 所有模块的混淆规则都引用根目录的全局配置文件,保证规则统一
内容的提问来源于stack exchange,提问作者mrpasqal
相关产品推荐
相关产品推荐

