Флаг Vector Drawables не работает в Support Library 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)
      ...

Я что-то совсем пропустил? Или это уже известная проблема (в гугле ничего не нашел)? Любая помощь будет оценена по достоинству.


person Brigham Byerly    schedule 23.08.2016    source источник
comment
Похоже, ресурс не найден, убедитесь, что он находится в нужной папке.   -  person Jorge Mendez    schedule 23.08.2016
comment
Это происходит в отладочной версии приложения или только в релизе?   -  person lionscribe    schedule 23.08.2016
comment
@JorgeMendez На самом деле это ресурс, который нельзя найти внутри библиотеки поддержки. Это связано с новыми векторными возможностями для устройств, предшествующих Lollipop. Подробнее здесь   -  person Brigham Byerly    schedule 23.08.2016
comment
@lionscribe У меня возникла эта проблема в отладочной версии приложения - позвольте мне посмотреть версию выпуска.   -  person Brigham Byerly    schedule 23.08.2016
comment
@lionscribe Ага, релиз тоже.   -  person Brigham Byerly    schedule 23.08.2016


Ответы (6)


Ух... Ненавижу, когда такое происходит. Вы задаете вопрос, а затем сами же отвечаете на него через несколько часов. В любом случае, похоже, что я использовал устаревшую версию инструментов сборки. Все, что мне нужно было сделать, это изменить одну строку в моей градации:

buildToolsVersion "24.0.1"
person Brigham Byerly    schedule 23.08.2016
comment
это не решило мою проблему с API до Lollipop. Я использую библиотеку поддержки версии 24.2.0, инструменты сборки 24.0.2 и предоставляю --no-version-vectors при использовании aapt. - person Reuben Tanner; 19.09.2016
comment
@HypotheticalintheClavicle У вас такая же трассировка стека и все такое? - person Brigham Byerly; 20.09.2016
comment
@Спасибо. Для меня compileSdkVersion было 25, а buildToolsVersion было 21.1.2. Исправил на 25.0.1 и заработало - person FindOut_Quran; 30.12.2016
comment
мне тоже не помогло - person AppiDevo; 09.01.2017
comment
Секрет в том, что compileSdkVersion, buildToolsVersion и версии библиотеки поддержки должны иметь один и тот же основной номер версии (все начинаются с одного и того же основного номера, например, 24). - person mikejonesguy; 03.02.2017

В дополнение к конфигурации 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"/>
person Mr.Moustard    schedule 02.02.2017
comment
Он хорошо работает для просмотра изображений, но на самом деле то, что мне нужно для фонового изображения текстового просмотра, пожалуйста, помогите - person shweta c; 28.07.2017
comment
@shwetac Я не знаю, сможете ли вы это сделать, но вместо того, чтобы использовать только textView, вы можете попробовать использовать imageView в качестве фонового изображения и textView поверх него. - person Mr.Moustard; 28.07.2017
comment
горчица Я использовал тот же андроид: фон, но получил ошибку. - person shweta c; 28.07.2017
comment
Я не пробовал, но я уверен, что вы не можете этого сделать, вы должны использовать приложение: srcCompat - person Mr.Moustard; 28.07.2017
comment
Это помогло мне решить проблему Android 4 с React Switch. Спасибо! - person G0dsquad; 08.05.2018
comment
@ G0dsquad Рад это слышать. - person Mr.Moustard; 08.05.2018

В версии 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

Реализует различные компоненты, связанные с пользовательским интерфейсом, такие как ViewPager, NestedScrollView и ExploreByTouchHelper.

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.

Вы можете увидеть все изменения здесь

person Duda    schedule 23.08.2016
comment
Это не может быть причиной сбоя, поскольку я начинаю видеть его уже в 24.0.0 . Интересно, однако, что в версии 24.2.0 меняется xml-файл ненайденного ресурса, что может быть как-то связано с этим разделением. - person Brigham Byerly; 23.08.2016
comment
Означает ли это, что если мы удалим com.android.support:support-v4:24.2.0 из нашего файла gradle и добавим 6 зависимостей, перечисленных выше, мы технически получим все те же функции? - person JuiCe; 24.08.2016
comment
Я вижу ту же проблему сегодня после обновления моего проекта до версии 25.0.1 библиотек поддержки. Честно говоря, у сопровождающих библиотек Android нет оправдания очередному провалу в дизайне библиотек. Пока нет указаний (я буду продолжать искать) о библиотеке, которую мне нужно включить, чтобы мой проект мог найти abc_vector_test.xml - person Coder Roadie; 10.12.2016

Таким образом, решение этой проблемы состоит в том, чтобы напомнить сопровождающим 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
person Coder Roadie    schedule 09.12.2016
comment
Хотя это не официальный выпуск, это преобразование AAR, выпущенного Google, в проект библиотеки Eclipse. См. примечания в REAMDE.md, и вы сможете найти файл ресурсов в AAR локально на вашем компьютере для подтверждения. github.com/dandar3/android-support-v7-appcompat/ дерево/25.0.1 - person Dan Dar3; 13.01.2017

У меня была такая же проблема с dexguard. Добавьте эту строку в свой файл конфигурации:

-keepresourcexmlattributenames vector/*
person ialfa1987    schedule 23.08.2016
comment
Я не использую DexGuard. Я использую ProGuard, но это применяется только для выпускных сборок, а моя ошибка возникает при отладочных сборках. - person Brigham Byerly; 23.08.2016
comment
@ialfa Я полагаю, вы получили это решение из моего предыдущего поста. Вот почему я спросил, было ли это только в версии Release. - person lionscribe; 23.08.2016
comment
@ialfa Я рад, что помог кому-то! - person lionscribe; 23.08.2016

для меня это была старая оболочка инструментов сборки в корневом файле проекта build.gradle

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

вместо

classpath 'com.android.tools.build:gradle:1.X.X'
person zaPlayer    schedule 19.02.2017