我遇到了gradle proguard的问题......我有以下模块:
build.gradle文件: - App:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleA')
compile project(':ModuleC')
wearApp project(':Wear')
}
ModuleA:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleB')
}
ModuleB:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
ModuleC:与ModuleB相同。
磨损:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
**我只写了重要的一行
我的问题是,如果我使用该配置生成已签名的APK,当我在设备上安装它时,它会因此异常而崩溃:
java.lang.NoSuchFieldError:在类Lcom / package / ClassInJar中没有名称='peer'cignate ='J'的字段;
它在模块A的libs文件夹中的jar中包含的类中崩溃。
如果我在所有模块中将minifyEnabled设置为false,它不会崩溃,但我更喜欢对代码进行模糊处理。如果我在库模块中将minifyEnabled变为true,它就不会编译,它会向我显示这个异常:
Error:Execution failed for task ':ModuleB:proguardRelease'.
java.io.IOException:输出jar为空。你有没有指定正确的'-keep'选项?
答案 0 :(得分:3)
首先,重要的是要了解proguard扮演两个主要卷:
因此,就“缩小”而言,没有必要,即使它可能会在这里和那里为你节省几千字节。你可以把它关掉,一切都会好的。
至于崩溃 - 这是因为您的代码的一部分正在尝试访问一个名称可能已被混淆且因此丢失的类。
尝试为proguard设置规则。可以这样做:
找到'proguard-rules.pro'文件,该文件位于“app”文件夹中的'build.gradle'文件旁边(图片如下)。
< / LI>接下来,您需要为特定的类/类成员/方法/等添加“保持”规则,以便在这些元素上不会发生混淆。您在文件中注释了示例,例如:
-keepclassmembers class fqcn.of.javascript.interface.for.webview { 上市 *; }
这意味着“不要混淆任何在给定班级内公开的班级成员。”
但是,保留有许多变化
有关“保留”变体的更多信息,请参阅链接中的示例(当您单击某个项目时)查看本文档:Keep options。
祝你好运=)