Gradle 5.1.1更新致Android ProGuard规则失效,求适配指导
解决Gradle 5.1.1(R8默认启用)下Android-Link-Preview的ProGuard规则失效问题
升级到Gradle 5.1.1后,你碰到的问题核心是Android Studio 3.4+默认启用的R8代码压缩工具,和传统ProGuard的规则逻辑存在差异——原来的-keeppackagenames org.jsoup.nodes只保留了包名,但R8的代码收缩会进一步移除它认为“未被使用”的类和资源,而jsoup运行时需要加载entities-xhtml.properties这类资源文件,以及核心解析类,这些都被R8误删了。
针对这个问题,你需要在ProGuard配置文件中添加以下更明确的规则:
1. 完整保留jsoup的所有类和资源
R8会主动移除未被直接引用的类和资源,而jsoup很多核心逻辑是动态加载的,所以必须明确保留:
# 保留jsoup所有类,防止核心解析类被移除 -keep class org.jsoup.** { *; } # 保留jsoup的所有资源文件,包括entities-xhtml.properties这类配置文件 -keepresources class org.jsoup.** { *; }
2. 保留Android-Link-Preview库的核心类
确保依赖库本身的类不被混淆或移除:
-keep class com.leocardz.link.preview.** { *; }
为什么原来的规则失效?
-keeppackagenames只是告诉工具不要重命名包名,但不会阻止包内的类被R8的代码收缩机制移除。而jsoup运行时需要动态加载特定的资源和类,这些在R8的默认优化策略下,会被判定为“未被直接使用”而清理,从而抛出找不到资源的异常。
把这些规则添加到你的proguard-rules.pro文件后,重新编译打包,应该就能解决应用崩溃的问题了。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

