一、 问题日志
- Run tasks中:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':xxxx:transformClassesAndResourcesWithProguardForRelease'.
- Java compiler中:
Warning: there were 4 instances of library classes depending on program classes.
二、 原因分析
gradle依赖的库和引用这个库的代码,其中一个被混淆一个没有被混淆,导致引用时不一致。
三、 解决方案
网上一些解决方案是忽略该warning,这种方法肯定是存在隐患的,并不能真正解决问题,既然一个混淆,一个没混淆,那么这里给出两种思路,要么都混淆,要么都保留:
1. 不混淆报错的二者
- 如果是要保留引用这个库的类,在"proguard-rules.pro"文件中保留:
-dontwarn xxx.**
-keep class xxx.**{*;} // 表示保留该类及其所有方法
- 如果是要保留通过gradle依赖的开源库或者从外部导入的jar,在"proguard-rules.pro"文件中保留:
-keep class com.example.demo.**{*;} // com.example.demo为xxxx.jar中的包名,这里表示保留它下面所有的内容
2. 混淆依赖的库
- 如果是通过gradle依赖的开源库需要被混淆,在"build.gradle"文件中混淆该库:
dependencies {
compile "com.org.example:demo:1.0.0"
proguard "com.org.example:demo:1.0.0"
}
- 如果是从外部导入的jar包,由于很多jar包已经混淆过,所以二次混淆很可能会出问题