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

20 android proguard gradle

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

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

Tom*_*mik 27

是的,您可以使用ProGuard来缩小调试版本.

关键是-dontobfuscate在ProGuard配置中使用选项进行调试构建.

使用此设置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'
    }
}
Run Code Online (Sandbox Code Playgroud)

将您的发布ProGuard配置写入proguard-rules.pro.

使用相同的配置进行发布和调试.这样您就可以确保不会删除任何必要的代码.调试缩小不会破坏构建.

proguard-rules-debug.pro为调试版本添加额外的ProGuard配置文件.它应该包含仅用于调试的规则.在这种情况下只添加:

-dontobfuscate
Run Code Online (Sandbox Code Playgroud)


And*_*Sun 16

minifyEnabled true
Run Code Online (Sandbox Code Playgroud)

只是以下方面的捷径:

postprocessing {
    removeUnusedCode true
    obfuscate true
    optimizeCode true
}
Run Code Online (Sandbox Code Playgroud)

因此,如果要缩小而不混淆,请替换minifyEnabled true为:

postprocessing {
    removeUnusedCode true
    obfuscate false // <--
    optimizeCode true
}
Run Code Online (Sandbox Code Playgroud)

此外,如果您有,编译器也会抱怨shrinkResources true。等效的后处理字段为removeUnusedResources true,即:

postprocessing {
    removeUnusedCode true
    removeUnusedResources true // <--
    obfuscate false
    optimizeCode true
}
Run Code Online (Sandbox Code Playgroud)

与其他答案相反,useProguard false 不禁用混淆;它将混淆引擎从ProGuard更改为R8。


Muh*_*bar 5

一个简单的解决方案是在构建配置中添加minifyEnabled true和。useProguard false但不建议对官方文档的调试构建进行代码收缩。请注意,代码收缩会减慢构建时间,因此如果可能,应避免在调试构建中使用它。 参考https://developer.android.com/studio/build/shrink-code.html


MrM*_*fen 5

Tomik 的答案在技术上是正确的,但它不支持在构建中使用Instant Run 。正如关于代码收缩的官方指南中指出的:

\n\n
\n

通过 Instant Run 启用代码收缩 如果在增量构建应用程序时代码收缩对您很重要,请尝试内置于 Gradle 的 Android 插件中的实验性代码收缩器。与 ProGuard 不同,此收缩器支持 Instant Run。

\n\n

您可以使用与 ProGuard 相同的配置文件来配置 Android 插件收缩器。但是,Android 插件收缩器\n 不会混淆或优化您的代码\xe2\x80\x94,它只会删除未使用的代码。\n 因此,您应该仅将它用于调试版本,并为您的发布版本启用 ProGuard\n,以便您的发布 APK 的代码已被混淆并\n 优化。

\n
\n\n

因此,正确的解决方案是像这样设置调试版本:

\n\n
android {\n    buildTypes {\n        debug {\n            minifyEnabled true\n            useProguard false\n            proguardFiles getDefaultProguardFile(\'proguard-android.txt\'),\n                    \'proguard-rules.pro\'\n        }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样,调试版本中的代码不会得到优化或混淆,但会缩小。这也适用于使用Instant Run时。

\n