Файл класса для android.support.v4.widget.DrawerLayoutImpl не найден на travis support-v4 21.0

Мы пытаемся запустить тесты на Трэвис CI. У нас есть класс, который использует android.support.v4.widget.DrawerLayout .

Когда мы используем библиотеку v4 для поддержки Android
build.gradle ->

 targetSdkVersion: 19 `compile 'com.android.support:support-v4:20.0.0'` 

.travis.yml

 - build-tools-19.1.0 - android-19 - extra-android-support - extra-google-google_play_services - extra-google-m2repository 

Мы не получаем эту ошибку, но

build.gradle ->

 targetSdkVersion: 21 com.android.support:support-v4:21.0.+ 

.travis.yml

 - build-tools-21.0.1 - android-21 - extra-android-support - extra-google-google_play_services - extra-google-m2repository 

Мы получаем ошибку

  private static class IdlingDrawerListener implements DrawerListener, IdlingResource { ^ class file for android.support.v4.widget.DrawerLayoutImpl not found /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:200: error: cannot find symbol private ResourceCallback callback; ^ symbol: class ResourceCallback location: class IdlingDrawerListener /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:255: error: cannot find symbol public void registerIdleTransitionCallback(ResourceCallback callback) { ^ symbol: class ResourceCallback location: class IdlingDrawerListener /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:153: error: method setDrawerListener in class DrawerLayout cannot be applied to given types; drawer.setDrawerListener(IdlingDrawerListener.getInstance(existingListener)); ^ required: DrawerListener found: IdlingDrawerListener reason: actual argument IdlingDrawerListener cannot be converted to DrawerListener by method invocation conversion /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:192: error: cannot find symbol instance = new IdlingDrawerListener(); ^ symbol: constructor IdlingDrawerListener() location: class IdlingDrawerListener /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:193: error: method registerIdlingResources in class Espresso cannot be applied to given types; Espresso.registerIdlingResources(instance); ^ required: IdlingResource[] found: IdlingDrawerListener reason: argument type IdlingDrawerListener does not conform to vararg element type IdlingResource /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:205: error: non-static variable this cannot be referenced from a static context this.parentListener = parentListener; ^ /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:205: error: cannot find symbol this.parentListener = parentListener; ^ symbol: variable parentListener /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:208: error: method does not override or implement a method from a supertype @Override ^ /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:215: error: method does not override or implement a method from a supertype @Override ^ /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:256: error: non-static variable this cannot be referenced from a static context this.callback = callback; ^ /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:256: error: cannot find symbol this.callback = callback; ^ symbol: variable callback /home/travis/build/something/sample/src/test/java/com/abc/somesample/espresso/DrawerActions.java:254: error: method does not override or implement a method from a supertype @Override ^ 

Трэвис даже показывает, что он загрузил и установил версию 21 Support Library для Android, но все еще указанную выше ошибку.

Обновить:

Мы пытались запустить тесты на виртуальной машине, созданные ребятами из Travis.

  • Сбой теста с той же ошибкой при запуске на машине изначально.
  • Пробовал вручную копировать internal_impl-21.0.0.jar находящийся в файле internal_impl-21.0.0.jar support-v4 в наш каталог libs/ и пройденные тесты.
  • Вручную установили Android SDK tools 23.0.5 на виртуальной Android SDK tools 23.0.5 и пройденные тесты.

Наш проект .travis.yml имеет следующие строки:

- tools - platform-tools - build-tools-21.1.1 - android-21 - extra-android-support - extra-android-m2repository - extra-google-m2repository Тем не менее тесты терпят неудачу на travis.

Solutions Collecting From Web of "Файл класса для android.support.v4.widget.DrawerLayoutImpl не найден на travis support-v4 21.0"

Это звучит как ошибка в трейвисе. Если он не использует Gradle для создания всего, но делает какое-то собственное построение (что звучит так, учитывая, что у вас есть специальные зависимости YAML-файлов), он должен обрабатывать зависимости AAR-файлов, не просто включая classes.jar, но банки Под libs /.

Вручную добавив библиотеку к серверу в файле build.gradle:

 testCompile fileTree(dir: "${rootDir}/YourProject/build/intermediates/exploded-aar/com.android.support/support-v4/", include: "**/*.jar") 

Отредактированный ответ:

Эта проблема исправлена ​​с использованием предварительно скомпилированного класса DrawerActions.java из библиотеки espresso-contrib . Инструкции по установке см. В ссылке .

1. ActionBarDrawerToggle: устаревание, стиль новой версии для Lollipop и обновленные образцы

DrawerLayout имеет вложенный интерфейс DrawerListener, реализованный:

  1. Android.support.v4.app.ActionBarDrawerToggle (устарел на API 21) .
  2. Android.support.v7.app.ActionBarDrawerToggle (рекомендуемая версия) .

Новая версия поддержки-v7-appcompat совместима с Android Lollipop и дизайном Material Design .

См. Этот ответ, чтобы обновить его, или реализацию приложения Google I / O и образец Google .

Требуется последняя версия SDK, appcompat-v7.21.0. +, Support-v4.21.0. + И репозиторий поддержки Android.


2. Конфигурация Travis: нужны новейшие инструменты SDK, инструменты для платформы, инструменты для сборки и дополнительный m2-репозиторий

Добавьте extra-android-m2repository и build-tools-21.1.1 в android: components:

Travis CI для проектов Android использует инструменты 23.0.2 по умолчанию, Lollipop требует инструментов SDK 23.0.5 .

Важно: Чтобы загрузить последние компоненты системы Android из Android SDK Manager, вы должны сначала обновить SDK Tools до последней версии и перезапустить SDK Manager. Если вы этого не сделаете, последние системные компоненты Android не будут доступны для загрузки.

Сначала вам необходимо обновить SDK- tools чтобы получить последние версии других компонентов. Для инструментов v23.0.5 требуется обновить platform-tools v19 + и v21 +. Plus, sys-img и т. Д. Попробуйте следующее:

 android: components: # Uncomment the lines below if you want to # use the latest revision of Android SDK Tools - platform-tools - tools - build-tools-21.1.1 - android-21 - extra-android-support - extra-android-m2repository - extra-google-m2repository - extra-google-google_play_services - sys-img-armeabi-v7a-android-21 licenses: - 'android-sdk-license-5be876d5' 

3. Важно: проекты на основе Gradle требуют дополнительного андроида-m2repository без поддержки андроида

extra-android-m2repository содержит артефакты (файлы .aar) для студийной ступени gradle / android.

Примечание. Если вы работаете в Android Studio, выберите и установите элемент репозитория поддержки Android (библиотека поддержки Android на Eclipse).

Дополнительная информация для Android Studio: https://developer.android.com/tools/support-library/setup.html


4. Недопустимый класс DrawerLayoutImpl, содержащийся в файле android.support :support-v4:21.0.2 internal .jar

Отсутствует DrawerLayoutImpl

Вы можете попробовать изменить 21.0.+ 21.0.2 . Я не уверен в рабочем процессе разрешения конфликтов Travis-ci.

 compile 'com.android.support:support-v4:21.0.2' compile 'com.android.support:appcompat-v7:21.0.2' 

Я не знаю, но, возможно, он копирует другую версию android.support без внутреннего отсутствующего класса и jar.

Проверьте, есть ли внутренняя банка, добавив что-то как это в свою сборку:

 export MOD_NAME= yourapplicationmodulename 'cat ${TRAVIS_BUILD_DIR}/${MOD_NAME}/build/intermediates/tmp/dex/debug/libraryList.txt' 

Если вы используете 21.0. + И загружаете версию m2repository 21.0.0, но затем просматриваете обновленные версии на maven, она обнаружила Android Support Library, версия 21.0.1 без аара, поэтому попробуйте новую версию 21.0.2.


5. Espresso или Double Espresso, DrawerActions, espresso-contrib jar и другие зависимости

О Espresso и других транзитивных зависимостях от старых библиотек поддержки вы можете попробовать обновить их или исключить зависимости android.support:

 configurations { compile.exclude group: 'com.android.support' } 

Я не знаком с Double espresso , чистым портом Gradle утилиты для тестирования Espresso для Android, но Джейк Уортон пишет здесь ( Связанная с этим проблема ):

Дублированные зависимости

Из-за ошибки в текущем Android-плагине вам может потребоваться исключить зависимости, которые дублируются как в приложении, так и в тестовом приложении.

Например, если у вас есть зависимость от кинжала, вам нужно вручную исключить его из тестовой зависимости.

AndroidTestCompile ('com.jakewharton.espresso: espresso: 1.1-r3') {
Exclude group: 'com.squareup.dagger'} Ниже приведены зависимости Espresso, которые могут быть временно исключены:

Com.squareup.dagger: кинжал: 1.2.1 … и модуль «support-v4»:

Com.android.support:support-v4:21.0.0 <———–

О Espresso я читал, что поддерживает до kitkat, но я не знаю, полностью ли поддерживается Lollipop, и я нашел связанную с этим проблему об Espresso.registerIdlingResources (экземпляр), и я цитирую здесь :

Иногда вы хотите использовать версию Espresso, в которой вы контролируете зависимости. Например, Espresso использует Hamcrest Matchers и поэтому имеет явную зависимость от него. Чтобы избежать ошибок при использовании Dexing вашего тестового кода, вы можете использовать версию без зависимостей Espresso и явно объявлять свои зависимости

Если вам нужна какая-либо функциональность из библиотеки Contrib , например DrawerActions , скопируйте здесь банку espresso-contrib . Действия Espresso для использования DrawerLayout .


6. Шаг сокращения ProGuard: правила обновления для изменений API 21

Я использую реализацию приложения ввода-вывода Google, поскольку я видел, что вы делаете, чтобы изучить Material Design и все это. Недавно они обновили приложение, добавили app-compat и фиксированный навигатор, но я думаю, что они не обновили правила ProGuard. Если вы используете аналогичную конфигурацию, я предлагаю вам обновить ее и проверить правила aapt, чтобы убедиться, что отсутствующие классы сохранены.

В качестве экспериментального образца я тоже его изучаю, я добавил новый конструктор API 21 View и includedescriptorclasses

 # Added includedescriptorclasses for unkept android.support descriptors -keep,includedescriptorclasses public class * extends android.view.View { public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); public <init>(android.content.Context, android.util.AttributeSet, int, int); # Added in API 21 public void set*(...); 

И 43 из 44 заметок о дескрипторах unkept были решены, включены

Примечание: в конфигурации сохраняется точка входа «android.support.v4.widget.DrawerLayout {void setDrawerListener (android.support.v4.widget.DrawerLayout $ DrawerListener); } ', Но не класс дескриптора' android.support.v4.widget.DrawerLayout $ DrawerListener '

Вы можете столкнуться с этой проблемой (?) https://code.google.com/p/android/issues/detail?id=77682#c11 .

Последний комментарий от @Tor Norbye, по иронии судьбы :), говорит

Проблема загрузчика класса установлена ​​на 0,8.14. Проблема синхронизации градиента должна быть исправлена ​​на стороне модели в Gradle 0.14.

После нескольких тестов он работал для меня, добавляя зависимость:

 compile 'com.android.support:internal_impl:22.2.0' 

К сожалению, вы должны сохранить этот JAR обновленный, когда вы измените версию «support» lib.