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

ProGuard

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

android {buildTypes {release {minifyEnabled trueproguardFiles 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 = trueshrinkResources = 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 中文版》,点此链接可在博文视点官网查看。 
                   

通过Gradle为APK瘦身相关推荐

  1. Android Gradle实用技巧/如何自动为APK瘦身

    <Android Gradle 权威指南>终于发售上市了,这本书里包含了很多实用技巧.实战经验以及原理分析,今天这篇文章主要介绍下如何自动为APK瘦身的. 随着工程越来越大,功能越来越多, ...

  2. APK瘦身记,怎样实现高达53%的压缩效果

    作者:非戈@阿里移动安全,很多其它技术干货.请訪问阿里聚安全博客 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式.关于这个话题事实上是一个老生常谈的题目.不论是公司内部.还是外 ...

  3. 老司机谈APK瘦身套路-项目优化篇

    老司机谈APK瘦身套路-项目优化篇 在上一篇文章中,老司机带领大家一起学习了图片资源的瘦身套路,收到了很多中学生读者的好评. 想了解的童鞋请点击:blog.csdn.net/mynameishua-  ...

  4. Android优化系列之apk瘦身

    概述 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好 ...

  5. Android性能优化之APK瘦身最全总结

    Android性能优化之APK瘦身最全总结 随着业务复杂度的逐渐增加,代码.资源也在不断的增加,此时你的APP大小也在增加.从用户层面来说,面对动辄几十兆的APP来说在非WIFI情况下还是会犹豫要不要 ...

  6. androidstudio打包apk 文件_每天一个小知识——APK瘦身

    唯有美食 不可辜负 温度与风度同在,它虽然地处边角.远离喧嚣,但是到处都满载着精彩,周围弥漫着优雅的闲情逸致. Android性能优化之APK瘦身 面试中面试官常常会问道有关性能优化的问题,而性能优化 ...

  7. APK瘦身-是时候给App进行减负了

    前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装.前一段时间我司某一App进行APK的瘦身,最终也达到了减小10M的目标,现做一个简单的总结记录. ...

  8. Android 性能优化(62)---存检测、卡顿优化、耗电优化、APK瘦身——详解篇

    Android 性能优化,内存检测.卡顿优化.耗电优化.APK瘦身--详解篇 自2008年智能时代开始,Android操作系统一路高歌,10年智能机发展之路,如今 Android 9.0 代号P  都 ...

  9. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  10. [Android 之美] 那些你不知道的APK 瘦身,让你的APK更小

    [Android 之美] APK 瘦身,减少APK的大小 让我们的apk文件尽可能更小,移除那些未使用的代码和资源文件.本章节介绍了如何做到让APK更小,性能更好,下载转化率会更高,以及如何指定在构建 ...

最新文章

  1. 使用 XML 时尽量避免使用的技术
  2. 微软网站打不开_强烈建议收藏,微软出了自家「协作白板」应用
  3. mac 苹果多版本jdk自由切换
  4. 扩展用户体验之操作栏ActionBar
  5. 机器学习(三十六)——Integrating Learning and Planning(2)
  6. sys.modules[__name__]的一个实例
  7. java将json转为hashmap_java – 将JSON字符串转换为HashMap
  8. Python3并发编程-多线程threading怎么用?
  9. 苹果iOS 13重大更新曝光:暗黑主题即将到来
  10. 奕东电子深交所上市:市值115亿 小米产业基金是股东
  11. 程序员如何高效准备简历和面试06:使用STAR法则表现自己
  12. 高中数学,解析几何高考压轴题解题技巧
  13. CAD制图教程:CAD软件中怎么画圆弧梯段?
  14. 计算机和工业设计哪个就业前景大,工业设计就业前景女生
  15. Vue中的keep-alive组件
  16. 成功解决:fatal: detected dubious ownership in repository at ‘E:/workspace/CSMarket‘。如何使用git工具通过命令行的形式
  17. 酷我音乐 linux,GitHub - weakish/kwplayer: 酷我音乐盒的 Gtk/Linux 实现
  18. 精读《Spring 概念》
  19. 曾惊动中国大使馆的欧洲专利流氓迎来中国企业的连续痛击
  20. leetcode简单之597.好友申请I:总体通过率

热门文章

  1. PS把一张白纸里的黑色图形抠出来
  2. 关于审核被拒申诉那点事
  3. php gd实现简单图片验证码与图片背景文字水印
  4. leetcode 1037. 有效的回旋镖(Valid Boomerang)
  5. leetcode 算法 Excel表列序号 python实现
  6. 《我们不一样团队》项目需求分析改进
  7. jabc spring
  8. mybatis使用oracle自动生成主键
  9. fork( )函数(转载)
  10. [SAP ABAP开发技术总结]选择屏幕——各种屏幕元素演示