Ответ 1
Отредактированный ответ:
Эта проблема исправлена с использованием предварительно скомпилированного класса DrawerActions.java
из библиотеки espresso-contrib
. Инструкции по установке см. В ссылке.
Мы пытаемся запустить тесты на 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
Тем не менее тесты терпят неудачу на трайве.
Отредактированный ответ:
Эта проблема исправлена с использованием предварительно скомпилированного класса DrawerActions.java
из библиотеки espresso-contrib
. Инструкции по установке см. В ссылке.
Это звучит как ошибка в трейвисе. Если он не использует Gradle для сборки всего, но делает какое-то собственное построение (что похоже на то, что у вас есть специальные зависимости YAML файлов), он должен обрабатывать зависимости AAR файлов, не просто включая classes.jar, но банок под libs/.
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
Вы можете попробовать изменить 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 '
Вручную добавление библиотеки на сервер в файле build.gradle:
testCompile fileTree(dir: "${rootDir}/YourProject/build/intermediates/exploded-aar/com.android.support/support-v4/", include: "**/*.jar")
Возможно, вы столкнулись с этой проблемой (?) https://code.google.com/p/android/issues/detail?id=77682#c11.
Последний комментарий от @Tor Norbye, по иронии судьбы:), говорит
Проблема загрузчика класса установлена на 0,8.14. Проблема синхронизации gradleфиксируется на стороне модели в gradle 0,14.
После нескольких тестов он работал у меня, добавляя зависимость:
compile 'com.android.support:internal_impl:22.2.0'
К сожалению, вы должны сохранить этот JAR обновленный, когда вы измените версию "support" lib.