前段时间接手了一个项目,需要在该项目上进行二次开发。经过一段996的加班节奏之后,初步完成了开发工作,但是发现安装包竟然超过有60M,于是着手进行压缩。
在进行压缩之前,我们先来了解下安装包内部构造及各部分所占用的空间大小,一来可以知道压缩的主要方向,再者可以跟压缩后的效果进行比较。方法很简单,直接将apk包拖到Android studio就行了,然后你就可以看到如下的界面
apk构造(压缩前).png可以看到,lib和assets占用了超过90%的空间,所以这两块是我们这次优化的重点(不同的app实际情况不同哈)。接下来是具体的实践步骤:
压缩图片文件
图片文件压缩是针对jpg和png格式的图片。我们通常会放置多套不同分辨率的图片以适配不同的屏幕,这里可以进行适当的删减。在实际使用中,只保留一到两套就足够了(保留一套的话建议保留xxhdpi,两套的话就加上hdpi)。然后再对剩余的图片进行压缩,我用的工具是tinyPng。可以把图片上传至网站进行压缩,然后下载替换,这种情况没有数量的限制。也可以通过脚本或者插件进行处理,这种情况下每个账号每天有500个免费调用机会,不过通过多注册几个账号可以解决这个问题(土豪的话就不用这么麻烦了)。
压缩lib文件
由于引用了很多第三方库,lib文件夹占用的空间通常都很大,特别是有so库的情况下。很多so库会同时引入armeabi、armeabi-v7a和x86这几种类型,一式三份。结合自己的经验,这里可以只保留armeabi或armeabi-v7a的其中一个就可以了,实际上微信等主流app都是这么做的。
微信so库.png我们在build.gradle里直接进行配置就可以了
ndk配置.png如果第三方库刚好没有我们选择保留的类型的so库该怎么办呢?我们之前就碰到这种情况,项目保留的是armeabi版本,但是在接入商汤人脸识别sdk的时候,他们只有armeabi-v7a版本的库。别担心,这种情况把他们的so库直接手动copy到armeabi文件夹下就可以了。
assets文件压缩
这个文件夹的压缩就原始得多了,直接检查该文件夹下的文件还有没有在项目中用到,没用到的话删掉就可以了。虽然简单,但是通常会被我们所忽视,可能很多文件都已经没用了,却一直躺在那。
资源混淆
可以使用AndResGuard对资源进行压缩,在压缩apk包的同时,还能增加别人破解的难度。使用方法很简单,这里就不展开讲了。
资源混淆后.png你看,是不是跟代码混淆了一样,完全看不出来这些东西是干嘛的。
压缩资源和代码
可以通过在build.gradle配置以下几个属性
压缩资源和代码配置.pngshrinkResources为true表示移除未引用资源,和代码压缩协同工作。minifyEnabled为true表示通过ProGuard启用代码压缩,配合proguardFiles的配置对代码进行混淆并移除未使用的代码。代码混淆在压缩apk的同时,也提升了安全性。
最终,我们把apk包压缩到30M以内,效果还是很显著的。
apk构造(压缩后).png希望以上方法也能帮到你。
网友评论