Rob*_*erV 12 obfuscation android proguard gradle android-studio
我有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')
}
Run Code Online (Sandbox Code Playgroud)
ModuleA:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile project(':ModuleB')
}
Run Code Online (Sandbox Code Playgroud)
ModuleB:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
ModuleC:与ModuleB相同.
穿:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
**我只写了重要的一行
我的问题是,如果我使用该配置生成已签名的APK,当我将其安装在设备上时,它会因此异常而崩溃:
java.lang.NoSuchFieldError:类Lcom/package/ClassInJar中没有name ='peer'cignate ='J'的字段;
它在模块A的libs文件夹中的jar中包含的类中崩溃.
如果我在所有模块中将minifyEnabled设置为false,它不会崩溃,但我更喜欢混淆代码.如果我在库模块中将minifyEnabled变为true,它就不会编译,它会向我显示以下异常:
Error:Execution failed for task ':ModuleB:proguardRelease'.
Run Code Online (Sandbox Code Playgroud)
java.io.IOException:输出jar为空.你有没有指定正确的'-keep'选项?
小智 3
首先,重要的是要了解 proguard 有两个主要作用:
因此,就“缩小”而言,这是没有必要的,尽管它可能会在各处节省几千字节。你也许可以把它关掉,一切都会好起来的。
至于崩溃- 发生这种情况是因为您的代码的一部分正在尝试访问一个其名称可能被混淆并因此丢失的类。
尝试为混淆器设置规则。可以这样做:
接下来,您需要为特定类/类成员/方法/等添加“保留”规则,以便这些元素上不会发生混淆。您在文件中注释掉了示例,例如:
-keepclassmembers 类 fqcn.of.javascript.interface.for.webview { public *; }
这意味着“不要混淆给定类中公开的任何类成员。
但是,要塞有很多变化。
有关“保留”变体的更多信息,请查看此文档以及链接中的示例(当您单击某个项目时):保留选项。
祝你好运=)
| 归档时间: |
|
| 查看次数: |
2327 次 |
| 最近记录: |