繁体   English   中英

为什么 release .apk 比 th debug .apk 小

[英]Why is the release .apk smaller than th debug .apk

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

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

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

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

调试: 调试 classes.dex --> 3.4Mb 库 ---> 32.2Mb

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM