压缩代码和资源

作者: GYLEE | 来源:发表于2017-05-19 22:12 被阅读61次
    低角度拍摄
       这部分内容,自己其实看过很多遍,但是无一例外的是:在若干天后,自己在用到这一方面的内容时,竟然忘了,我怀疑自己有个假脑袋,所以还是记录一下,毕竟再看时会产生相应的联想,有助于理解和记忆。
    

    内容主要来源:官方链接

    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 移除的代码。
    这些文件保存在 <module-name>/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"
        }
    }
    

    相关文章

      网友评论

        本文标题:压缩代码和资源

        本文链接:https://www.haomeiwen.com/subject/frelxxtx.html