通过Gradle为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 中文版》,点此链接可在博文视点官网查看。
                   

时间: 2024-10-29 07:24:23

通过Gradle为APK瘦身的相关文章

APK瘦身记,如何实现高达53%的压缩效果

APK瘦身记,如何实现高达53%的压缩效果       1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律.不过随着移动端技术近两年的飞速发展,一些新的思维方式和优化方法也逐渐涌现和成熟起来.笔者在实践过程中踩过一些坑,收获了一些经验,在这里做个思考和总结,所以随笔给大家,希望对大家从事相关工作的时候有所帮助和参考,同时也是抛砖引玉,希望大家共同探讨这个开放性的话题. 关于为

Android优化系列之apk瘦身

概述 为什么APK要瘦身.APK越大,在下载安装过程中,他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率会越低(因为竞品中,用户有更多机会选择那个体验最好,功能最多,性能最好,包最小的),所以apk的瘦身优化也很重要,本篇博客将讲述apk瘦身的相关内容. 包体分析 在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包 . 可以看到占用空间的主要是代码.图片.资源和lib和assert文件,主要方向精简代码.压缩图片.去

Android APK瘦身实践

因为推广的需要,公司需要把APK的大小再"减小"一下,4M以内! 当达到4M以内之后,公司建议说,能否再压压?2M如何? 瘦身前 因为平时就考虑到大小的限制,所以很多工作已经做过了,如下列举现在的状态: 7.3M(Debug版本)和6.5M(Release版本) 开启minifyEnabled 开启shrinkResources 已经去除不相关的大型库 图片和代码已经经历过粗略的一轮清理 开始魔鬼瘦身 1. tinypng有损压缩 android打包本身会对png进行无损压缩,不信大家

扇贝张志博--APK瘦身的实践与演进

[51CTO.com原创稿件]扇贝是一个全面有效提升英语的移动互联网学习平台,有包括单词.听力.口语.新闻.阅读.炼句在内的六大应用,是目前国内唯一能让用户在移动端完成英语学习整个一套闭环的学习系统. 为什么要做APK瘦身? 一个很现实的事情是,到上个月底有23.49%用户使用移动网络使用App,其中有4.09%用户还在使用2G网络,这是一个很可怕的数字,因为到今天为止仍在使用Android2.3的用户已经是1%甚至连1%都不到的在网用户量,然而使用2G网络用户还有4.09%.因为现在用户使用移

我的Android进阶之旅------&amp;gt;Android APP终极瘦身指南

首先声明,下面文字转载于: APK瘦身实践 http://www.jayfeng.com/2015/12/29/APK%E7%98%A6%E8%BA%AB%E5%AE%9E%E8%B7%B5/ APP终极瘦身指南 http://www.jayfeng.com/2016/03/01/Android-APP%E7%BB%88%E6%9E%81%E7%98%A6%E8%BA%AB%E6%8C%87%E5%8D%97/                                           

Android APP瘦身(清除工程中没用到的资源)详解_Android

清除Android工程中没用到的资源 项目需求一改再改,UI一调再调,结果就是项目中一堆已经用不到但却没有清理的垃圾资源,不说工程大小问题,对新进入项目的人或看其他模块的代码的人来说,这些没清理的资源可能也可能会带来困扰,所以最好还是清理掉这些垃圾,对于一个稍微大一点的工程来说,手工清理明显是不现实的,这就需要一个方法做这些事情. 清理资源文件 要清理没用的资源,首要的工作当然是找到他们,我们知道Anroid SDK中有一个工具叫lint,可以帮助我们查看工程中存在的问题,其中有一项功能就是查找

致Android开发者:APP 瘦身经验总结

随着移动端产品功能的逐渐增加,APP 的体积也不可避免地呈现上升趋势,如果不加以重视,几个版本迭代下来,可能你的 APP 体积会达到用户不能忍受的程度. 如果你是 SDK 开发者,你的 SDK 包大小是用户决定是否采用的关键因素:如果你的APP 想要预装到某款手机或者某款 Android 系统中,APP 的体积也会受到很严格的限制. 因此,APP 的瘦身是每个移动端产品都会遇到的一个普遍问题,本文选自<Android高级进阶>将从不同的角度切入,全面介绍APP 瘦身相关知识. APP 为什么变

Android App瘦身实战

随着业务的快速迭代增长,不断引入新的业务逻辑代码.图片资源和第三方SDK等,很多app都面临一个一个结果,app越来越大,甚至很多无用的代码,包体积的增大带来了很多问题,诸如app启动更慢,代码维护越来越困难.公司业务发展到一定程度之后,重构,代码优化,app瘦身成为不得不做的一个任务.这里以xx外卖app为例给大家讲讲app瘦身过程中常用的几种方法(也都是网上老生常谈的). apk文件构成 我们可以用Zip工具打开APK,一个常见的APK结构如下: 可以看到APK由以下主要部分组成: 文件/目

Android应用瘦身,从18MB到12.5MB

开篇语 前阵子老大交给了我一个任务,主要是帮我们开发的直播应用做 Android 端的安装包瘦身,花了大概一周的时间把安装包从 18MB 减小到了 12.5MB.原本完全可以优化到 10MB 之下,但由于其他原因的限制,所以目前阶段只到 12.5MB 为止.在此记录一下优化的思路和用到的工具,方便自己以后 Review ,有需要的童鞋也可供参考. 瘦身的目的 从目的导向来看,我们是不会无缘无故去做一件事情的,那我们对应用瘦身的目的是为了什么?答案是:提高下载转化率.什么是下载转化率?举个栗子:你