长 SVG 资产文件错误:R 不是有效动词。失败发生在路径的位置 2:STRING_TOO_LARGE

The*_*Boy 7 svg android runtimeexception android-studio android-vectordrawable

我目前在使用 Android Studio 时遇到了一些问题,因为我最近开始使用“矢量资产”。我已经完成了在我的应用程序中正确显示它们所需的一切(使用app:srcCompat=""xml、android {defaultConfig {vectorDrawables.useSupportLibrary true}}build.gradle 和setContentView()之前AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);onCreate()方法)。

我导入到 Android Studio 中的 svg 文件本身没有错误,我可以使用向导在 ImageView 中毫无问题地看到结果。唯一的问题出现在我运行我的应用程序时,它到达绘制 svg 的时间。我的一些 svg 仍然有效,而另一些则无效,所以我认为其中一些需要很长时间来处理。这是错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.retroverse.bataille_corse, PID: 18807
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.retroverse.bataille_corse/com.retroverse.bataille_corse.MenuPrincipal}: android.view.InflateException: Binary XML file line #127: Binary XML file line #127: Error inflating class ImageView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2985)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3120)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1840)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6872)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: android.view.InflateException: Binary XML file line #127: Binary XML file line #127: Error inflating class ImageView
     Caused by: android.view.InflateException: Binary XML file line #127: Error inflating class ImageView
     Caused by: android.content.res.Resources$NotFoundException: Drawable com.retroverse.bataille_corse:drawable/card_49_en with resource ID #0x7f060099
     Caused by: android.content.res.Resources$NotFoundException: File res/drawable/card_49_en.xml from drawable resource ID #0x7f060099
        at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:854)
        at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:634)
        at android.content.res.MiuiResourcesImpl.loadDrawable(MiuiResourcesImpl.java:329)
        at android.content.res.Resources.getDrawableForDensity(Resources.java:902)
        at android.content.res.Resources.getDrawable(Resources.java:841)
        at android.content.Context.getDrawable(Context.java:644)
        at androidx.core.content.ContextCompat.getDrawable(ContextCompat.java:454)
        at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:144)
        at androidx.appcompat.widget.ResourceManagerInternal.getDrawable(ResourceManagerInternal.java:132)
        at androidx.appcompat.content.res.AppCompatResources.getDrawable(AppCompatResources.java:104)
        at androidx.appcompat.widget.AppCompatImageHelper.loadFromAttributes(AppCompatImageHelper.java:59)
        at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:78)
        at androidx.appcompat.widget.AppCompatImageView.<init>(AppCompatImageView.java:68)
        at androidx.appcompat.app.AppCompatViewInflater.createImageView(AppCompatViewInflater.java:187)
        at androidx.appcompat.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:107)
        at androidx.appcompat.app.AppCompatDelegateImpl.createView(AppCompatDelegateImpl.java:1407)
        at androidx.appcompat.app.AppCompatDelegateImpl.onCreateView(AppCompatDelegateImpl.java:1457)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:519)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:555)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:161)
        at com.retroverse.bataille_corse.MenuPrincipal.onCreate(MenuPrincipal.java:24)
        at android.app.Activity.performCreate(Activity.java:7232)
E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:7221)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1272)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2965)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3120)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1840)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:201)
        at android.app.ActivityThread.main(ActivityThread.java:6872)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
     Caused by: java.lang.IllegalArgumentException: R is not a valid verb. Failure occurred at position 2 of path: STRING_TOO_LARGE
        at android.util.PathParser.nCreatePathDataFromString(Native Method)
        at android.util.PathParser.access$200(PathParser.java:24)
        at android.util.PathParser$PathData.<init>(PathParser.java:76)
        at android.graphics.drawable.VectorDrawable$VFullPath.updateStateFromTypedArray(VectorDrawable.java:2016)
        at android.graphics.drawable.VectorDrawable$VFullPath.inflate(VectorDrawable.java:1967)
        at android.graphics.drawable.VectorDrawable.inflateChildElements(VectorDrawable.java:819)
        at android.graphics.drawable.VectorDrawable.inflate(VectorDrawable.java:717)
        at android.graphics.drawable.DrawableInflater.inflateFromXmlForDensity(DrawableInflater.java:142)
        at android.graphics.drawable.Drawable.createFromXmlInnerForDensity(Drawable.java:1332)
        at android.graphics.drawable.Drawable.createFromXmlForDensity(Drawable.java:1291)
        at android.content.res.ResourcesImpl.createFromXmlForDensity(ResourcesImpl.java:1506)
        at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:838)
            ... 41 more
Run Code Online (Sandbox Code Playgroud)

我认为最重要的一行是Caused by: java.lang.IllegalArgumentException: R is not a valid verb. Failure occurred at position 2 of path: STRING_TOO_LARGE. 我们也知道这个 svg 被夹在中间(它的大小是 187 KB)。所以我认为我的 SVG 文件(甚至通过“Vector Asset”导入到 Android Studio 中)太重了。正如我们在此处被告知的,当字符串“长于 0x7FFF = 32767 个字符”时,就会出现 STRING_TOO_LARGE 问题。(在复制部分)确实,在我的应用程序中唯一可用的 svg 小于 32 kb,这可以解释这一点。

但我真的需要正确显示这个 svg(不要提供将它转换为 png!),如果可能的话,不要优化它的路径。欢迎任何帮助!

Coo*_*ind 13

感谢@TheBigBadBoy,我将长 SVG 路径分成了几段。我打开图像的 XML 文件并按符号划分路径M(另请参阅如何在 svg 中将一个路径拆分为两个路径)。

<path
    android:fillColor="#ffffff"
    android:fillType="evenOdd"
    android:pathData="M40.255,47.8897C40.1686, ... ,47.8897ZM38.7713,40.2642L38.8362, ..., 46.0978Z"
    />
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

您可以看到每个段都以 开头M和结尾Z。可以在第一条路径中保留大约20Kb,并剪掉尾部。然后将尾巴粘贴到第二条路径中。制作如此多的路径,使所有路径都小于 32 Kb。

所以,你会得到:

<path
    android:fillColor="#ffffff"
    android:fillType="evenOdd"
    android:pathData="M40.255,47.8897C40.1686, ... ,47.8897Z"
    />

<path
    android:fillColor="#ffffff"
    android:fillType="evenOdd"
    android:pathData="M38.7713,40.2642L38.8362, ..., 46.0978Z"
    />
Run Code Online (Sandbox Code Playgroud)


The*_*Boy 8

我找到了答案(终于……)。

实际上,超过 32 kb 的 Vector Assets 没有真正的问题,这完全取决于代码中的内容。我应该比平时更注意警告我并不总是看...

我在我的 svg 中发现了一个路径数据超过 40kb(在一个字符串中)。事实是,根据问题中的站点,字符串不能超过(大约)32k 个字符,否则任何 xml 文件中使用的整个字符串都将被“STRING_TOO_LARGE”替换。无论如何,只需在此处删除这条线,我就可以完美地绘制矢量(虽然它仍然是 250 kb,但现在不完整)。

相当令人惊讶的是,Android Studio 只显示警告(其中字符串长于 32k 个字符)只是为了让我了解具有长路径的 svg 显示速度可能很慢,而不是警告我路径将被损坏,因为它太长了(甚至更好的把这个警告变成了错误IDE中,以避免令人不快的意外)。

  • 哪条线?在“这里的这一行”中 (4认同)