Android Nougat无法显示某些矢量文件(Resources $ NotFoundException)

时间:2017-06-22 23:30:01

标签: android android-appcompat android-vectordrawable

我一直在开发一个包含许多矢量图形的应用程序。最近我开始在Nougat上测试它并发现它立即崩溃。 logcat在加载一个向量时显示一个Resources $ NotFoundException,这个向量让人想起早期版本的Android中带有矢量图形的所有AppCompat错误。但是,它在KitKat,Lollipop和Marshmallow上运行良好。我只是在Nougat上得到了这个错误。

我已将其缩小到导致异常的一定数量的矢量文件,但我不明白为什么它们与我正在使用的其他文件不同。所有这些都是从相当简单的SVG生成的:http://inloop.github.io/svg2android/

我的猜测是,他们从向量创建drawable的方式发生了变化,由于某种原因,这些文件现在导致错误,因此不会创建drawable。当图书馆将drawable放在屏幕上时,它无法“找到”丢失的drawable,因为它尚未创建。我不确定Nougat中的矢量文件有什么额外的检查/限制。

还有其他人经历过这个吗?知道为什么吗? Nougat的矢量处理有什么变化?

在遇到错误并搜索其他Vector错误后,我将我的gradle设置更新为:

  • buildToolsVersion '25 .0.3'
  • vectorDrawables.useSupportLibrary = true
  • 编译'com.android.support:appcompat-v7:25.4.0'
  • 编译'com.android.support:preference-v14:25.4.0'
  • 编译'com.android.support:recyclerview-v7:25.4.0'
  • 编译'com.android.support:design:25.4.0'

我也包括在主要课程中:

static {
        AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
    }

logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.MyApp.Application.MyAppApplication, PID: 4957
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.MyApp.Application.MyAppApplication/com.MyApp.Application.MyAppApplication.MyApp}: android.content.res.Resources$NotFoundException: Drawable com.MyApp.Application.MyAppApplication:drawable/icon_month with resource ID #0x7f0800da
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                   Caused by: android.content.res.Resources$NotFoundException: Drawable com.MyApp.Application.MyAppApplication:drawable/icon_month with resource ID #0x7f0800da
                   Caused by: android.content.res.Resources$NotFoundException: File res/drawable/icon_month.xml from drawable resource ID #0x7f0800da
    at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:725)
    at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:571)
    at android.content.res.Resources.getDrawable(Resources.java:767)
    at android.content.Context.getDrawable(Context.java:525)
    at android.support.v4.content.ContextCompatApi21.getDrawable(ContextCompatApi21.java:30)
    at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:372)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:202)
    at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:190)
    at android.support.v7.content.res.AppCompatResources.getDrawable(AppCompatResources.java:100)
    at android.support.v7.widget.AppCompatImageHelper.setImageResource(AppCompatImageHelper.java:85)
    at android.support.v7.widget.AppCompatImageView.setImageResource(AppCompatImageView.java:92)
    at com.MyApp.Application.MyAppApplication.MyApp.onCreate(MyApp.java:233)
    at android.app.Activity.performCreate(Activity.java:6662)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6077)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
                   Caused by: java.lang.IllegalArgumentException: Path string cannot be empty.
    at android.util.PathParser.nCreatePathDataFromString(Native Method)
    at android.util.PathParser.-wrap1(PathParser.java)
    at android.util.PathParser$PathData.<init>(PathParser.java:74)
    at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:1556)
    at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1507)
    at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:693)
    at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:598)
    at android.graphics.drawable.DrawableInflater.inflateFromXml(DrawableInflater.java:130)
    at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:1224)
    at android.graphics.drawable.Drawable.createFromXml(Drawable.java:1197)
E/AndroidRuntime:     at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:715)
        ... 23 more

XML矢量文件的开头(无法发布整个文件):

    <?xml version="1.0" encoding="utf-8"?>
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="100.000000dp"
        android:height="75.666667dp"
        android:viewportWidth="100.000000"
        android:viewportHeight="75.666667">

        <group
                android:translateY="75.666667"
                android:scaleX="0.003333"
                android:scaleY="-0.003333">
            <path
                android:fillColor="#000000"
                android:strokeWidth="1"
                android:pathData="M28898 22695 c-7 -7 -376 -19 -491 -16 -69 2 -113 -1 -122 -9 -14 -12 -296 -34
    -330 -26 -18 4 -170 7 -235 4 -14 0 -47 3 -75 7 -61 9 -223 9 -265 0 -19 -4 -36 -2
    -46 6 -12 10 -20 9 -39 -1 -20 -11 -35 -11 -77 -1 -38 9 -151 11 -404 8 -192 -2
    -354 -6 -360 -9 -5 -3 -103 -4 -217 -3 -115 1 -210 -2 -213 -7 -3 -5 -18 -6 -34 -3
    -23 5 -126 7 -310 5 -14 -1 -185 -1 -380 -1 -280 0 -567 -3 -705 -8 -5 -1 -35 1
    -65 3 -100 8 -183 7 -324 -2 -77 -5 -148 -7 -158 -4 -10 2 -18 -1 -18 -7 0 -14 -35
    -14 -76 1 -25 9 -39 9 -56 0 -13 -6 -81 -14 -153 -17 -71 -3 -195 -9 -275 -14 -80
    -5 -152 -10 -160 -10 -138 -6 -171 -10 -184 -24 -9 -9 -16 -20 -16 -26 0 -6 -4 -11
    -10 -11 -15 0 -12 21 7 42 16 18 14 19 -68 19 -121 0 -114 0 -234 -5 -113 -6 -236
    -11 -550 -22 -221 -8 -229 -9 -243 -18 -7 -4 -80 -7 -162 -8 -85 0 -153 -4 -156 -9
    -4 -6 -10 -6 -18 0 -6 5 -68 11 -136 11 -114 1 -181 -1 -371 -14 -36 -3 

....

谢谢!

修改 似乎问题是具有更长“pathData”条目的矢量文件(路径数似乎不是问题)。当在较长的pathData条目上调用本机JNI函数GetStringUTFChars并且它返回解析器无法绘制的空字符串时,似乎会发生错误。我不知道这是否只是一个长度的事情,也不知道为什么它在AppCompat库中工作正常。

当前的解决方法是1)对具有长pathData的任何向量使用位图或2)修改xml文件并将pathData分成多个路径(感谢Lewis McGreary的建议!)。

两者都需要测试每个矢量图形以确定哪个工作,然后单独修改drawables。这不是理想的,特别是对于从大型游泳池中选择图像的特定应用程序。完全移动到png是一个选项,但会导致更大的apk和更小的缩放:(

与崩溃相关的Android来源:

PathParser Java

PathParser JNI - here is the call to GetStringUTFChars

PathParser JNI Hwui - here is where the crash happens

4 个答案:

答案 0 :(得分:4)

我找到了解决方法!似乎问题出现在AAPT2中。

添加:

android.enableAapt2 = false

gradle.properties

答案 1 :(得分:2)

在我的例子中,vector drawable xml文件的路径条目带有空的pathData字符串。我删除了这些路径条目,它正在运行。

从外部svg文件导入时,Android Studio生成了这个有问题的xml。

打开矢量drawable xml并删除/注释以下行。

<path
        android:pathData=""
        android:fillColor="#000000"/>

答案 2 :(得分:0)

我没有其他解决方法,而是你提到的另外两个。但似乎Android 7.1中已修复此问题

答案 3 :(得分:0)

我遇到了同样的问题,原来我的SVG文件中的某些文件正在使用长路径来显示多个对象,因此我不得不使用InkSpace将路径拆分为多个路径,按ctrl + A进行选择所有对象,然后选择分手。它解决了我的问题,希望对您有所帮助。对于某些svg,我必须先单击“简化”。

enter image description here