如何阻止ProGuard混淆从JAR文件导入的Android库?
这个问题的核心在于你通过「从JAR/AAR文件导入」生成的build.gradle过于简化了——它仅仅声明了库的artifact,完全没有配置ProGuard相关的参数,所以你创建的proguard-rules.pro根本没被Gradle加载。下面给你两个可行的解决办法:
方法一:直接在主应用模块的ProGuard规则中添加保留配置(最快捷)
既然库模块的规则没被识别,不如直接把保留规则放到主app模块的混淆配置里,这样主模块的ProGuard在处理整个项目时会生效:
- 打开你主app模块下的
proguard-rules.pro文件 - 添加这条规则:
-keep class com.merchant.lib.** { *; } - 这条规则会强制ProGuard保留
com.merchant.lib包下所有类的所有方法和字段,不会对它们进行混淆。
方法二:修改库模块的build.gradle为标准Android Library配置(更规范)
如果你希望把混淆规则和库模块绑定在一起,可以把自动生成的极简build.gradle替换成标准的Android Library配置,让它明确加载你的proguard-rules.pro:
- 打开库模块目录下的
build.gradle,替换原有内容为:plugins { id 'com.android.library' } android { // 可以设置库的命名空间,和你的包名对应即可 namespace 'com.merchant.lib' // 改成你项目使用的compileSdk版本 compileSdk 34 defaultConfig { // 改成你项目的minSdk版本 minSdk 21 } buildTypes { release { // 如果不需要混淆库本身,这里可以设为false;如果要混淆其他部分但保留指定类,设为true并绑定规则 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } debug { minifyEnabled false } } } // 保留原有artifact声明,确保其他模块能正常引用这个JAR configurations.maybeCreate("default") artifacts.add("default", file("merchant-lib.jar")) - 保存后同步Gradle,现在你的
proguard-rules.pro会被库模块的构建流程正确加载,release构建时会应用你设置的保留规则。
额外验证步骤
构建release版本后,你可以通过以下方式确认规则生效:
- 查看主模块build目录下的
outputs/mapping/release/mapping.txt,搜索com.merchant.lib相关类,确认它们没有被重命名 - 用反编译工具打开生成的APK,检查
com.merchant.lib包下的类和方法是否保留了原名称
内容的提问来源于stack exchange,提问作者Sri Harsha Chilakapati
相关产品推荐
相关产品推荐

