压缩代码和资源

压缩代码和资源_第1张图片
低角度拍摄
   这部分内容,自己其实看过很多遍,但是无一例外的是:在若干天后,自己在用到这一方面的内容时,竟然忘了,我怀疑自己有个假脑袋,所以还是记录一下,毕竟再看时会产生相应的联想,有助于理解和记忆。

内容主要来源:官方链接

1.目的

尽可能的减少 APK 的大小,所以应该在应用中启用 压缩 来移除在版本构建中未使用的代码和资源。

  • 1.代码压缩
    代码压缩通过ProGuard 提供,ProGuard 会检测和移除封装应用中未使用的字段方法属性,包括自带代码库中的未使用项(这使其成为以变通方式解决 64k 引用限制)。ProGuard 还可优化字节码,移除未使用的代码指令,以及用短名称混淆其余的类字段方法。混淆过的代码可令您的 APK 难以被逆向工程,这在应用使用许可验证等安全敏感性功能时特别有用。

  • 2.资源压缩
    资源压缩通过 Gradle 的 Android 插件实现,该插件会移除封装应用中未使用的资源,包括代码库中未使用的资源。它可与代码压缩发挥协同效应,使得在移除未使用的代码后,任何不再被引用的资源也能安全地移除。

2 . 代码压缩

要通过 ProGuard 启用代码压缩,请在 build.gradle文件内相应的构建类型中添加 minifyEnabled true

注意: 代码压缩会拖慢构建速度,因此您应该尽可能避免在调试构建中使用

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

proguard-android.txt 文件位置:Android SDK 文件目录 tools/proguard/
proguard-rules.pro 文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录(build.gradle 文件旁)

每次构建时 ProGuard 都会输出下列文件:
dump.txt
说明 APK 中所有类文件的内部结构。
mapping.txt
提供原始与混淆过的类、方法和字段名称之间的转换。
seeds.txt
列出未进行混淆的类和成员。
usage.txt
列出从 APK 移除的代码。
这些文件保存在 /build/outputs/mapping/release/ 中

  • ** 自定义保留的代码**
    要修正错误并强制 ProGuard 保留特定代码,请在 ProGuard 配置文件中添加一行 -keep代码。例如:
    -keep public class MyClass

2 . 资源压缩

资源压缩只与代码压缩协同工作。代码压缩器移除所有未使用的代码后,资源压缩器便可确定应用仍然使用的资源。这在您添加包含资源的代码库时体现得尤为明显 - 您必须移除未使用的库代码,使库资源变为未引用资源,才能通过资源压缩器将它们移除。

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

如果您尚未使用代码压缩用途的 minifyEnabled 构建应用,请先尝试使用它,然后再启用 shrinkResources,因为您可能需要编辑 proguard-rules.pro 文件以保留动态创建或调用的类或方法,然后再开始移除资源。

2 . 移除未使用的备用资源

Gradle 资源压缩器只会移除未被您的应用代码引用的资源,这意味着它不会移除用于不同设备配置的备用资源。必要时,您可以使用 Android Gradle 插件的 resConfigs属性来移除您的应用不需要的备用资源文件。
栗子:
如果您使用的库包含语言资源(例如使用的是 AppCompat 或 Google Play 服务),则 APK 将包括这些库中消息的所有已翻译语言字符串,无论应用的其余部分是否翻译为同一语言。如果您想只保留应用正式支持的语言,则可以利用 resConfig 属性指定这些语言。系统会移除未指定语言的所有资源。
下面这段代码展示了如何将语言资源限定为仅支持英语和法语:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}

你可能感兴趣的:(压缩代码和资源)