android - 为什么发行版.apk小于调试.apk

标签 android android-studio gradle apk

在我的应用程序示例中,调试apk为20Mbs(升级Gradle版本和Gradle插件版本后为13Mbs),而发布apk仅为5Mb。这是为什么?

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

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

释放:
release classes.dex --> 2.6Mb lib ---> 1.7Mb

调试:
debug classes.dex --> 3.4Mb lib ---> 32.2Mb

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

最佳答案

除了ProGuard和R8之外,在发行版本期间还会进行更多优化。根据文档https://developer.android.com/studio/build/shrink-code.html

When you build you project using Android Gradle plugin 3.4.0 or higher, the plugin no longer uses ProGuard to perform compile-time code optimization. Instead, the plugin works with the R8 compiler to handle the following compile-time tasks:



代码收缩(或摇树):从应用程序及其库依赖项中检测并安全删除未使用的类,字段,方法和属性(使其成为解决64k引用限制的有值(value)的工具)。例如,如果仅使用几个具有库依赖关系的API,则收缩可以识别您的应用程序未使用的库代码,并仅从您的应用程序中删除该代码。要了解更多信息,请转到有关如何缩减代码的部分。

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

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

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

关于android - 为什么发行版.apk小于调试.apk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60529016/

相关文章:

java - Android 中的问答游戏无法获得分数

android - Jenkins在Debian服务器上,无法安装Gradle

android - 展开 View 下方的布局不可见?

java - Android Studio 3.6 Canary 12 XML 布局无法解析

android .so 文件未在/data/data/<package>/lib 中提取

android - 即时运行比标准构建需要更长的时间

java - Gradle jar 任务 : what is includes path pattern relative to?

android - Eclipse 无法将 android 项目导出到基于 gradle 的

android - 使用导航 View 的子菜单未被选中

java - 用 Dagger 改造类的 HashMap