1. SVG
在项目 res
右键出来,New ---> Vector Asset
,SVG 图不会像位图一样因为缩放而使图片质量下降,优点在于节省空间和内存,常常用于一些简单的图标。
![](https://img.haomeiwen.com/i1948557/5e48aa0fe6f5818b.png)
![](https://img.haomeiwen.com/i1948557/9d5ba9a1d8a0ab4c.png)
-
如果是从外部导入SVG,需要也是右键
res---new---Vector Asset
,需要注意的是:Asset Type
勾选的是:Local File
, 需要注意的是这个psd
图片不支持渐变和透明度,如下图:image.png
导入进来后,自动生成 xml
.
这里提供一个
android
所有 自带的svg
图片的地址: https://megatronking.github.io/SVG-Android/
批量转化 svg2vector
的工具,这里可以 下载 , 是一个 svg2vector-cli-1.0.1.jar
. 这个是最新版本
操作命令是:
java -jar svg2vector-cli-1.0.1.jar -d (svg图片所在的目录) -o (输入目录生成vector的目录)
//指定宽和高
java -jar svg2vector-cli-1.0.1.jar -d D:\svg -o D:\vector -w 24 -h 24
例如:
java -jar svg2vector-cli-1.0.1.jar -d C:\Users\xuqianqian\Desktop\svg\images -o C:\Users\xuqianqian\Desktop\svg\vector-image
-
将
svg
图片生成指定目录的图片。需要在我们的app 的
build.gradle
文件中配置android{ defaultConfig{ ... //将svg生成指定目录的png, 下面可指定目录 vectorDrawables.generatedDensities('hdpi','xhdpi') .... } } //在布局中用法 android:src="@drawable/eye"
配置完成后,我们可以点击
Build APK(s)
,观察生成的apk
里面的文件:image.png
![](https://img.haomeiwen.com/i1948557/4ca87e9507cdfd62.png)
我们在我们指定的目录下drawable-hdpi 和 drawable-xhdpi
发现了 我们svg 图片生成了对应的 png
图片。这样的好处是我们可以避免配置多套图在每个分辨率下,用 svg 图可以自动帮我们生成指定目录的图片。
SVG 兼容方式
在 Android 5.0 之前,可以向上面那么配置,那么5.0之后,如果配置呢?
vectorDrawables.useSupportLibrary=true
implementation 'com.android.support:appcompat-v7:28.0.0'
//在布局中用法
xmlns:app="http://schemas.android.com/apk/res-auto"
app:srcCompat="@drawable/eye"
通过使用 svg
图片,解决了我们大量使用套图的问题。
2. Tint 着色器
tint 着色器就是可以改变我们一些图标的颜色,例如:
![](https://img.haomeiwen.com/i1948557/84149416078277e0.png)
上述那个图片是黑色的,我们通过添加属性 android:tint="@color/colorAccent"
, 就可以改变它的颜色:
![](https://img.haomeiwen.com/i1948557/1c6af3731c73883d.png)
我们经常会遇到例如点击按钮变颜色啥的,以前经常弄两张图,一个常态的icon, 一个点击态的 icon. 有了这个着色器,有些icon 我们不需要用两张图啦。例如:
res--color--tint_honor_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimary" android:state_pressed="true"/>
<item android:color="@android:color/transparent"/>
</selector>
再来一个 res-drawable-tint_honor_src.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/next" android:state_pressed="true"/>
<item android:drawable="@drawable/next"/>
</selector>
xml
中:
<ImageView
android:layout_marginTop="30dp"
android:clickable="true"
android:focusable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/tint_honor_src"
android:tint="@color/tint_honor_color"
/>
3. 资源打包
由于使用第三方库,例如
v7
包的引入,库中包含了大量国际化资源,我们可以根据实际情况,配置我们所需要的语言,去除其它语言,从而减少strings
文件的大小
![](https://img.haomeiwen.com/i1948557/74326b54568c8bd9.png)
从上图我们看到默认帮我们生成很多国家的语言,我们可以只保留中文,配置如下:
//只保留我们指定的语言
resConfigs('zh-rCN','ko')
再次 Build APK
查看:
![](https://img.haomeiwen.com/i1948557/0c79b6f89ea2f953.png)
经测试,apk 的大小还是有所减少的。
4. 动态库打包配置
在我们 libs 目录下配置指定
so
库,我们知道,真机CPU一般都是armeabi
的, 模拟器一般都x86
的 ,还有一些armeabi-v7a mips
等,一般要根据我们实际情况,只保留对我们真实有用的 cpu ,如果不进行配置,就会打包全 cpu 架构的动态库到apk中。
将so库打包到apk中:
souceSets{
main{
jniLibs.srcDirs = ['libs']
}
}
配置如下:
ndk{
abiFilters('armeabi','armeabi-v7a')
}
5. 移除无用资源
未避免我们移除了重要的文件,移除之前最好备份,因为都是物理删除,没了就没了。
-
第一种看不见的删除。按照图示操作:
image.png
执行之后,你会发现没有用的资源文件都被删除了,在实验这个之前,你可以添加复制几个无用的资源,观察执行之后是否还在,一般执行之后就没有了,特别注意:这种操作是物理删除,不会展示哪些文件需要删除,而是一次性将其删除,删除需谨慎。
-
第二种操作是:会给我们列出需要删除无用的资源,如下:
image.png
image.png
搜索找到 unused resources
, 之后会列出无用资源,例如:
![](https://img.haomeiwen.com/i1948557/698600cc0ecb76c1.png)
上述文件都是我复制出来的,之后再决定是否删除。
6. 开启代码压缩
即对源代码进行混淆,还需要同时配置
proguard
文件,因为有些第三方库啥的一些类不能混淆,需要各自配置。
开启混淆:
buildTypes {
release {
minifyEnabled true // 改为true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
7. 启用资源缩减
//以debug为例,开启资源缩减,必须将 minifyEnabled 设置为 true, 否则会报错
debug {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
如果有想要保留或舍弃的特定资源,需要在项目中创建一个包含<resources> 标记的 xml 文件,并在tools:keep
属性中指定每个要保留的资源,在tools:discard
属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。压缩配置: res/raw/keep.xml
该文件不会打包到apk
中 .
称为严格的资源检查:
示例:
<?xml version="1.0" encoding="utf-8"?>
<resources
xmlns:tools="http://schemas.android.com/tools"
tools:discard="@color/tint_honor_color1"
tools:keep="@drawable/next1"
tools:shrinkMode="strict"
/>
使用之后,会出现什么效果呢:
对于 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
大小一定会有所减小, 不断补充。
网友评论