注意:这个过程是针对 自己打包的aar,并依赖自己的aar(非lib module 模式)
结构
App Module (com.android.application)
└── 依赖
└── Lib Module (com.android.library)
├── proguard-rules.pro <-- 不会被 App 使用 ❌
└── consumer-rules.pro <-- 会被 App 使用 ✅
场景
1.在某个 Library 模块(AAR) 中定义了与 libvlc 相关的类或接口;
2.在该模块的 proguard-rules.pro 中添加了保留规则:
3.构建 App 后仍然出现 FindClass(...MediaPlayer$Title) failed 错误 ❌;
3.把规则移到 consumer-rules.pro 后问题解决 ✅。
❓ 为什么会这样?
🧠 因为 proguard-rules.pro 只作用于当前模块,而不会传递给依赖它的 App 模块。
1.当你在 Library 模块中使用 proguard-rules.pro 添加混淆规则时:
这些规则只对当前 Library 的代码进行混淆控制;
不会自动合并进 App 的 ProGuard 配置中;
所以 App 构建时这些规则没有生效,导致 org.videolan.libvlc.MediaPlayer$Title
被混淆或删除 ➜ JNI 找不到类 ➜ FindClass 失败。
2.而当你将规则写入 consumer-rules.pro:
Android Gradle 插件会在构建 App 时自动合并该文件内容;
App 的 ProGuard/R8 配置中包含了这些规则;
因此 MediaPlayer$Title 类名保留了下来 ➜ JNI 成功找到类 ➜ 正常运行 ✅。
解决方案
- ✅ 正确使用 consumer-rules.pro 来保留 SDK/AAR 中暴露的类
如果你开发的是一个 对外提供功能的 Library 模块(如封装 libvlc 功能的 SDK),请将所有需要保留的 ProGuard 规则写入: