Android apk包体瘦身
Posted LZ涸泽而渔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android apk包体瘦身相关的知识,希望对你有一定的参考价值。
瘦身原因
大数据统计,一定的范围小,用户的下载意愿与包体大小成正比,当包体超过一定的界限值时,用户的下载意愿就会断崖式的下跌,因此学会如何进行APK包体瘦身,是每一个合格的Android工程师(程序猿)的必备技能。
图片瘦身
使用SVG图片
APK中图片资源占比很大,一般开发中采用的icon类图片都会使用.PNG位图,并且会根据大小、颜色以及状态打等等,会提供多套类似的.PNG图片用于效果展示,实际上可以提供一些思路来处理这个问题
1.使用SVG矢量图
向UI要一个SVG图或者去阿里巴巴图库下载:阿里巴巴图库
下载前可以设置颜色与大小,按需要来即可,接着导入到as中
第一个为Android预设图片可以挑选着用,第二个为从本地文件中导入
改变图中的标识信息,图片将会发生对应的变化
2.使用着色器Tint
Tint可以直接改变SVG图片的颜色
:
android:src="@drawable/ic_error"
app:tint="#ff55ccff"
当有随状态发生颜色大小变化时,使用颜色选择器
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@android:color/black" android:state_pressed="false"/>
<item android:color="#228899" android:state_pressed="true"/>
</selector>
android:src="@drawable/ic_error"
android:clickable="true"
app:tint="@color/error_color_selector"
3.处理SVG生成问题
首先在打包时,没有任何处理的话SVG图片会在对应的资源文件夹下面生成.PNG图片,甚至远远超过本身使用.PNG图片的大小
可以使用Gradle构建工具指定资源文件生成(但是这种方式最后的生成图片数量和直接使用PNG无任何差别,
达不到瘦身的目的):
adnroid {
defaultConfig {
generatedDensities=['xhdpi','xxhdpi']
}
}
使用支持依赖
adnroid {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
使用时使用app:srcCompat
app:srcCompat="@drawable/ic_error"
android:clickable="true"
app:tint="@color/error_color_selector"
使用方法二后,打包APK将不再在对应资源文件夹生成.PNG图片,由此大大的减少了APK体积
4使用.WEBP图片
其他例如背景图,启动页之类的大图,可以使用AS自带工具,将图片制作为.WBBP格式,也能大量的减少图片体积
5.使用JPG不带透明度图片
6.图片压缩
总之一切在图片使用正常的情况下,使得图片体积变小
7.使用.9图
国际化处理
打包时,通过资源映射表可以看出,APK支持了多种语言,因此可以只选择自己需要的进行支持
android {
defaultConfig{
resConfigs 'en','zh-rCN'
}
}
可以看到,多余的支持语言没有了(蚊子腿再小也是肉)
SO包优化
不同的SO包用于不同的CPU架构,由C/C++编写,NDK编译出来,常见的有:armeabi、armeabi-v7a、arm64-v8a、x86、x64、mips、mips64
而应用于手机的CPU架构趋于稳定,大多数时候,使用arm64-v8a即可(模拟器使用x86),其他的按项目需求自行配置,SO库能够大量的减少包体体积。
android{
defaultConfig{
ndk{
abiFilters "armeabi-v7a"
}
}
}
移除无用资源
1.压缩代码
将minifyEnabled设置为true
minifyEnabled不仅会对代码进行混淆,也会通过R8树遍历,删除掉无用代码,编译时间很长,开发期间不建议打开
2.移除无用资源
因此可以通过移除无用资源来进行包体减小
1.使用工具
通过AS自带Refactor->Remove Unused Resources来进行删除无用资源,但是这种方式是通过资源索引进行排除的,如果项目中用到了通过名字进行匹配的,这样无疑是有很大风险的,如使用Assets,使用getResources方式获取的资源,尽管代码中使用了也会被检索到删除队列中。
项目中小的时候,可以通过备份项目,删除后报错再将需要的资源文件恢复就行。
2.使用工具
可以标记选中资源文件为使用中,可以避免被删除
3.使用shrinkResources
Gradle构建中使用shrinkResources,将其设为true,同时当它被设为true时,minifyEnabled也同时需要被打开
扩展:创建raw资源文件夹,创建keep.xml可以对shrinkResources进行配置,可以用于删除指定资源文件(因为shrinkResources默认使用非严苛模式)
<resources tools:discard="@layout/activity_main2"
xmlns:tools="http://schemas.android.com/tools">
</resources>
资源混淆
建议使用微信的开源工具AndResGuard:地址
以上是关于Android apk包体瘦身的主要内容,如果未能解决你的问题,请参考以下文章