在Travis上,找不到用于android.support.v4.widget.DrawerLayoutImpl的类文件,支持版本为21.0。

13

我们正尝试在Travis CI上运行测试。我们有一个使用android.support.v4.widget.DrawerLayout的类。

当我们使用Android支持v4库时,在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
        ^

即使Travis显示已下载并安装了Android Support Library修订版21,但仍出现上述错误。

更新:

我们尝试在travis提供的VM上运行测试。

  • 当最初在机器上运行时,测试以相同的错误失败。
  • 通过手动复制support-v4aar文件中找到的internal_impl-21.0.0.jar到我们的libs/目录中进行尝试,测试通过了。
  • 在VM上手动安装Android SDK工具23.0.5后,测试通过。

我们的项目.travis.yml中有以下几行:

- 工具 - 平台工具 - 构建工具21.1.1 - Android-21 - extra-android-support - extra-android-m2repository - extra-google-m2repository 即使如此,测试仍在Travis上失败。


2
我在Jenkins构建系统上遇到了同样的问题。在本地机器上运行良好,但由于某些原因在Jenkins上崩溃了。 - Mikooos
2
@Mikooos,您可以轻松地在运行Jenkins的计算机上检查androidsdk。您的本地计算机中v21 jar文件中的类与Jenkins计算机中v21 jar文件中的类是否有任何区别? - Gaurav Vashisth
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Michael Pardo
1
那么现在唯一的解决方法是手动安装或手动包含上述的jar文件?你现在是这样做的吗? - loeschg
显示剩余3条评论
6个回答

1
在build.gradle中手动将库添加到服务器可行:
testCompile fileTree(dir: "${rootDir}/YourProject/build/intermediates/exploded-aar/com.android.support/support-v4/", include: "**/*.jar")

这对我在Shippable上起作用了。这很奇怪,我不确定发生了什么,但它可以工作... - MinceMan

1

1. ActionBarDrawerToggle:弃用,Lollipop的新版本样式和更新示例

DrawerLayout有一个嵌套接口DrawerListener,由以下实现:

  1. android.support.v4.app.ActionBarDrawerToggle(在API 21上已弃用)
  2. android.support.v7.app.ActionBarDrawerToggle(推荐版本)

新的support-v7-appcompat版本与Android LollipopMaterial Design风格兼容。

请查看此响应以进行更新,或者请参考Google I/O 应用程序实现Google 示例

需要最新的SDK版本、appcompat-v7.21.0.+、support-v4.21.0.+ 和 Android Support Repository。


2. Travis配置:需要最新的SDK工具、平台工具、构建工具和extra-m2repository

android:components:中添加extra-android-m2repositorybuild-tools-21.1.1

Travis CI for Android projects默认使用23.0.2版本的工具,而Lollipop需要SDK tools 23.0.5

重要提示:要从Android SDK Manager下载最新的Android系统组件,您必须先将SDK Tools更新到最新版本,然后重新启动SDK Manager。如果不这样做,则无法下载最新的Android系统组件。

您需要首先更新SDK tools以获取其他组件的最新修订版。Tools v23.0.5需要更新platform-tools v19+并且v21+可用于工作。此外还有platform、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的项目需要额外安装extra-android-m2repository而不是extra-android-support extra-android-m2repository 包含了gradle/android studio所需的构件(.aar文件)。

注意: 如果您正在使用Android Studio进行开发,请选择并安装 Android Support Repository 而不是 Eclipse 上的 Android Support Library。

有关Android Studio的更多信息: https://developer.android.com/tools/support-library/setup.html


4. android.support:support-v4:21.0.2内部.jar文件中缺少的DrawerLayoutImpl类

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文件。
通过将以下内容添加到构建中来检查是否存在内部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,没有aar文件,则尝试新的21.0.2版本。

5. Espresso或Double Espresso,DrawerActions,espresso-contrib jar和其他依赖项

关于Espresso和其他传递依赖项到旧的支持库,您可以尝试升级它们或排除android.support 依赖项

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

我不太熟悉Double espresso,这是一个专门为 Android 设计的纯 Gradle 移植版本的 Espresso 测试工具,但 Jake Wharton 在 这里 (相关问题) 写到:

重复依赖

由于当前 Android 插件中存在一个 bug,您可能需要排除同时存在于应用程序和测试应用程序中的依赖项。

例如,如果您有一个 Dagger 依赖项,则需要手动将其从测试依赖项中排除。

androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3') {
exclude group: 'com.squareup.dagger' } 下面是 Espresso 的依赖项,这些依赖项可能需要暂时排除:

com.squareup.dagger:dagger:1.2.1 ... 还有 'support-v4' 模块的依赖项:

com.android.support:support-v4:21.0.0 <-----------

关于Espresso,我看到它支持到奇特糖(Android 4.4),但我不知道Lollipop是否完全支持。我找到了一个相关问题,涉及到Espresso.registerIdlingResources(instance),并从这里引用:
有时您想使用自己控制依赖项的Espresso版本。例如,Espresso使用Hamcrest Matchers,因此明确依赖于它。为了避免在Dex测试代码时出现错误,您可以使用没有依赖关系的Espresso版本并明确声明您的依赖关系
如果您需要从contrib库中获取任何功能,例如DrawerActions,请从here复制espresso-contrib jar。Espresso操作用于使用DrawerLayout

6. ProGuard缩小步骤:更新API 21更改的规则

我正在使用Google I/O应用程序实现,就像我看到你也在学习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个已经得到解决,包括:

注意:配置保留了入口点“android.support.v4.widget.DrawerLayout { void setDrawerListener(android.support.v4.widget.DrawerLayout$DrawerListener); }”,但不保留描述符类“android.support.v4.widget.DrawerLayout$DrawerListener”


我添加了另一种可能性。也许你需要v7 appcompat。再加上extra-android-m2repository... - albodelu
我进行了回滚,解决方案在第5点的最后一行以粗体显示,但你说这是Gradle问题http://stackoverflow.com/posts/27358362/revisions,当他们更新Espresso时我将其删除 :) - albodelu

1
这听起来像是travis中的一个bug。如果它不仅使用Gradle来构建所有内容,而是自己进行一些构建(根据你有特殊的YAML文件列出依赖项的描述听起来是这样),那么它需要通过不仅包括classes.jar,而且还需要处理libs/目录下的jar包来处理AAR文件的依赖关系。

Travis需要做什么?当找到适当的文件时,Travis运行 gradle build connectedCheck (http://git.io/4Th6Xg)。还需要什么? - banzaiman
@tor-norbye提出了这个问题:问题链接 - ragdroid

1

编辑后的答案:

使用来自espresso-contrib库的预编译DrawerActions.java类可以解决此问题。有关设置说明,请参见link


仍然在使用gradle-2.2.1-all.zip时遇到此错误。 - dnkoutso
@dnkoutso请查看已编辑的答案。您是否复制了 DrawerActions.java 或者使用了 espresso-contrib 库? - ragdroid
@ragdroid 你应该使用哪一个? - ZakTaccardi
使用 espresso-contrib 库。 - ragdroid
@ragdroid,您能详细说明一下您的答案,并可能提供一个示例吗?仅仅将androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.2'添加到我的build.gradle文件中并不能解决这个问题... - abelcookingfox

0

0

经过多次测试,我发现添加依赖项可以解决问题:

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

很不幸,当你更改“support”库版本时,你必须更新这个JAR。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接