【问题标题】:Android invalid color state list tag gradientAndroid 无效颜色状态列表标签渐变
【发布时间】:2024-12-24 02:00:01
【问题描述】:

我有一个应用程序,下载量超过 5000 次,每天有超过 500 名用户活跃,但我突然在 Crashlytics 上遇到了一个奇怪的错误:

Caused by android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v24/ic_tickets.xml from drawable resource ID #0x7f0700b3
       at android.content.res.Resources.loadDrawableForCookie(Resources.java:2748)
       at android.content.res.Resources.loadDrawable(Resources.java:2643)
       at android.content.res.TypedArray.getDrawable(TypedArray.java:870)
       at android.widget.TextView.<init>(TextView.java:921)
       at android.widget.TextView.<init>(TextView.java:703)
       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:76)
       at android.support.v7.widget.AppCompatTextView.<init>(AppCompatTextView.java:72)
       at java.lang.reflect.Constructor.newInstance(Constructor.java)


Caused by android.content.res.Resources$NotFoundException: File res/drawable-anydpi-v24/$ic_tickets__0.xml from color state list resource ID #0x7f070017
       at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2858)
       at android.content.res.Resources.loadColorStateList(Resources.java:2807)
       at android.content.res.TypedArray.getColor(TypedArray.java:439)
       at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1605)
       at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1584)
       at android.graphics.drawable.VectorDrawable.inflateInternal(VectorDrawable.java:666)
       at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:571)
       at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1215)
       at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1124)


Caused by org.xmlpull.v1.XmlPullParserException: Binary XML file line #6: invalid color state list tag gradient
       at android.content.res.ColorStateList.createFromXmlInner(ColorStateList.java:217)
       at android.content.res.ColorStateList.createFromXml(ColorStateList.java:201)
       at android.content.res.Resources.loadColorStateListForCookie(Resources.java:2854)
       at android.content.res.Resources.loadColorStateList(Resources.java:2807)
       at android.content.res.TypedArray.getColor(TypedArray.java:439)
       at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1605)

堆栈跟踪比这长得多,在 Crashlytics 上超过 500 行,我在这里粘贴了我认为可能有助于理解问题的内容。

如果我做对了,它会抱怨我的资源之一丢失或损坏;会是什么?

但是apk里面的资源是完整的:

<vector android:height="24dp" android:viewportHeight="512"
    android:viewportWidth="512" android:width="24dp"
    xmlns:aapt="http://schemas.android.com/aapt" xmlns:android="http://schemas.android.com/apk/res/android">
    <path android:pathData="M381.845,292.27c0,11.032 -8.943,19.975 -19.975,19.975s-19.975,-8.943 -19.975,-19.975c0,-11.032 8.943,-19.975 19.975,-19.975S381.845,281.238 381.845,292.27zM361.869,332.221c-11.032,0 -19.975,8.943 -19.975,19.975s8.943,19.975 19.975,19.975s19.975,-8.943 19.975,-19.975S372.902,332.221 361.869,332.221zM361.869,392.147c-11.032,0 -19.975,8.943 -19.975,19.975s8.943,19.975 19.975,19.975s19.975,-8.943 19.975,-19.975S372.902,392.147 361.869,392.147zM307.418,136.36c-9.983,4.696 -14.268,16.596 -9.572,26.578c4.696,9.983 16.596,14.268 26.578,9.572c9.983,-4.696 14.268,-16.596 9.572,-26.578C329.3,135.95 317.401,131.664 307.418,136.36zM451.759,352.197c0,22.029 17.922,39.951 39.951,39.951h19.975V512H0.314V392.147H20.29c22.029,0 39.951,-17.922 39.951,-39.951s-17.922,-39.951 -39.951,-39.951H0.314V192.393h0.509l-0.042,-0.089L408.489,0l50.866,108.128l-17.013,8.861c-13.29,6.921 -21.544,20.506 -21.544,35.453c0,22.029 17.922,39.951 39.951,39.951h50.937v119.853H491.71C469.681,312.246 451.759,330.168 451.759,352.197zM94.244,192.393h297.352c-6.822,-11.763 -10.75,-25.403 -10.75,-39.951c0,-23.307 10.023,-44.953 27.021,-59.913l-18.505,-39.335l-81.134,38.269c4.355,9.886 0.068,21.491 -9.762,26.115c-9.818,4.618 -21.473,0.536 -26.323,-9.095L94.244,192.393zM411.808,352.197c0,-37.163 25.503,-68.482 59.926,-77.374v-42.479h-89.889c0,11.032 -8.943,19.975 -19.975,19.975s-19.975,-8.943 -19.975,-19.975H40.265v42.479c34.424,8.891 59.926,40.211 59.926,77.374s-25.503,68.482 -59.926,77.374v42.479h301.629c0,-11.032 8.943,-19.975 19.975,-19.975s19.975,8.943 19.975,19.975h89.889V429.57C437.31,420.678 411.808,389.36 411.808,352.197z">
        <aapt:attr name="android:fillColor">
            <gradient android:endX="256.00745" android:endY="511.99982"
                android:startX="256.00745"
                android:startY="-0.0150070675" android:type="linear">
                <item android:color="#FF2AF598" android:offset="0"/>
                <item android:color="#FF009EFD" android:offset="1"/>
            </gradient>
        </aapt:attr>
    </path>
</vector>

drawable 是应用程序中按钮的一个非常小且简单的图标,我从它打开的图标库中下载了它,并且在我的所有测试中运行良好。

第二个奇怪的事情是,我今天有超过 500 名活跃用户,只有 4 名用户都使用同一部智能手机:

Device
Brand: LGE
Model: LG K10 LTE
Orientation: Portrait
RAM free: 170.92 MB
Disk free: 574.64 MB
Operating System
Version: 6.0
Orientation: Portrait
Rooted: No
Crash

关于这款智能手机型号是否有任何已知问题?我可以做些什么来为受影响的用户解决这个问题?

【问题讨论】:

  • 两年后仍然只能在 LG G4 上使用 Marshmallow...:)

标签: android android-drawable android-vectordrawable lg


【解决方案1】:

这是因为您使用了一些在 API 级别 24 之前不受支持的属性。

例如。 startXendXstartYendYoffset

Android Marshmallow 6.0 是 API 级别 23 ...

invalid color state list tag gradient 来自offset

<item android:color="#FF2AF598" android:offset="0"/>
<item android:color="#FF009EFD" android:offset="1"/>

这个问题很可能不是 LG 特定的,而是 Marshmallow 特定的。

【讨论】:

  • 这很有趣,因为它可以在我的模拟器上的 api 16 和许多其他真正的智能手机中工作......我只有那个特定的手机才有这个问题。我的应用 minSdkLevel 是 16,许多用户在 23 以下使用它没有问题
  • @RafaelLima 事实上,Drawable 看起来不一样,一半的属性没有被考虑......你可以添加一个没有渐变的drawable-v23 - 或使用PNGWEBP 代替。查看文档:developer.android.com/reference/android/graphics/drawable/…
  • 我使用 android studio conversor 将 svg 文件转换为 xml drawable,你知道有什么转换器可以在 23 之前使其可移植吗?
  • @RafaelLima 您可以使用支持库,将 SVG 渲染为 PNG,以实现向后兼容性(无需手动添加资源,它发生在构建时,配置时)。
  • 谢谢,我希望有一份文件清楚地说明这一点。我用谷歌搜索了一段时间,找不到任何东西,Android Studio 甚至没有警告这些。
【解决方案2】:

ImageView 上使用app:srcCompat 而不是src

在您的应用程序build.gradle 中写入以下代码:

android.defaultConfig.vectorDrawables.useSupportLibrary = true

defaultConfig {
    ...
    vectorDrawables.useSupportLibrary = true
    ...
}

现在你看到它有效了。

【讨论】:

    【解决方案3】:

    实际问题在于您定义的属性,例如android:fillColor 它期望是单值颜色,而不是像渐变或颜色列表这样的颜色列表。它适用于 API 24。我的建议是告诉你的设计师为低于 24 的 API 创建确切的徽标

    Refer to the link for more details

    【讨论】:

      【解决方案4】:

      不使用 .xml 来设置图像资源,只需从您的 java 代码中以编程方式设置图像资源。

      【讨论】: