缩小Android应用程序,但不要混淆它

时间:2016-03-07 20:41:33

标签: android gradle proguard

当我没有缩小我的应用程序时,我达到最大方法计数并且构建dex文件失败。在minify中启用build.gradle可以避免这种情况。然而,缺点是现在代码被混淆了。这对于Release版本是可以的,但是对于Debug构建来说这是有问题的。

有没有办法告诉gradle缩小Debug构建但不混淆它?

4 个答案:

答案 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 trueuseProguard 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。