背景:
- gradle 插件版本 2.3.0,gradle 版本 3.5,AS 版本 3.2.1。
- build.gradle 中开启 minifyEnable 和 shrinkResources。
- drawable 目录下有矢量图资源文件,例如 loading.xml,内容为
<animated-vector
<vector
android:width="1080dp"
...
</vector>
</animated-vector>
使用:
ImageView image = findViewById(R.id.image);
AnimatedVectorDrawable drawable = getResources().getDrawable(R.drawable.loading);
image.setImageDrawable(drawable);
drawable.start();
结果:
1.直接运行会导致 App 崩溃。
2.升级 gradle 插件版本到 3.2.1(目前最新)无此问题。
兼容:
基于某些原因,必须使用 2.3.0 的插件版本,可按如下方案解决:
-
参考 http://tools.android.com/tech-docs/new-build-system/resource-shrinking 会发现使用 keep 是个不错的选择,在 res/raw/keep.xml 中输入如下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/loading"/>
运行,发现依然崩溃。 -
刚刚的网页往上看,发现 ./gradlew clean assembleDebug --info | grep "Skipped unused resource" 可以打印忽略掉的资源,运行后发现了
loading_10_1.xml
loading_10_2.xml
loading_12_1.xml
...
等字符串,于是乎柳暗花明了——原来编译时会根据 loading.xml 中的内容生成多个 xml 文件,所以只忽略 loading 是不行的,改成如下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/loading*"/>
也即以 loading 开头的资源都保留而不清除。 -
再次运行,一切正常!
网友评论