`

通过Gradle为APK瘦身

阅读更多

引言:在过去几年中,APK 文件的大小曾急剧增长态势。一般来说,其原因如下:Android开发者获取了更多的依赖库,添加了更多的密度,Apps 增加了更多的功能。但实际上我们应该让APKs 尽可能的小,更小的APK 意味着用户可以更快地下载和安装应用,并使它占用更小的内存。 
本文选自《Gradle for Android 中文版》,将研究如何设置Gradle 构建配置文件中的几个属性,以缩小APK 文件。

ProGuard

  ProGuard 是一个Java 工具,其不仅可以缩减APK 文件大小,还可以在编译期优化、混淆和预校验你的代码。其通过你应用的所有代码路径,来找到未被使用的代码,并将其删除。 
  ProGuard 还会重命名你的类和字段。这一过程将保留应用的踪迹,让反编译工程师更加难以读懂代码。 
  在Gradle 的Android 插件中,其构建类型下面有一个叫作minifyEnabled 的布尔类型属性,你需要将它设置为true 来激活ProGuard :

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

  当minifyEnabled 被设置为true 后,在构建过程中,proguardRelease task 会被执行,并调用ProGuard。 
  在激活ProGuard 之后,应重新测试整个应用,因为ProGuard 可能会移除一些你仍需要使用的代码。这也是很多开发者不喜欢ProGuard 的原因。为了解决这个问题,你可以定义ProGuard 规则,排除那些被删除或混淆的类。我们可以使用proguardFiles 属性来定义包含ProGuard 规则的文件。例如,为了保留一个类,你可以像下面这样添加一条简单的规则:

-keep public class <MyClass>

  getDefaultProguardFile(‘proguard-android.txt’) 方法从Android SDK 的tools/proguard 文件夹下的proguard-android.txt 文件中获取默认的ProGuard 设置。 
  在Android Studio 中,proguard-rules.pro 文件被默认添加到新的Android 模块,所以你可以在该文件中简单地添加一些针对该模块的规则。

提示:你构建的每个应用或依赖库都有不同的ProGuard 规则,所以在本书中,我们不会考虑更多的细节。如果你想了解更多关于ProGuard和ProGuard规则的信息,则可以通过http://developer.android.com/tools/help/proguard.html. 来查阅AndroidProGuard 的官方文档。除了缩减Java 代码外,还可以缩减使用过的资源。

缩减资源

  当给App 打包时,Gradle 和Gradle 的Android 插件可以在构建期间删除所有未使用的资源。如果你有旧的资源忘记删除,那么这个功能可能非常有用。另外一个使用案例是当你导入一个拥有很多资源的依赖库,而你只使用了其中的一小部分时,你可以通过激活缩减资源来解决这个问题。缩减资源的方式有两种:自动和手动。

自动缩减

  最简单的方式是在你的构建中设置shrinkResources 属性。如果设置该属性为true,则Android 构建工具将自动判定哪些资源没有被使用,并将它们排除在APK 外。使用此功能有一个要求,即必须同时启动ProGuard。这是因为缩减资源的工作方式是,直到代码引用这些资源被删除之前,Android 构建工具不能指出哪些资源没有被用到。 
  下面的代码片段展示了在某个构建类型中,如何配置自动化资源缩减:

android {
       buildTypes {
       release {
             minifyEnabled = true
             shrinkResources = true
             }
       }
}

  如果你想看看在激活了自动化资源缩减之后,APK 缩减了多少,则可以运行shrink-ReleaseResources 任务。该任务会打印出包的大小缩小了多少:

:app:shrinkReleaseResources
Removed unused resources: Binary resource data reduced from 433KB
to 354KB: Removed 18%

  你可以通过在构建命令中添加 –info 标志,来获得APK 缩减资源的概览:

$ gradlew clean assembleRelease –nfo

  当你使用该标志时,Gradle 会打印出许多关于构建过程的额外信息,包括最终构建不会输出的每个资源。 
  自动资源缩减有一个问题,即它可能移除了过多的资源,特别是那些被动态使用的资源可能被意外删除。为了防止这种情况的发生,你可以在res/raw/ 下的一个叫作keep.xml的文件中定义这些例外。一个简单的keep.xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/keep_me,@layout/also_used_*"/>

  keep.xml 文件自身也将从最终的结果中被剥离出来。

手动缩减

  去除某种语言文件或某个密度的图片,是删减资源的一种比较好的方式。一些依赖库,例如Google Play Services,其包含了多种语言。如果你的应用只支持一两种语言,那么在最终的APK 中,包含所有语言的文件就会浪费许多资源。这时你就可以使用resConfigs 属性来配置你想保留的资源,将其余部分删除。 
  如果你只想保留英语、丹麦语和荷兰语的字符串,则可以这样使用resConfigs :

android {
    defaultConfig {
          resConfigs “en", “da", “nl"
    }
}

  你也可以这样处理密度集合:

android {
    defaultConfig {
          resConfigs “hdpi", “xhdpi", “xxhdpi", “xxxhdpi"
    }
}

  你甚至可以结合语言和密度。实际上,使用此属性可以限制每一种类型的资源。 
  如果设置ProGuard 让你感觉很困难,或者你仅仅想在应用中去除不支持的语言资源或密度,那么你可以使用resConfigs 来缩减资源。 
  本文选自《Gradle for Android 中文版》,点此链接可在博文视点官网查看。 
                   图片描述

 

分享到:
评论

相关推荐

    thinApkFile,去除apk中无用文件以减小apk大小的gradle插件.zip

    "thinApkFile"是一个开源的Gradle插件,专门用于去除APK中的无用文件,从而实现APK的瘦身。这个插件利用先进的分析技术,识别并移除那些在运行时不必要的资源和库,有助于提高应用的分发效率。 首先,了解...

    Android代码-apk 瘦身之去除 R.class

    ThinR gradle plugin Other languages: [简体中文] (README.zh-cn.md) . ThinR plugin introduce This tool will remove all the class in R.java except the styleable class and replace the referance into ...

    Apk 全面瘦身详解

    本文将详细讲解Apk瘦身的各种策略,从理解Apk的包结构开始,探讨如何进行有效的优化。 首先,了解Apk的包结构是优化的第一步。Apk主要包含以下几个部分: 1. **lib/** 目录:存放针对不同CPU架构的.so库文件,通常...

    基于AndResGuard开源库对apk进行无用资源删除、重复资源删除、大图检测

    AndResGuard会将这些无用资源剔除,从而实现APK瘦身。 三、重复资源删除 在大型项目中,由于团队协作或历史原因,可能会存在多个相同或相似的资源。AndResGuard可以检测并合并这些重复资源,消除冗余,进一步减小...

    Facebook 出品的 apk 包优化工具 redex.zip

    Redex是一款由Facebook开发并开源的Android应用优化框架,它通过对APK中的DEX(Dalvik字节码)文件进行一系列的优化操作,如代码混淆、资源压缩、删除无用代码等,来实现对APK的瘦身。这些优化步骤包括但不限于: -...

    王栋栋_周报_AndroidAPK相关总结_20190809.doc

    Apk瘦身是优化应用体积的过程,其主要目标是提高用户的下载体验,减少下载时间和数据消耗。瘦身主要包括以下几个方面: 1. **代码混淆**:正如前面提到的,启用代码混淆可以删除不必要的代码,同时用无意义的名称...

    360°全方面性能调优.pdf

    此外,文档还提到了APK大小优化,包括APK瘦身技术、微信资源混淆原理和屏幕适配策略。APK瘦身是一个重要的优化方向,特别是在应用市场对应用大小有严格限制的情况下。微信资源混淆原理解释了如何通过混淆技术来减少...

    25.2.3tools.zip

    Gradle允许更灵活的依赖管理和构建配置,同时简化了多APK变种的生成,如针对不同Android API级别或设备配置的APK。"25.2.3tools.zip"可能包含了与Unity 2018兼容的Gradle模板和配置文件,帮助开发者更高效地打包应用...

    giftems-chapter04.rar

    这一章会讲解如何使用ProGuard和R8进行代码混淆,保护应用安全,以及如何进行资源压缩和APK瘦身,减小应用体积。此外,还会涉及内存泄漏检测和性能监控,帮助开发者发现并解决潜在的问题。 最后,我们不会忽视版本...

    AndroidStudio实战快速高效地构建Android应用 AndroidStudio 高清完整带目录书签 PDF AndroidStudio实战

    10. **Android性能优化**:介绍内存管理、CPU优化、启动速度提升、APK瘦身等实践策略,以及使用Android Profiler进行性能分析。 11. **发布与分发**:讲解如何签名APK,通过Google Play Store或其他分发渠道发布...

    java心得分享技术文章总结.pdf

    - Gradle构建优化和APK瘦身实践 - 组件化开发,包括路由设计和最佳实践 4. **编程和职业发展**: - Android新手学习APP开发的指南 - 程序员的求职经验分享,包括面试技巧和面试经历 - 职场晋升策略,对比印度...

    size-analyzer,Size Analyzer是一个帮助开发人员找到如何减小Android应用程序大小的技巧的工具。.zip

    Size Analyzer是一款专为Android开发者设计的工具,旨在帮助他们深入理解应用的大小构成,并提供有效的方法来减小程序包的体积。这款开源项目旨在优化应用程序的性能,提高用户体验,同时节省用户的存储空间。以下是...

    Android特刊3

    此外,可能讨论了性能优化技巧,如内存管理、耗电优化和APK瘦身策略。最后,可能还会涉及Android测试,包括单元测试、集成测试和 Espresso UI 测试。 《Android特刊3》全面地探索了Android开发的各个方面,无论你是...

    ThinkAndroid

    8. **性能优化**:项目可能包含了内存优化、渲染优化、APK瘦身等实践,这些都是提升应用体验的关键。 9. **测试与调试**:可能包含JUnit测试用例和 Espresso UI测试,以及调试技巧,帮助开发者构建健壮的应用。 10...

    android完整一套的学习资料

    了解内存泄漏检测、耗电优化、APK瘦身等技巧,以及使用Systrace、Traceview、Profile GPU Rendering等工具进行性能分析,对于提升应用质量和用户体验至关重要。 十二、Android测试 包括单元测试、UI测试、性能测试...

    Android开源大全(史上最全).rar

    6. **性能优化**:例如,学习如何利用Systrace、Traceview进行性能分析,理解内存泄漏检测和避免方法,以及如何进行APK瘦身。 7. **安全与隐私**:通过开源项目了解Android安全机制,如权限管理、加密通信、漏洞...

    传智播客_Andorid_Android基础视频video_第六天修

    11. **资源优化**:包括图片压缩、代码混淆、APK瘦身等,以提高应用性能和下载速度。 12. **Gradle构建系统**:学习如何使用Gradle构建和管理Android项目,包括依赖管理、多模块项目构建等。 这些只是Android开发...

    android编程权威指南第二版(英文)

    13. **App性能优化**:探讨了内存管理、UI流畅性、电量优化以及APK瘦身等提高应用性能的策略。 附带的"源码"文件提供了书中示例代码,让读者能够直接运行和实践,加深对概念的理解。通过实际操作,开发者可以更好地...

    android入门学习资料中文版(8本).rar

    书中将介绍性能优化的策略,如内存管理、耗电优化、代码效率提升、UI流畅度改善、APK瘦身等,帮助开发者打造高质量的应用。 5. **《Android组件化与插件化开发》**: 这部分会讲解如何进行模块化、组件化和插件化...

    Android系统应用-2023-2024学年第二学期源代码.rar

    13. **性能优化**:包括内存管理、APK瘦身、UI流畅度提升和电量优化等,这些都是提升用户体验的关键。 14. **Gradle构建系统**:了解如何使用Gradle脚本来配置项目依赖、版本管理和构建过程,是每个Android开发者...

Global site tag (gtag.js) - Google Analytics