APP性能优化系列:apk体积优化

来源:互联网 发布:丰臣秀吉知乎 编辑:程序博客网 时间:2024/05/21 08:55

一.APK文件格式

/assets/lib  /armeabi  /armeabi-v7a  /x86  /mips/META-INF  MANIFEST.MF  CERT.RSA  CERT.SF/resAndroidManifest.xmlclasses.dexresources.arsc

我们可能对上面大部分的文件和目录都很熟悉。它们和我们在实际开发app的时候所看到得项目结构一样,包含了: /assets, /lib, /res, AndroidManifest.xml. 还有一些文件可能是我们第一次看到。一般说来,classes.dex, 它包含了我们所写的Java代码经过编译后class文件;resources.arsc 包含了预编译之后的资源文件(比如values文件,XML drawables 文件等。)

lib:目录下的子目录armeabi存放的是一些so文件。

classes.dex :java源码编译后生成的java字节码文件

resources.arsc:编译后的二进制资源文件

res:目录存放资源文件。包括图片、字符串、raw文件夹下面的音频文件、各种xml文件等等。

assets:目录存放配置文件,如webview本地html文件、图片资源等。
通过api来访问资源。

classes.dex:可以通过代码混淆,删掉不必要的jar包和代码实现该文件的优化;

lib:一个硬件设备对应一个架构(mips、arm或者x86),只保留与设备架构相关的库文件夹(主流的架构都是arm的,mips属于小众,默认也是支持arm的so的,但x86的不支持),这样可以大大降低lib文件夹的大小;

资源文件:通过Lint工具扫描代码中没有使用到的静态资源。

二.如何减少APK文件的大小

资源文件

Android Lint检查代码及资源

Lint可以对res下面的资源进行了充分的优化,并提供一份报告,可以知道哪些资源
没有被用到,剔除这些资源是可以减少apk体积的。
这些资源包括res文件夹下所有的内容,比如图片、字串、尺寸等等。
现在Android Lint已经集成到了Android Studio中,用法很简单。进入Android Studio的菜单中
选择Analyze->Inspecting Code即可

清理资源两个步骤:
1.找到未用到的资源
2.按需清理这些资源

用代码代替图片

开发的时候有些地方能用代码做出来的就尽量不用图片来渲染,这样子可以减少图片资源的数量从而减少体积,这里举几个例子。
用shape代替背景图
用RotateDrawable代替仅仅是方向不同的“内容相同”的图片
用layer-list来制作多层图片从而达到复用
使用属性动画而不是多图片连续播放的帧动画
用shape代替背景图
很多背景图比如按钮的背景、纯色背景都是可以用shape来制作的,这样子仅用xml代码就代替了png资源。比如这么要给按钮背景图(纯色背景、带边框、圆角)可以用shape而不是Png图片来制作

多分辨率适配

一个APK尽量只用一套图片,从内存占用和适配的角度考虑,这一套图建议放在xhdpi文件夹下;

使用tinypng优化大部分图片资源

tinypng是一个支持压缩png和jpg图片格式的网站,通过其独特的算法(通过一种叫“量化”的技术,把原本png文件的24位(RGB,2^24)真彩色压缩为8位的索引演示,是一种矢量压缩方法,把颜色值用数值123等代替。)可以实现在无损压缩的情况下图片文件大小缩小。

因为 TinyPNG 将 PNG 图片压缩成 8 位(2^8)的 PNG(而不是24位),所以它的压缩比例非常高,至少都有 3、50% 以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼基本看不出区别。

tinypng支持png和jpg图片的压缩,并且也支持9图的压缩。

tinypng的缺点是在压缩某些带有过渡效果(带alpha值)的图片时,图片会失真,这种图片可以将png图片转换为下面介绍的webP格式,可以在保证图片质量的前提下大幅缩小图片的大小。

WebP

WebP 是谷人希 (谷歌!人类的希望!) 推行的自造轮子,它的特点是,支持半透明的有损压缩,像是 PNG 和 JPEG 的杂交品种。它号称可以比 png 小 45%,比 JPEG 小 30% 。目前很多公司已经将webP技术运用到Android APP中,比如FaceBook、腾讯、淘宝。webP相比于png最明显的问题是加载稍慢,不过现在的智能设备硬件配置越来越高。在 App 中使用 WebP,除了 Android4.0 以上提供的原生支持外,其他版本以可以使用官方提供的解析库webp-android-backport编译成so使用。

通常UI提供的图片都是png或者jpg格式,我们可以通过智图或者isparta将其它格式的图片转换成webP格式,isparta可实现批量转换.

isparta:可以将图片进行有损压缩和无损压缩。
智图:在对图片处理的时候可以选择画质10~95.


缺点:
WebP格式图像的编码时间“比JPEG格式图像长8倍”。
在Android Studio中,不能查看图片的预览效果。

去掉多余的.so库

如果项目中引用第三方库,其中包含很多so文件,so文件占了很多大体积,如果不加控制,所有的so都会打包到apk了。
我们可以通过配置gradle来制定只打包某些so,在defualtConfig中:

defaultConfig {        ndk {            //设置支持的SO库架构            abiFilters 'arm64-v8a', 'armeabi' //, 'x86', , 'x86_64', 'arm64-v8a'        }    }

对第三方开源库进行重新定制(重新打jar包)

开发中引入大量的第三方开发库也是一个增加apk体积的重要原因,因为把别人的代码和资源全给包含进来了。但是那些jar中的代码,并不一定全要的,是否可以只引入一部分代码,而不是在build.gradle中仅仅添加一行“compile”来全部依赖呢?如果在build.gradle里面加一句:
dependencies {
compile ‘com.xxx.xxx’
}

这要把库中内容全给引用过来了。想到他们是开源的,代码可以编辑,所以我们仅仅我们所用到的代码给剥离出来,单独打包了一个jar包引入到我们的项目里面,就OK了,这样可以减少了大量的无用依赖代码!

ProGuard代码混淆

Proguard是Android很早就使用的代码混淆工具,除了用于混淆代码提高安全性以外,在代码编译的时候也会通过遍历代码的方式来发现没有被调用的代码,从而将其在打包成apk时剔除,对代码进行优化,最终一定程度上降低了apk的大小。

三.分析工具推荐

NimbleDroid

参考资料

Android技术专题]APK瘦身看这一篇文章就够了
http://www.jianshu.com/p/6be4f98162d7?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io

如何给你的Android 安装文件(APK)瘦身
http://greenrobot.me/devpost/putting-your-apks-on-diet/

APK瘦身记,如何实现高达53%的压缩效果
http://www.freebuf.com/articles/security-management/100433.html

我是如何将apk砍掉6M的
http://mp.weixin.qq.com/s?__biz=MzA4MjU5NTY0NA==&mid=402591753&idx=1&sn=f6b63640dba09d9f4e80ec1b9d5d5d29&scene=0

Android APK 瘦身实践
http://android.jobbole.com/82401/?utm_source=top.caibaojian.com/68847

0 0