1. SVG
在项目 res
右键出来,New ---> Vector Asset
,SVG 图不会像位图一样因为缩放而使图片质量下降,优点在于节省空间和内存,常常用于一些简单的图标。
如果是从外部导入SVG,需要也是右键
res---new---Vector Asset
,需要注意的是:Asset Type
勾选的是:Local File
, 需要注意的是这个psd
图片不支持渐变和透明度,如下图:
导入进来后,自动生成 xml
.
这里提供一个
android
所有 自带的svg
图片的地址: https://megatronking.github.io/SVG-Android/
批量转化 svg2vector
的工具,这里可以 下载 , 是一个 svg2vector-cli-1.0.1.jar
. 这个是最新版本
操作命令是:
1 |
|
将
svg
图片生成指定目录的图片。需要在我们的app 的
build.gradle
文件中配置1
2
3
4
5
6
7
8
9
10android{
defaultConfig{
...
//将svg生成指定目录的png, 下面可指定目录
vectorDrawables.generatedDensities('hdpi','xhdpi')
....
}
}
//在布局中用法
android:src="@drawable/eye"配置完成后,我们可以点击
Build APK(s)
,观察生成的apk
里面的文件:
我们在我们指定的目录下drawable-hdpi 和 drawable-xhdpi
发现了 我们svg 图片生成了对应的 png
图片。这样的好处是我们可以避免配置多套图在每个分辨率下,用 svg 图可以自动帮我们生成指定目录的图片。
SVG 兼容方式
在 Android 5.0 之前,可以向上面那么配置,那么5.0之后,如果配置呢?
1 | vectorDrawables.useSupportLibrary=true |
通过使用 svg
图片,解决了我们大量使用套图的问题。
2. Tint 着色器
tint 着色器就是可以改变我们一些图标的颜色,例如:
上述那个图片是黑色的,我们通过添加属性 android:tint="@color/colorAccent"
, 就可以改变它的颜色:
我们经常会遇到例如点击按钮变颜色啥的,以前经常弄两张图,一个常态的icon, 一个点击态的 icon. 有了这个着色器,有些icon 我们不需要用两张图啦。例如:
res--color--tint_honor_color.xml
1 | <?xml version="1.0" encoding="utf-8"?> |
再来一个 res-drawable-tint_honor_src.xml
:
1 | <?xml version="1.0" encoding="utf-8"?> |
xml
中:
1 | <ImageView |
3. 资源打包
由于使用第三方库,例如
v7
包的引入,库中包含了大量国际化资源,我们可以根据实际情况,配置我们所需要的语言,去除其它语言,从而减少strings
文件的大小
从上图我们看到默认帮我们生成很多国家的语言,我们可以只保留中文,配置如下:
1 | //只保留我们指定的语言 |
再次 Build APK
查看:
经测试,apk 的大小还是有所减少的。
4. 动态库打包配置
在我们 libs 目录下配置指定
so
库,我们知道,真机CPU一般都是armeabi
的, 模拟器一般都x86
的 ,还有一些armeabi-v7a mips
等,一般要根据我们实际情况,只保留对我们真实有用的 cpu ,如果不进行配置,就会打包全 cpu 架构的动态库到apk中。
将so库打包到apk中:
1 | souceSets{ |
配置如下:
1 | ndk{ |
5. 移除无用资源
未避免我们移除了重要的文件,移除之前最好备份,因为都是物理删除,没了就没了。
第一种看不见的删除。按照图示操作:
执行之后,你会发现没有用的资源文件都被删除了,在实验这个之前,你可以添加复制几个无用的资源,观察执行之后是否还在,一般执行之后就没有了,特别注意:这种操作是物理删除,不会展示哪些文件需要删除,而是一次性将其删除,删除需谨慎。
第二种操作是:会给我们列出需要删除无用的资源,如下:
搜索找到 unused resources
, 之后会列出无用资源,例如:
上述文件都是我复制出来的,之后再决定是否删除。
6. 开启代码压缩
即对源代码进行混淆,还需要同时配置
proguard
文件,因为有些第三方库啥的一些类不能混淆,需要各自配置。
开启混淆:
1 | buildTypes { |
7. 启用资源缩减
1 | //以debug为例,开启资源缩减,必须将 minifyEnabled 设置为 true, 否则会报错 |
如果有想要保留或舍弃的特定资源,需要在项目中创建一个包含tools:keep
属性中指定每个要保留的资源,在tools:discard
属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。压缩配置: res/raw/keep.xml
该文件不会打包到apk
中 .
称为严格的资源检查:
示例:
1 | <?xml version="1.0" encoding="utf-8"?> |
使用之后,会出现什么效果呢:
对于 tint_honor_color1
我们选择要舍弃,Build APK
之后,查看里面的文件发现就为空了,而我们保留的
next1
文件没有为空,因为我们保留 keep
了。
8. 启用webp
webp 格式是谷歌推出的一种有损压缩格式,这种图片格式相对于png或jpg 格式的图片损失的质量几乎可以忽略不计,但是压缩后图片的体积却比png或jpg要小很多。
可以亲自找一张大图,目前已经集成到android studio
中了,导入 android studio
中后,右键 —conver to Webp ,就可以进行转化。亲测可以将一个4M 左右的图片 变为 400多kb. 图片质量也很高。
总结
相信经过层层处理,apk
大小一定会有所减小, 不断补充。