当我没有缩小我的应用程序时,我达到最大方法计数并且构建dex文件失败。在minify
中启用build.gradle
可以避免这种情况。然而,缺点是现在代码被混淆了。这对于Release版本是可以的,但是对于Debug构建来说这是有问题的。
有没有办法告诉gradle缩小Debug构建但不混淆它?
答案 0 :(得分:22)
是的,您可以使用ProGuard来缩小调试版本。
关键是在ProGuard配置中使用-dontobfuscate
选项进行调试构建。
在build.gradle
:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
debug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro',
'proguard-rules-debug.pro'
}
}
将您的版本ProGuard配置写入proguard-rules.pro
。
使用相同的配置进行发布和调试。这样您就可以确保不会删除任何必要的代码。调试缩小并不会破坏构建。
为调试版本添加额外的ProGuard配置文件proguard-rules-debug.pro
。它应该包含仅用于调试的规则。在这种情况下,只添加:
-dontobfuscate
答案 1 :(得分:3)
一个简单的解决方案是在构建配置中添加minifyEnabled true
和useProguard false
。但是,不建议从官方文档 调试构建代码缩减请注意,代码缩小会减慢构建时间,因此如果可能,应避免在调试版本中使用它。
参考https://developer.android.com/studio/build/shrink-code.html
答案 2 :(得分:3)
Tomik的回答在技术上是正确的,但它不支持在构建中使用Instant Run。正如official guide on code-shrinking中指出的那样:
使用即时运行启用代码收缩如果代码收缩很重要 在逐步构建应用程序时,请尝试实验 代码缩减器,内置于Gradle的Android插件中。这个 与ProGuard不同,收缩器支持Instant Run。
您可以使用相同的方式配置Android插件收缩器 配置文件为ProGuard。但是,Android插件缩小了 不会混淆或优化您的代码 - 它只会删除未使用的代码。 因此,您应该仅将它用于调试版本,并启用ProGuard 对于你的发布版本,所以你的发布APK的代码是混淆的 优化
所以正确的解决方案是设置你的调试版本:
android {
buildTypes {
debug {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
这样,调试版本中的代码不会得到优化也不会被混淆,但会缩小。这在使用Instant Run时也适用。
答案 3 :(得分:3)
minifyEnabled true
只是以下操作的快捷方式:
postprocessing {
removeUnusedCode true
obfuscate true
optimizeCode true
}
因此,如果您要缩小而不混淆,请用以下内容替换minifyEnabled true
:
postprocessing {
removeUnusedCode true
obfuscate false // <--
optimizeCode true
}
此外,如果您有shrinkResources true
,编译器也会抱怨。等效的后处理字段为removeUnusedResources true
,即:
postprocessing {
removeUnusedCode true
removeUnusedResources true // <--
obfuscate false
optimizeCode true
}
与其他答案相反,useProguard false
不禁止混淆;它将混淆引擎从ProGuard更改为R8。