当我没有缩小我的应用程序时,我达到最大方法计数并且构建dex文件失败。这可以通过在minify
中启用build.gradle
来避免。然而,缺点是现在代码被混淆了。这对于Release版本是可以的,但是对于Debug构建来说这是有问题的。
有没有办法告诉gradle缩小Debug构建但不混淆它?
是的,您可以使用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
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。
Tomik的答案在技术上是正确的,但它不支持在构建中使用Instant Run。正如official guide on code-shrinking所指出:
使用即时运行启用代码缩减如果在逐步构建应用程序时代码缩小对您很重要,请尝试内置于Gradle的Android插件中的实验性代码缩减器。与ProGuard不同,此收缩器支持Instant Run。
您可以使用与ProGuard相同的配置文件配置Android插件缩小器。但是,Android插件缩小器不会混淆或优化您的代码 - 它只会删除未使用的代码。因此,您应该仅将它用于调试版本,并为您的版本构建启用ProGuard,以便对您的版本APK代码进行模糊处理和优化。
所以正确的解决方案是设置你的调试版本如下:
android {
buildTypes {
debug {
minifyEnabled true
useProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'),
'proguard-rules.pro'
}
}
这样,调试版本中的代码不会得到优化也不会被混淆,但会缩小。这在使用Instant Run时也适用。
一个简单的解决方案是在构建配置中添加minifyEnabled true
和useProguard false
。但是,建议不要将代码缩减用于官方文档的调试版本。请注意,代码缩小会减慢构建时间,因此如果可能,应避免在调试版本中使用它。参考https://developer.android.com/studio/build/shrink-code.html