apk太大一般是以下原因造成的:
1, 图片资源很多,为多种屏幕密度出多个版本分辨率的图片。
2, 有很多大图片(好几百KB),比如介绍页、使用指南之类的。
3, 应用中集成了很多,或者很大的so库。
以下总结下我在项目中缩减apk体积所用到的方法。 (将原本14MB的安装包缩小为9.5MB)
1, 图片只切一版。
之前由于经验不足,项目中的所有切图都是让UI工程师输出两个版本的图片,比如我们要更好的适配hdpi屏幕和xhdpi屏幕,于是每张图片就有了两个版本,一版是基于视觉稿的尺寸(hdpi的480*800), 另一版是适配xhdpi,所以在这个基础上给图片的长和宽都乘以3/4。
其实是没有必要的, 当你将一张基于xhdpi视觉稿切的图片放到xhdpi目录时,所有的屏幕密度都能很好的适配, android系统会自动的对你的图片进行缩放, 不用为每个密度都切一版图片的, 经过实际验证我也发现确实是这样的, 于是我将hdpi下的所有和xhdpi目录有重复的图片全部删除掉。 这样下来应用就减少了将近2M !
那,既然有了这样的经验,我们后面就知道了,首先,第一步,要在应用UX/UI设计的时候就确定下来的, 就是确定好你的应用最佳适配分辨率是多少, 比如720*1280,那么,接下来的设计就完全基于这个分辨率,包括视觉调整、切图输出。 这一步一定要和设计师沟通好,因为设计师可能对android平台的屏幕多样性适配不怎么了解,屏幕适配的事情要由你来做, 不能让设计师去设计不同分辨率下的视觉效果。 交互和视觉成型后,切图输出时就只需要根据这个720*1280分辨率输出一版图片。 然后具体这一版图片怎么适配不同的屏幕密度和分辨率完全是工程师的工作。 工程师只需要将图片放到xhdpi目录, 就会自适应大部分主流分辨率( 特殊分辨率可以专门通过drawable文件夹适配来解决)。 这样你的apk就不会因为重复图片而导致体积膨胀了。
2, 个别图片体积很大。
以我的项目为例, splash页和首次运行介绍页5张图片都是实实在在的全屏大图, 每张图片200多KB,虽说apk在打包的时候会自动对图片进行一定程度的压缩, 但是光这几张图片就占了这么大体积,那还不包括其他图片呢。
我的做法是将“不注重”透明度的图片压缩格式改为jpg, 因为jpg相比于PNG图片拥有更好的压缩比(图片质量上可能会有所降低,但是基本是肉眼看不出来的差别), 这样一张200KB的图片一下子就变成了80KB, 缩小了60%, 当然如果你的图片必须拥有透明效果, 可以对PNG图片降低质量, 调整PS的相关输出选项即可(这个UI懂的哦),前提是在肉眼不能分辨的情况下降低图片质量。 这样即使你使用的PNG,也可以将图片体积缩小50%左右。
所有大图片处理一遍,apk体积又小了1M。
在这里提一下TinyPNG这个网站, 这个网站提供的服务可以在不损失视觉效果的前提下把你的PNG图片缩减达90%的大小, 可谓惊人!但是遗憾的是我将所有大图片都使用了TinyPNG进行缩减,但是打包出来的apk体积不减反增, 这令我十分纳闷, 有谁能告诉我这是为什么, 难道TinyPNG的压缩方式和apk打包工具有冲突?
3, 注意你的so库。
项目中使用了DLNA功能, 而DLNA是以C++实现的,编译成so直接打包在apk里以jni方式调用。 我相信有不少应用对于注重性能或者功能复用的模块都使用了jni方式,带来的问题就是so经常成为apk体积膨胀的一大因素, 以这个DLNA为例, so文件就有整整1MB。
如果仅仅是1MB还不算什么大问题,问题在于为了适配armeabi和armeabi-v7a两种机型,这个库必须在libs/armeabi目录和libs/armeabi-v7a两个文件夹下各放一份。否则有可能在某种CPU类型的机器上运行出现初始化连接异常(因为找不到so库引起的)。 那光这个库就占了2M。
怎么办呢, 说说我的解决方案:
将so库使用zip压缩,1MB可以压缩到400KB,然后 后只放一份到res/raw目录, 在代码里实现: 如果程序是第一次运行,则获取到raw下这个zip文件的输入流,然后将其解压到/data/data/com.xxx.xxx/lib_xxx目录, lib_xxx为你自己建的目录, 然后使用System.load加载库,而不要使用System.loadLibrary., 这样指定路径加载肯定不会出现找不到so的问题。
如此做, apk再缩小1M。
4, 其他注意的地方。
比如如果应用中包含了语音提示等原始音频文件,可以使用压缩率较高的格式(一般mp3就可以了,音质损失不是大问题)。
注意清理应用中的无用图片, 无用代码。
本着精益求精的原则。 不要让你的apk体积成为用户下载的犹豫因素。 不要让用户花费太多时间等待下载, 不要浪费用户太多的流量, 快快给你的apk”减减肥“吧。