首页 存档 技术 查看内容

Android安装包相关知识汇总

2018-3-30 13:00 |来自: 互联网 321 0

摘要: 用户抱怨安装包越来越大?印度友人反馈装不上微信?欢迎来到本期的走进科学--安装包速成记。做一个有节操的安装包,我们希望它越小越好,并且确保用户都能安装的上。 Android的安装包,简单来说就是一个压缩包,首先 ...

用户抱怨安装包越来越大?印度友人反馈装不上微信?欢迎来到本期的走进科学--安装包速成记。做一个有节操的安装包,我们希望它越小越好,并且确保用户都能安装的上。

Android的安装包,简单来说就是一个压缩包,首先我们了解一下它的生成过程。

一、安装包编译过程

一般我们使用ant、gradle等方式编译生成安装包,它一般包含以下几个步骤。


但是对于多library的结构下,ant与gradle的并行度并不足够。当前微信已经切换到Facebook的开源编译工具buck(相关介绍http://facebook.github.io/buck/),编译速度得到了大大提升。

在buck的基础上我们主要做了以下两个工作:

  • EclipseToBuck,开发者无须关心buck脚本的编写,buck脚本使用代码自动生成

  • 微信使用多library结构,每次编译后监控每个模块的线性内存、方法数、资源大小。




二、减少安装包大小的Tips

现在我们开始第一项主要内容,如何减少安装包的体积?

1. 安装包监控

我们做安装包优化,首先要对我们安装包每一部分有一个详细的了解,知道安装包大在什么地方,与上一版本有着怎么样的变化。所以我们首先实现了一个安装包检测工具:

监控

1. 每个dex方法数的变更情况;

2. 每个模块线性内存的变化情况;

3. 没有alpha通道的png图,可压缩成jpg减少体积;

4. 超过一定数值的大文件,特别是图片资源可采用有损压缩;

5. 安装包的大小、文件数变化;

6. 新增文件、减少文件,文件大小发生变化的情况;

现时微信的安装包监控包括两个维度,一是每日的监控,采用的是最后一个包与昨日的最后一个包对比;二是版本之间的对比,发布前需要用待上线版本与线上版本对比。我们希望若发现问题,能立刻警报,提交到bug系统。

2. 删除无用资源

在产品的大锤下,每个模块不修改个三五十次,都不好意思说自己是微信的开发。在不停的迭代中,或多或少会出现无用的资源,包括但不限于xml、png、id、string。

查找无用资源主要使用lint的UnusedResources以及UnusedIds两个检查规则,但是针对多library结构,官方的lint在某些方面不符合我们的要求,所以我们修改了一些地方。

对于使用gradle的童鞋,可以采用:

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


3. 图片处理

.png、.9.png、.jpg、.gif资源是每一个安装包永远的痛,追求美感的设计师希望每个像素都是完美的。这边的tip有以下几点:

详细描述

1.对于体积特别大(超过50k)的图片资源可以考虑有损压缩,jpg采用优图压缩,png尝试采用pngquant压缩,输出视觉判断是否可行;

2.对assets中的图片资源也使用aapt的crunch做图片预处理;

3.crunch有可能会使图片变大,在这种情况,我们可以替换成原图。需要注意的是对于.9.png,由于crunch过程中去除了黑边,所以不能替换;

4.对于没有透明区域的png图片,可以转成jpg格式。

4. 字符串编码

为了节省空间,resources.arsc中的会有一个去重过的字符串资源池(相同的两个字符串其实用的是同一份),每个String使用偏移值来获取资源池中的数值。ResourceTable的编码对于resources.arsc的体积有很大影响。

从Android 2.2 API Level8开始APK文件的资源resources.arsc的编码有了小幅的改变,过去使用的是UTF-16编码方式被转换成了UTF-8编码。这样的好处就是处理纯英文等直接通过ascii存储语言的国家资源文件将会更小,而对于中文、日文这些国家的资源文件有可能会变大。

bool getUTF16StringsOption() {       
return mWantUTF16 || !isMinSdkAtLeast(SDK_FROYO); }

当然如果你发现使用UTF-8后resources.arsc反而变大,你可以强制使用UTF-16编码。只需要在aapt中指定--utf16参数,也就是指定mWantUTF16为true(下面的注释似乎跟代码有出入)。

    " --utf16\n"
    " changes default encoding for resources to UTF-16.  Only useful when API\n"
    " level is set to 7 or higher where the default encoding is UTF-8.\n"

微信5.2.1把minSdkVersion更改到8,使用utf8编码后,resources.arsc减少了将近1M。

5. 指定文件的压缩方式与7zip压缩

安装包是一个压缩文件,我们可以指定里面的文件采用哪种压缩方式。假若我们输入下面的命令:

aapt l

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部