【问题标题】:Why is the release .apk smaller than th debug .apk为什么发布 .apk 小于调试 .apk
【发布时间】:2020-03-04 15:05:51
【问题描述】:

在我的应用示例中,debug apk 为 20Mbs(升级 Gradle 版本和 Gradle Plugin 版本后为 13Mbs),而 release apk 仅为 5Mb。这是为什么呢?

在 build.gradle 文件中,buildTypes 部分保持不变,因此 R8 编译器或 ProGuard 没有进行任何优化/缩小。

android {
    ...
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

发布:

调试:

您可以在lib 文件夹等中看到大小的巨大差异。

【问题讨论】:

    标签: android android-studio gradle apk


    【解决方案1】:

    除了 ProGuard 和 R8 之外,在发布构建期间还有更多优化。根据文档https://developer.android.com/studio/build/shrink-code.html

    当您使用 Android Gradle 插件 3.4.0 或更高版本 构建项目时,该插件不再使用 ProGuard 来执行编译时代码优化。相反,该插件与 R8 编译器一起处理以下编译时任务:

    代码收缩(或 tree-shaking): 检测并安全地从您的应用及其库依赖项中删除未使用的类、字段、方法和属性(使其成为解决 64k 问题的宝贵工具参考限制)。例如,如果您仅使用库依赖项的少数 API,则收缩可以识别您的应用程序未使用的库代码,并仅从您的应用程序中删除该代码。要了解更多信息,请转到有关如何缩减代码的部分。

    资源缩减:从打包的应用中移除未使用的资源,包括应用的库依赖项中未使用的资源。它与代码收缩结合使用,这样一旦删除了未使用的代码,任何不再引用的资源也可以安全地删除。要了解更多信息,请转到有关如何缩减资源的部分。

    混淆:缩短类和成员的名称,从而减少 DEX 文件的大小。要了解更多信息,请转到有关如何混淆代码的部分。

    优化:检查并重写您的代码,以进一步减小您应用的 DEX 文件的大小。例如,如果 R8 检测到给定 if/else 语句的 else {} 分支从未被采用,则 R8 会删除 else {} 分支的代码。要了解更多信息,请转到代码优化部分。

    【讨论】:

    • 是的,我看过开发者页面。但它的制定方式让我相信必须启用它才能使这些优化生效。它在代码 sn-p 中说得对:仅针对项目的发布构建类型启用代码收缩、混淆和优化:minifyEnabled true。在我的情况下这是错误的。
    • " 但是,使用Android Studio新建项目时,默认不启用缩容、混淆和代码优化"
    • 当您构建发布版 apk 时,有一个名为 zipalign 的步骤发生在 apk 签名之前。这一步会压缩所有内容并缩小尺寸developer.android.com/studio/command-line/zipalign
    • 在分析 APK 后,调试版的 lib 文件夹大小为 32Mb,而发布版的 lib 文件夹大小为 1.7Mb。仅此一项真的会造成所有这些尺寸差异吗?
    • 这是因为在您的调试版本中,它包含了一些 androidTest 依赖项,这些依赖项不会包含在发布版本中
    猜你喜欢
    • 1970-01-01
    • 2019-11-29
    • 2017-01-30
    • 1970-01-01
    • 2021-04-23
    • 2020-09-16
    • 2019-10-02
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多