Android 应用安装包“瘦身”大作战

Android 应用安装包“瘦身”大作战
点击“搜狗测试”可关注我们!     

1、前言

Hello,小伙伴们,随着app版本的迭代,新功能点增加,安装包的“体积”也越来越大。尽管智能手机存储空间不断升级,但我们安装包的大小不能这么“任性”。轻量的应用还是较受偏爱的(例如QQ发布简洁版-Tim)。更小的App能够使得更多的用户愿意去下载和体验。

        本文将介绍下应用安装包空间占用的减负方法、以及Lint工具使用。

2、减小Apk空间占用方向

        减小Apk空间占用如何开始?

        安装包(APK)典型的组成结构如下

Android 应用安装包“瘦身”大作战

Android 应用安装包“瘦身”大作战

Apk文件结构

        从Apk的组成结构可以看出,其中占用空间最大的部分就是代码和资源,所以我们要做安装包“瘦身”,就要从代码和资源这两个方向入手,整理关键点如下:

(1).   代码部分:冗余代码、无用代码;

(2).   资源部分:冗余资源、图片处理(压缩、图片转换等);

3、代码部分

3.1无用代码

       无用代码是指工程中那些未被引用的代码和文件,例如未被引用的变量、方法和类等。对于无用代码,主要采用的是Lint工具对整个工程代码进行扫描,找出未被引用的变量、方法、类,然后根据情况处理。

静态代码分析工具 —— Lint

Lint是Android Studio自带的工具,使用方法很简单Analyze-> Inspect Code然后选择想要扫描的区域即可。

Android 应用安装包“瘦身”大作战

Android 应用安装包“瘦身”大作战

     Lint 检测结果示例

 Unused  xml schema declarationAndroid 应用安装包“瘦身”大作战

Unused import无用的导入

Android 应用安装包“瘦身”大作战

Unused declaration无用的声明

Android 应用安装包“瘦身”大作战

Unused method parameters无用的方法参数

Android 应用安装包“瘦身”大作战

3.2冗余代码

       冗余代码,是指重复的代码或经过优化后可以用更小代码量替换的代码,比如完全一样的代码,重命名标志符后完全一样的代码、插入或删除语句后完全一样的代码、重复排列语句后完全一样的代码,以及结构一样或者类似的代码。好的代码应用降低冗余度,提高复用率,这除了能使代码量减少,还能提高代码的可读性。

Lint检测结果示例

declaration redundancy声明冗余

Android 应用安装包“瘦身”大作战

verboseor redundant code constructs 冗长冗余的代码结构

Android 应用安装包“瘦身”大作战
Duplicatedicons under different names 相同的icon 用了不同的名字

Android 应用安装包“瘦身”大作战

4、资源部分

4.1冗余资源

 Apk的资源主要包括图片、xml。与冗余代码类似,资源里面可能也遗留了不少旧版本使用而新版本不再使用的图片、xml等。我们可以使用Lint来查找这些冗余资源。

        下面介绍Lint检测冗余资源的使用方法。

        在Anaylze中选择Run Inspection by Name

Android 应用安装包“瘦身”大作战

    我们关注Unused Resources,在弹出的窗口输入Unused resources,即可进行Unused resources的扫描。

Android 应用安装包“瘦身”大作战

        利用Android lint进行Unused  Resources扫描结果,如图所示

Unused  resources没用过的资源

Android 应用安装包“瘦身”大作战

    点击对应项目,就可以看到详细信息,根据工程实际情况,判断是否需要该资源。

4.2图片处理

     Apk本身代码占用的空间相对较小,主要的还是资源,而资源里面最主要的问题是图片。

    (1).   图片压缩

    对Apk安装包来说,设计师为了追求完美效果,给出的资源一般较大,故图片有比较大的压缩空间。打包过程中aapt会进行一轮压缩,采用crunch做图片预处理。可以根据实际情况,决定是否做有损压缩。

    (2).   jpg和png的转换

    png是一种无损格式,jpg是有损格式,可以和设计师进行协商给出建议,找到图片质量和大小的折中方案。

    (3).   无用图片的再次梳理

    之所以要再次梳理,是因为app在版本的迭代开发中,可能遗留下许多以前版本试用的图片,但是新版本已经不再使用了,可能因为某种原因,图片的索引还残留在代码或者xml布局文件中,以致于用lint扫描时不能发现。

    这里需要联合设计师一起梳理,人工检查确认并删除。

     以上如有错误和不足,请大家指出。如果大家针对apk空间占用分析有建议或心得,欢迎留言。

文章参考

《移动App性能评测与优化》TMQ专项测试团队;

android开发者官网:

http://developer.android.com/index.html;

Android 应用安装包“瘦身”大作战