今天,Android牛轧糖似乎发布了。因此,我比以往任何时候都更兴奋地优化我的应用程序的新功能,如分屏。我想推动我的应用程序的一个版本,目标SDK版本24
,这样用户就不会被告知我的应用程序可能无法在分屏中工作。然而,这样做意味着我也应该更新到支持库的24
版本。像许多其他人一样,我在更新到支持库的23.2.0
版本时遇到了一个问题。然而,我遵循这个答案,它解决了我的问题。现在,这个问题在24.0.0
版本和更高版本的支持库中再次出现。在我所有的测试中,我都使用了链接答案中描述的gradle标志:
vectorDrawables.useSupportLibrary = true
同样重要的是要注意,这只发生在pre-Lolliop设备(Kitkat及以下版本)上。棒棒糖和向上的效果非常好。当使用以下依赖项时,该标志可以正常工作:
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
compile 'com.android.support:cardview-v7:23.4.0'
但是当使用这些依赖项时,我得到了一个类似于使用标志之前的崩溃:
compile 'com.android.support:support-v4:24.2.0'
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:cardview-v7:24.2.0'
下面是崩溃的堆栈跟踪:
FATAL EXCEPTION: main
Process: com.badon.brigham.time, PID: 2070
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.badon.brigham.time/com.badon.brigham.time.MainActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f02004f
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
at android.app.ActivityThread.access$800(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f02004f
at android.content.res.Resources.loadDrawable(Resources.java:2101)
at android.content.res.Resources.getDrawable(Resources.java:700)
at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:346)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:194)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:182)
at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:717)
at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:187)
at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:77)
at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:127)
at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147)
at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27)
at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:50)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:201)
at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:181)
at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:521)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
...
我完全错过了什么吗?或者这已经是一个已知的问题(我在谷歌上找不到任何东西)?
呃…我讨厌这种事发生。你问了一个问题,然后几个小时后自己回答。无论如何,看起来好像我使用的是过时的构建工具版本。我所要做的就是修改gradle中的一行:
buildToolsVersion "24.0.1"
除了Gradle配置之外,对我来说,技巧是在onCreate():
活动中添加这一行@Override
public void onCreate() {
super.onCreate();
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
构建。Gradle (project)如果使用2.0+版本,请在构建中添加以下代码。gradle (app)
// Gradle Plugin 2.0+
android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
,如果使用1.5版本,在构建中添加以下内容。gradle (app)
// Gradle Plugin 1.5
android {
defaultConfig {
generatedDensities = []
}
// This is handled for you by the 2.0+ Gradle Plugin
aaptOptions {
additionalParameters "--no-version-vectors"
}
}
,当然,在布局文件中,您应该使用srcCompat attribute:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:srcCompat="@drawable/ic_add"/>
在24.2.0中,v4支持库被google分成了几个较小的模块:
com.android.support:support-compat:24.2.0
为新的框架api提供兼容性包装器,如Context.getDrawable()和View.performAccessibilityAction()。
com.android.support:support-core-utils:24.2.0
提供了一些实用程序类,如AsyncTaskLoader和PermissionChecker。
com.android.support:support-core-ui:24.2.0
实现各种与ui相关的组件,如ViewPager, NestedScrollView和explorbytouchhelper。
com.android.support:support-media-compat:24.2.0
支持媒体框架的部分,包括MediaBrowser和MediaSession。
com.android.support:support-fragment:24.2.0
Backports fragment框架。这个模块依赖于support-compat、support-core-utils、support-core-ui和support-media-compat。
你可以在这里看到所有的变化
所以这个问题的答案是提醒Android维护者他们已经犯了错误,并要求他们修复他们的库。
文件abc_vector_text.xml
在运行时从项目中丢失,但是如果您的项目首先不使用它,则丢失的文件将不会在构建中被标记。文件的名称表明它只是某个测试套件的一部分。
我使用以下依赖项:compile 'com.android.support:appcompat-v7:25.0.1'
因为该页表明该文件在该库中找到:https://github.com/dandar3/android-support-v7-appcompat/blob/master/res/drawable/abc_vector_test.xml
。
但是,我仍然在运行时看到错误。
请注意,这是一个项目的github链接,不是官方的Android项目。我似乎在任何地方都找不到这个文件。这再次表明,这只是一个粗心的维护问题。下面是我的stacktrace比较:
ontent.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread.access$600(ActivityThread.java:141)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.os.Looper.loop(Looper.java:137)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread.main(ActivityThread.java:5041)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at java.lang.reflect.Method.invokeNative(Native Method)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at java.lang.reflect.Method.invoke(Method.java:511)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at dalvik.system.NativeStart.main(Native Method)
01-02 00:02:23.130 E/AndroidRuntime( 3037): Caused by: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.content.res.Resources.loadDrawable(Resources.java:1953)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.content.res.Resources.getDrawable(Resources.java:660)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v4.content.ContextCompat.getDrawable(ContextCompat.java:374)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:200)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:723)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:81)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:127)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:147)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:27)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:53)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:205)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:185)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:525)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:74)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.ccc.lib.activity.LoggingAppCompatActivity.onCreate(LoggingAppCompatActivity.java:416)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.ccc.lib.debugMode.DebugModeActivity.onCreate(DebugModeActivity.java:95)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.ccc.lib.activity.IBusActivity.onCreate(IBusActivity.java:46)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at com.ccc.lib.activity.MainActivity.onCreate(MainActivity.java:173)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.Activity.performCreate(Activity.java:5104)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
01-02 00:02:23.130 E/AndroidRuntime( 3037): ... 11 more
01-02 00:02:23.130 E/AndroidRuntime( 3037): Caused by: org.xmlpull.v1.XmlPullParserException: Binary XML file line #17: invalid drawable tag vector
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:881)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.graphics.drawable.Drawable.createFromXml(Drawable.java:822)
01-02 00:02:23.130 E/AndroidRuntime( 3037): at android.content.res.Resources.loadDrawable(Resources.java:1950)
01-02 00:02:23.130 E/AndroidRuntime( 3037): ... 33 more
我在使用dexguard时遇到了同样的问题。在配置文件中添加这一行:
-keepresourcexmlattributenames vector/*
对我来说,它是项目根构建中的旧构建工具包装器。Gradle文件
dependencies {
....
classpath 'com.android.tools.build:gradle:2.1.2'
}
代替
classpath 'com.android.tools.build:gradle:1.X.X'
classpath 'com.android.tools.build:gradle:2.1.0'
distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip