Подтвердить что ты не робот

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

Мы пытаемся запустить тесты на travis 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 библиотеки поддержки Android, но все еще указанная выше ошибка.

Update:

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

  • Тестирование завершилось с той же ошибкой при запуске на машине.
  • Попробуйте вручную скопировать internal_impl-21.0.0.jar в файл support-v4 aar в наш каталог libs/ и пройденные тесты.
  • Вручную установлена ​​ 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 Тем не менее тесты терпят неудачу на трайве.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

Новая версия support-v7-appcompat совместима с Android Lollipop и Стиль материала.

См. этот ответ для его обновления или Внедрение приложения ввода-вывода Google и образец Google.

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


2. Конфигурация Трэвиса: последние инструменты SDK, инструменты для платформы, инструменты для сборки и требуемые дополнительные ресурсы

Добавьте 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. Если вы этого не сделаете, последние компоненты системы 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 содержит артефакты (.arar файлы) для gradle/android studio.

Примечание. Если вы работаете с 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

Missing 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') {
исключить группу: '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 Соответствующие и, следовательно, имеют явную зависимость от него. Избегать ошибки, в то время как Dexing вашего тестового кода вы можете использовать зависимости no версию Espresso и явно объявить ваши зависимости

Если вам нужна какая-либо функциональность из библиотеки Contrib, например DrawerActions, скопируйте espresso-contrib jar из здесь. 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 '

Ответ 4

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

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

Ответ 5

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

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

Проблема загрузчика класса установлена ​​на 0,8.14. Проблема синхронизации gradleфиксируется на стороне модели в gradle 0,14.

Ответ 6

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

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

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