【问题标题】:VectorDrawable Resources$NotFoundException while xml vector drawable resource file does existVectorDrawable Resources$NotFoundException,而 xml 矢量可绘制资源文件确实存在
【发布时间】:2019-05-03 09:21:11
【问题描述】:

我的 app min SDK 是 21,所以不需要添加

AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);

到 Application 类,因为它仅适用于低于 21 的情况(无论如何我尝试添加它但没有结果)。
我的 build.gradle 配置文件有

defaultConfig {vectorDrawables.useSupportLibrary = true}

设置但未启用 proguard/minify

    debuggable true
    crunchPngs false
    minifyEnabled false
    shrinkResources false

    splits.abi.enable false
    splits.density.enable false

无论如何,我使用 AndroidStudio 检查了编译的 .apk 文件,并确保我的所有矢量可绘制对象都确实存在于 res/drawable 文件夹中,因此它不是 proguard/shrinker 或类似的。
另外我必须提到我在这个项目中使用androidx 而不是support
所以我尝试了所有可能的图像设置变化:

setImageResource(imgResId);
setImageDrawable(ContextCompat.getDrawable(context, imgResId));
setImageDrawable(AppCompatResources.getDrawable(context, imgResId));
setImageDrawable(VectorDrawableCompat.createFromResource(resources, imgResId));
setImageDrawable(VectorDrawableCompat.create(resources, imgResId, null));
setImageDrawable(ResourcesCompat.getDrawable(resources, imgResId, null));

没有任何结果(实际上结果总是应用程序崩溃)。发送真正的 Theme 而不是 null 也无济于事。
这是一个常见的PagerAdapter,并且矢量可绘制图像在每个页面上被动态设置为对应的ImageView,所以当你应该(但不是必须)用app:srcCompat="@drawable\ic_img"替换它时,这不是静态xmlandroid:src="@drawable\ic_img"的情况。 而且我还尝试将图像包装到选择器中,例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/vector_image" />
</selector>

但没有运气 - 崩溃报告发生了一些变化,但最终导致相同的异常。
this SO question 以及我发现的任何其他 SO 问题都没有帮助我。
我的矢量可绘制对象使用仅从 API 24 开始工作的渐变。我正在 API 26 设备上测试我的应用程序,但尝试通过将 android:fillColor 添加到 path 部分并评论渐变部分来替换所有渐变,例如:

<path
    android:pathData="M268.177,..."
    android:strokeWidth="1"
    android:fillType="nonZero"
    android:strokeColor="#00000000"
    android:fillColor="#FFEF5E32">
    <!--<aapt:attr name="android:fillColor">-->
        <!--<gradient-->
            <!--android:startY="84.70677"-->
            <!--android:startX="284.02185"-->
            <!--android:endY="70.083954"-->
            <!--android:endX="252.21419"-->
            <!--android:type="linear">-->
            <!--<item android:offset="0" android:color="#FFEF5E32"/>-->
            <!--<item android:offset="1" android:color="#FFF68F32"/>-->
        <!--</gradient>-->
    <!--</aapt:attr>-->
</path>

没有运气...
我意识到将我的矢量导入 png/webp 很可能会解决这个问题,但我想使用矢量绘图。

【问题讨论】:

    标签: android android-vectordrawable


    【解决方案1】:

    当我为渐变部分应用补丁时,我注意到 AndroidStudio 突出显示了这些渐变部分,说它受 API 24 支持,而我的项目最小 API 为 21。所以我决定检查其他警告,例如:

    向量路径很长(1456 个字符),这对性能不利。 考虑降低精度、删除次要细节或光栅化 向量。

    所以我开始怀疑它是问题来源,因为在 AndroidStudio 的构建窗口中给出了一条错误消息(红色文本),说明:

    字符串太大,无法使用 UTF-8 进行编码,而是写成 'STRING_TOO_LARGE'。

    但是没有胶水或指向这个问题的根源,它只是表明我的项目中有一个很长的字符串,所以它可能是例如预装的领域数据库文件或类似的东西。
    最后我在我的一个矢量绘图中发现了一个异常——它是一个包含大约 51k 个字符的路径字符串!当然,在导入时没有给我任何警告(svg 到 xml,使用 AndroidStudio 完成)。
    删除此路径解决了崩溃问题,但图像的一部分也丢失了。
    因此,我使用 Sketch 对有问题的路径组进行了分解,在导入后生成了 19k 和 24k 字符的 2 条路径,这也不好,但它现在可以正常工作而没有任何崩溃。
    顺便说一句,我无法找到有关向量/xml 的字符串长度限制的任何信息,但 gradle 确实在构建时应用了这个限制,所以它是已知的。

    The limit of one xml string length revealed in this SO question,目前还没有官方文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2016-10-03
      • 2021-01-06
      相关资源
      最近更新 更多