web-dev-qa-db-ja.com

Vector Drawablesフラグはサポートライブラリ24+では機能しません

今日、Android Nougatは リリース済み のように思えます。したがって、分割画面などの新機能に合わせてアプリを最適化することにこれまで以上に興奮しています。 SDKバージョン24をターゲットとするアプリのバージョンをプッシュして、アプリが分割画面で動作しない可能性があることをユーザーに通知しないようにしますが、そうすると、バージョン24サポートライブラリの他の多くと同様に、サポートライブラリの23.2.0バージョンへの更新時に問題が発生しましたが、 この回答 に従って問題を修正しました。この問題は、バージョン24.0.0以降およびサポートライブラリ以降で返されます。すべてのテストで、リンクされた回答に記載されているgradleフラグを使用しています。

vectorDrawables.useSupportLibrary = true

また、これはLolliop以前のデバイス(KitKat以下)でのみ発生することに注意することも重要です。 Lollipop以上は完全に機能します。次の依存関係を使用する場合、フラグは正常に機能します。

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)
      ...

私は完全に何かが欠けていますか?または、これは既知の問題ですか(Googleで何も見つかりませんでした)?任意の助けをいただければ幸いです。

23
Brigham B.

うーん...これが起こると嫌いです。質問し、数時間後に自分で答えます。とにかく、古いバージョンのビルドツールを使用しているかのように見えます。私がしなければならなかったのは、私のgradleの1行を変更することだけでした:

buildToolsVersion "24.0.1"
30
Brigham B.

Gradle構成に加えて、私にとってのトリックは、アクティビティ内にこの行を追加することでしたonCreate()

@Override
public void onCreate() {
    super.onCreate();
    AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}

あなたのbuild.gradle(プロジェクト)バージョン2.0+を使用している場合、build.gradle(アプリ)

// Gradle Plugin 2.0+  
 Android {  
   defaultConfig {  
     vectorDrawables.useSupportLibrary = true  
    }  
 }

そして、バージョン1.5を使用している場合、以下にあなたのbuild.gradle(アプリ)を追加します

// Gradle Plugin 1.5  
 Android {  
   defaultConfig {  
     generatedDensities = []  
  }  

  // This is handled for you by the 2.0+ Gradle Plugin  
  aaptOptions {  
    additionalParameters "--no-version-vectors"  
  }  
 }

そして、もちろん、レイアウトファイル内では、srcCompat属性を使用する必要があります。

<ImageView  
  Android:layout_width="wrap_content"  
  Android:layout_height="wrap_content"  
  app:srcCompat="@drawable/ic_add"/>
11
Mr.Moustard

24.2.0では、v4サポートライブラリがGoogleによっていくつかの小さなモジュールに分割されました。

com.Android.support:support-compat:24.2.0

Context.getDrawable()やView.performAccessibilityAction()などの新しいフレームワークAPIの互換性ラッパーを提供します。

com.Android.support:support-core-utils:24.2.0

AsyncTaskLoaderやPermissionCheckerなど、多くのユーティリティクラスを提供します。

com.Android.support:support-core-ui:24.2.0

ViewPager、NestedScrollView、ExploreByTouchHelperなど、さまざまなUI関連コンポーネントを実装します。

com.Android.support:support-media-compat:24.2.0

MediaBrowserやMediaSessionを含むメディアフレームワークの一部をバックポートします。

com.Android.support:support-fragment:24.2.0

フラグメントフレームワークをバックポートします。このモジュールは、support-compat、support-core-utils、support-core-ui、およびsupport-media-compatに依存しています。

すべての変更を確認できます here

3
Duda

したがって、この問題への答えは、ボールを落としたことを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プロジェクト。公式プロジェクトビルドでファイルを見つけることができないようです。ずさんなメンテナンスの問題。比較のためのスタックトレースを以下に示します。

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
2
Coder Roadie

Dexguardでも同じ問題がありました。構成ファイルに次の行を追加します。

-keepresourcexmlattributenames vector/*
1
ialfa1987

私にとっては、プロジェクトルートbuild.gradleファイルの古いビルドツールラッパーでした。

dependencies {
    ....
    classpath 'com.Android.tools.build:gradle:2.1.2'
}

の代わりに

classpath 'com.Android.tools.build:gradle:1.X.X'
0
zaPlayer