Android:在资源文件中使用SVG会导致错误:“文件名必须以.xml或.png结尾”。

14

我刚刚更新了Android Studio 1.2.1.1,现在gradle在我的资源文件夹中的SVG出现了问题。我一直都没有问题地使用SVG,希望它们将来可以被"允许"。

:app:mergeDebugResources
:app:mergeDebugResources FAILED
/home/petergriffin/folder1/another-app/MyAwesome-App/app/src/main/res/drawable-hdpi/logo.svg
Error:Error: The file name must end with .xml or .png
Error:Execution failed for task ':app:mergeDebugResources'.
> /home/petergriffin/folder1/another-app/MyAwesome-App/app/src/main/res/drawable-hdpi/logo.svg: Error: The file name must end with .xml or .png
Information:BUILD FAILED

有什么想法解决这个问题吗?


1
尽管SVG作为可绘制资源的基础在昨天的Google I|O 2015上宣布,但据我所知,这需要使用Android Studio 1.3。有第三方Gradle插件提供将SVG转换为可绘制对象的功能。除此之外,我不知道SVG是否曾经是合法的可绘制资源文件。 - CommonsWare
谢谢,但我已经尝试过使用Android Studio 1.3+,但没有帮助。当然,我多次清理了项目,但仍然没有效果。即使在Android Studio早期,我使用SVG也从未遇到过问题。 - Rob Anderson
6个回答

21

Android不支持将SVG文件作为可绘制资源。即使将它们放在那里,系统也无法像您期望的那样解码它们。相反,尝试将它们放在src/main/res/rawsrc/main/assets文件夹中,并适当地加载它们(通过外部库)。大多数人会混淆SVG和矢量可绘制图形,但它们并不相同。矢量可绘制图形使用与SVG兼容的路径迷你语言,但仅此而已。

目前接受的解决方案是回退到过时的Gradle插件版本,这在大多数情况下是适得其反的。工具团队正在投入大量精力使构建变得更好(效果非常明显)。

与其回退,不如升级到1.5.0(稳定版本已经有一段时间了),并将android.disableResourceValidation=true添加到您的gradle.properties文件中(通常位于settings.gradle旁边的根项目中),以启用1.2.2之前的行为。

更多信息请参见http://b.android.com/192493


谢谢,经过一年使用过时的Gradle后,我现在可以转移到最新版本了 :) - velis
如何添加此属性?在我的项目中没有名为“gradle.properties”的文件? - Srinivasan
@Srinivasan,创建文件吗?!;) - TWiStErRob
@TWiStErRob 很棒的解決方案。它幫助我使用 Gradle 2.10,但在更新後我遇到了另一個問題:http://stackoverflow.com/questions/36787855/aapt-err-libpng-error-not-a-png-file - Srinivasan

7

在drawable资源目录中,webp文件出现了相同的问题。

最新的gradle插件(v1.2.3)无法识别一些以前可以使用的图像格式。当我切换回v1.2.2时,就没有这个问题。

更新:既然这个问题已经修复,您应该升级到最新的gradle插件版本,而不是回滚到以前的版本。

您可以通过设置build.gradle中的版本来更改版本:

buildscript {

  repositories {
      jcenter()
      mavenCentral()
      // mavenLocal() // Only if you want to use your local maven repo
  }

  dependencies {
      // classpath 'com.android.tools.build:gradle:+'
      classpath 'com.android.tools.build:gradle:1.2.2'
  }
}

解决了我的问题 - 谢谢。但我认为将来我必须转换为XML并嵌入我的SVG。=( - Rob Anderson

6

通过“资源管理器”简单导入SVG到XML


1

在Android中,您应该使用(XML)矢量可绘制文件(它们在XML中包含SVG信息,详情请参见:https://developer.android.com/training/material/drawables.html#VectorDrawables)。

可以从此存储库下载矢量可绘制文件:https://github.com/google/material-design-icons。在图标目录中查找名为drawable-anydpi-v21的文件夹。此文件夹包括要放置在应用程序的drawable目录中的矢量可绘制文件。

请注意,仅支持使用矢量可绘制文件的Android 5.0及更高版本。如果您需要与<5.0 Android版本兼容,我建议您使用此库:https://github.com/trello/victor 此库可用于在应用程序编译期间将SVG文件转换为不同格式的可绘制对象。这样可以避免手动创建和维护mdpi / hdpi / xhdpi / xxhdpi文件夹。

如果您将矢量可绘制文件和SVG文件命名相同,则可以同时使用这两种方法。

如果我想要自动将SVG转换为PNG可绘制对象怎么办?这不是在新的Android Studio中应该是可能的吗? - IgorGanapolsky
这还未可用(但已在 Google I/O 2015 上宣布)。我正在使用上述描述的解决方案,并将在此可用后切换到最终解决方案。 - Peter
我认为“应该”不是一个合适的建议。使用第三方SVG库有许多优点,尤其是向后兼容性。 - DoctorDbx

1

将以下内容添加到您的 gradle.properties 文件中:

android.disableResourceValidation=true


1
不再支持此功能。 - msqar

0

问题仍然存在于gradle 1.5上。 看起来未来的唯一选择是使用“创建矢量资源”将svg文件转换为xml,然后选择svg文件选项。


我的猜测是系统无法将SVG文件作为可绘制对象处理,但我相信将其打包为“raw”或“assets”格式应该是可行的。 - TWiStErRob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接