美文网首页
Android 中开启 shrinkResources 后应用崩

Android 中开启 shrinkResources 后应用崩

作者: 雁过留声_泪落无痕 | 来源:发表于2018-12-05 18:35 被阅读0次

背景:

  1. gradle 插件版本 2.3.0,gradle 版本 3.5,AS 版本 3.2.1。
  2. build.gradle 中开启 minifyEnable 和 shrinkResources。
  3. 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 的插件版本,可按如下方案解决:

  1. 参考 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"/>
    运行,发现依然崩溃。

  2. 刚刚的网页往上看,发现 ./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 开头的资源都保留而不清除。

  3. 再次运行,一切正常!

相关文章

网友评论

      本文标题:Android 中开启 shrinkResources 后应用崩

      本文链接:https://www.haomeiwen.com/subject/dhiwcqtx.html