在travis support-v4 21.0上找不到android.support.v4.widget.DrawerLayoutImpl的类文件

时间:2014-10-21 13:33:13

标签: android android-gradle robolectric travis-ci android-espresso

我们正在尝试对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支持库修订版21,但仍然出现上述错误。

更新

我们试图在travis们设置的虚拟机上运行测试。

  • 最初在计算机上运行时,测试失败并出现相同的错误。
  • 通过手动将internal_impl-21.0.0.jar support-v4文件中的aar复制到我们的libs/目录并通过测试来尝试。
  • 在VM上手动安装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上进行测试。

6 个答案:

答案 0 :(得分:1)

这听起来像是特拉维斯的一个错误。如果它不使用Gradle来构建所有内容,而是自己构建一些内容(听起来好像,因为你有特殊的YAML文件列出依赖项),它需要处理AAR文件依赖,不仅包括classes.jar,而且jars在libs /下。

答案 1 :(得分:1)

<强> 1。 ActionBarDrawerToggle:弃用,Lollipop的新版本样式和更新的样本

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

  1. android.support.v4.app.ActionBarDrawerToggle (deprecated on API 21)
  2. android.support.v7.app.ActionBarDrawerToggle (recommended version)
  3. 新的support-v7-appcompat版本与Android LollipopMaterial Design样式兼容。

    请参阅this response进行更新,或Google I/O app implementationGoogle sample

    需要最新的SDK版本,appcompat-v7.21.0。+,support-v4.21.0。+和Android支持存储库。


    <强> 2。 Travis配置:最新的SDK工具,平台工具,构建工具和额外的m2存储库

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

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

      

    重要提示:要从中下载最新的Android系统组件   在Android SDK Manager中,您必须先将SDK Tools更新到   最近发布并重新启动SDK Manager。如果你不这样做的话   最新的Android系统组件将无法下载。

    您需要先更新SDK tools,以便获得其他组件的最新版本。工具v23.0.5要求更新platform-tools v19 +并使用v21 +。加平台,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 no extra-android-support

    extra-android-m2repository包含gradle / android studio的工件(.aar文件)。

      

    注意:如果您使用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'
    

    我不知道,但也许它复制了其他没有内部缺失类和jar的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支持库,没有aar的版本21.0.1,请尝试新的21.0.2版本。


    <强> 5。 Espresso或Double Espresso,DrawerActions,espresso-contrib jar和其他依赖

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

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

    我不熟悉Double espresso,这是Android版Espresso测试实用程序的纯Gradle端口,但Jake Wharton撰写hereRelated issue):

      

    重复的依赖关系

         

    由于当前Android插件中存在错误,您可能需要排除   应用程序和测试应用程序中重复的依赖项。

         

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

         

    androidTestCompile(&#39; com.jakewharton.espresso:espresso:1.1-r3&#39;){
      排除组:&#39; com.squareup.dagger&#39;以下是   Espresso的依赖关系,可能需要暂时排除:

         

    com.squareup.dagger:dagger:1.2.1 ......以及&#39; support-v4&#39;   模块:

         

    com.android.support:support-v4:21.0.0&lt; -----------

    关于Espresso,我读到支持kitkat,但我不知道Lollipop现在是否得到完全支持,我发现了Espresso.registerIdlingResources(instance)的相关问题,我引用{{3} }}:

      

    有时您想要使用Espresso的版本   控制依赖关系例如,Espresso使用Hamcrest   Matchers因此明确依赖它。避免   Dexing你的测试代码错误你可以使用no dependencies   Espresso的版本并明确声明您的依赖项

         

    如果您需要contrib库中的任何功能,例如    DrawerActions ,从here复制 espresso-contrib jar 。   使用 DrawerLayout 的Espresso操作。


    <强> 6。 ProGuard缩小步骤:更新API 21更改规则

    我正在使用here,因为我看到你正在学习Material Design和所有这些东西。他们最近Google I/O app implementation但我认为他们没有更新ProGuard规则。如果您使用类似的配置,我建议您更新它并检查aapt规则以确保保留缺少的类。

    作为实验样本,我也在学习它,我添加了updated the app, added app-compat and fixed nav drawerincludedescriptorclasses

    # 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*(...);
    

    关于无关描述符的44个注释中的43个被解决,包括

      

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

答案 2 :(得分:1)

编辑答案:

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

答案 3 :(得分:1)

在build.gradle中手动将库添加到服务器:

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

答案 4 :(得分:0)

您可能遇到过此问题(?)https://code.google.com/p/android/issues/detail?id=77682#c11

@Tor Norbye最后的评论,具有讽刺意味:),

  

类加载器问题固定为0.8.14。 gradle sync问题有   在Gradle 0.14中固定在模型侧。

答案 5 :(得分:0)

经过多次测试后,我可以添加依赖项:

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

不幸的是,当您更改“支持”时,您必须更新此JAR。 lib版本。