通过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 中文版》,点此链接可在博文视点官网查看。
通过Gradle为APK瘦身的更多相关文章
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
- APK瘦身实践
首发地址:http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ 因为推广的需要,公司需要把APK的大小再 ...
- APK瘦身
APK瘦身 主要从一下三方面来瘦身: 1. Java 源代码 1) ,这方面主要是通过最简洁的代码实现最直接的功能,还有就是提出上线前不必要的java代码,可以使用UCDector进行分析,从而对代码 ...
- Android APK 瘦身 - JOOX Music项目实战
导语 JOOX Music是腾讯海外布局的一个音乐产品,2014年发布以来已经成为5个国家和地区排名第一的音乐App.东南亚是JOOX Music的主要发行地区,由于JOOX Music所面对的市场存 ...
- Android性能优化系列之apk瘦身
Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...
- APK瘦身-是时候给App进行减负了
前言 APK瘦身即是对APK大小进行压缩策略,减小APK安装包大小,更小的安装包更有助于吸引用户安装.前一段时间我司某一App进行APK的瘦身,最终也达到了减小10M的目标,现做一个简单的总结记录. ...
- APK瘦身记,怎样实现高达53%的压缩效果
作者:非戈@阿里移动安全,很多其它技术干货.请訪问阿里聚安全博客 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式.关于这个话题事实上是一个老生常谈的题目.不论是公司内部.还是外 ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
随机推荐
- 《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者@ucag注:大家好,我是新来的翻译, ...
- 札记:android手势识别,MotionEvent
摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势T ...
- CRC、反码求和校验 原理分析
3月份开始从客户端转后台,算是幸运的进入全栈工程师的修炼阶段.这段时间一边是老项目的客户端加服务器两边的维护和交接,一边是新项目加加加班赶工,期间最长经历了连续工作三天只睡了四五个小时的煎熬,人生也算 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- 一道返回num值的小题目
题目描述: 实现fizzBuzz函数,参数num与返回值的关系如下: .如果num能同时被3和5整除,返回字符串fizzbuzz .如果num能被3整除,返回字符串fizz .如果num能被5整除,返 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(64)-WebApi与Unity注入
系列目录 前言: 有时候我们系统需要开放数据给手机App端或其他移动设备,不得不说Asp.net WebApi是目前首选 本节记录Asp.net MVC WebApi怎么利用Unity注入.系列开头已 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- Hawk 5.1 数据导入和导出
除了一般的数据库导入导出,Hawk还支持从文件导入和导出,支持的文件类型包括: Excel CSV(逗号分割文本文件) TXT (制表符分割文本文件) Json xml Excel 目前来看,Exce ...
- potrace源码分析一
1 简介 potrace是由Dalhousie University的Peter Selinger开发一款位图轮廓矢量化软件,该软件源码是可以公开下载的,详细见项目主页:http://potrace. ...
- 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范
昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...