现状
随着不断的开发迭代,apk的大小不断的增大,在用户体验上变得不太友好,因此apk的瘦身显得很有必要。
分析
首先要apk的大小需要分析,我们才知道那部分可以瘦身
在Android Studio工具栏里,打开build–>Analyze APK, 选择要分析的APK包
或者直接从project目录下面寻找build outputs下的apk包然后双击。
从上方的apk分析图中,我们可以看出apk中什么资源占据了较多内存,然后进行瘦身优化。
具体方法
1.开启代码混淆
在gradle使用minifyEnabled进行Proguard混淆的配置,可大大减小APP大小:
android {
buildTypes {
release {
minifyEnabled true
}
}
}
混淆时候注意配置混淆
具体配置参考混淆模版
2.去除无用或者重复资源
android {
buildTypes {
release {
shrinkResources true
}
}
}
这里的去除并不是物理上的删除,而是编译器自动帮我们找出没有使用到的资源并在build的时候将这些资源保存为1x1的位图,因此大大缩小了打包后这些重复资源占据的空间。实测大概只有几十b大小。
3.去除无用的国际化
android {
defaultConfig {
resConfigs "zh"
}
}
只保留中文,其余几十种语言都不需要。
4.使用矢量图
在程序中我们会用到很多图片资源,png格式或者jpg的图片,这些图片少则十多k,多着几兆。
图片资源多了就会影响最后apk的大小。
其实在安卓5.0之后,谷歌就支持了svg矢量图,我们可以直接从美工小哥哥那里拿svg图然后使用。
或者使用自带的svg资源。
使用方法:
新建Vector资源:
image.png
在这里可以选择使用系统自带的资源或者,从本地选取。
image.png其实,我们平常用的默认的ic_launcher.xml就是矢量图,点击去看看,你就会发现其中有Vector的节点。
5.Tinit着色器
除了矢量图可以节约图片本身的大小,那么我们还可以使用Tinit着色器,减少一些重复的图片使用。
当然这里的重复也并不是说同样的图片,其实在平常的开发中,我们会用到很多图片资源只是颜色不同而已,为了做出点击效果或者按压效果等。
其实这些不同颜色效果的图片都可以用同一张图片实现,那就是Tinit着色器。
image.png
android:backgroundTint="#ff00ff"
android:drawableLeft="@drawable/ic_arrow_back_black_24dp"
android:drawableTint="#D81B60"
除了直接写死,当然也可以尝试下selector.xml哦,做出按压效果。
6.动态库的打包配置
我们平常会使用到很多JnILibs下面的.so库来进行一些功能的集成,但是在接手项目或者使用别人的库的时候,看到JnILibs下面有很多不同名字包下都有同样的.so文件。
image.png
这些都必须吗?都能用得着吗?
那不一定哈,具体看你使用在什么设备上面,一般来说使用一个armeabi-v7a就行了
defaultConfig{
ndk{
abiFilters( 'armeabi-v7a')
}
}
如果程序需要上架到GooglePlay上面的,从2019年8月1日起,就必须支持64位的啦!
这点还是需要注意下哈GooglePlay上架强制支持64位
顺便说一下这个动态库的含义:
简单来说就是:
Android 设备的CPU类型(通常称为”ABIs”)
armeabi-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多。
x86: 平板、模拟器用得比较多。
x86_64: 64位的平板。
7.使用webp
刚刚说过,我们可以使用svg矢量图来代替png等图片减小图片大小。那么如果非要使用png等图片又怎么办呢?
答案谷歌也给我们提供好了,那就是使用自带的webp有损压缩。
测试了大概1mb的图片最后就会变成100kb,压缩效果很明显,也不会出现图片失真太多。
使用方法:找到图片,然后右键,直接找到最下面的convert to WebP
image.png
image.png
最后效果
image.png感觉还可以吧。
当然还有其他很多方法。
res资源文件混淆我还没尝试过,希望大家可以在评论区互相启发一下怎么给apk瘦身,还有什么方法?
网友评论