Android 机器人分子2.x+;Jenkins上的Maven因APKLIB依赖项而失败

Android 机器人分子2.x+;Jenkins上的Maven因APKLIB依赖项而失败,android,maven,jenkins,robolectric,Android,Maven,Jenkins,Robolectric,我在使用APKLIBs的Android Maven项目中使用Robolectric 2.x(实际上我使用的是2.1)时遇到了一个问题 Robolectric 2.x希望在project.properties中引用Android库(该文件由Intellij或Eclipse自动填充) 在开发环境中使用Maven时效果很好,但是如果我想在CI服务器(Jenkins)上构建Android Maven项目,我的构建会失败: java.lang.RuntimeException:嗯?找不到StyleDat

我在使用APKLIBs的Android Maven项目中使用Robolectric 2.x(实际上我使用的是2.1)时遇到了一个问题

Robolectric 2.x希望在project.properties中引用Android库(该文件由Intellij或Eclipse自动填充)

在开发环境中使用Maven时效果很好,但是如果我想在CI服务器(Jenkins)上构建Android Maven项目,我的构建会失败:


java.lang.RuntimeException:嗯?找不到StyleData的父项{name='Theme\u Abs\u cs',parent='style/Theme\u Sherlock\u Light'}

显然,Robolectric找不到Android库依赖项


是否有人拥有使用安卓APKLIB+Jenkins+Maven+Robolectric 2.x的配置?

以下是我们在Square的处理方式。。。将APK依赖项解压到
target/unpack
,然后我们扩展RobolectrictTestRunner以将它们拉入。有点笨重,但这是我们最好的

public class SquareTestRunner extends RobolectricTestRunner {
  private static boolean alreadyRegisteredAbs = false;

  public SquareTestRunner(Class<?> testClass) throws InitializationError {
    super(testClass);
  }

  @Override protected AndroidManifest createAppManifest(File baseDir) {
    return new MavenAndroidManifest(Fs.newFile(new File(".")));
  }

  public static class MavenAndroidManifest extends AndroidManifest {
    public MavenAndroidManifest(FsFile baseDir) {
      super(baseDir);
    }

    @Override protected List<FsFile> findLibraries() {
      // Try unpack folder from maven.
      FsFile unpack = getBaseDir().join("target/unpack/apklibs");
      if (unpack.exists()) {
        FsFile[] libs = unpack.listFiles();
        if (libs != null) {
          return asList(libs);
        }
      }
      return emptyList();
    }

    @Override protected AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir) {
      return new MavenAndroidManifest(libraryBaseDir);
    }
  }
}
公共类SquareTestRunner扩展了RobolectrictTestRunner{
私有静态布尔值alreadyRegisteredAbs=false;
public SquareTestRunner(类testClass)引发初始化错误{
超级(测试类);
}
@覆盖受保护的AndroidManifest createAppManifest(文件baseDir){
返回新的MavenAndroidManifest(Fs.newFile(新文件(“.”));
}
公共静态类MavenAndroidManifest扩展了AndroidManifest{
公共MavenAndroidManifest(FsFile baseDir){
超级(baseDir);
}
@覆盖受保护的列表findLibraries(){
//尝试从maven解包文件夹。
FsFile unpack=getBaseDir().join(“target/unpack/apklibs”);
if(unpack.exists()){
FsFile[]libs=unpack.listFiles();
if(libs!=null){
返回asList(libs);
}
}
返回空列表();
}
@覆盖受保护的AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir){
返回新的MavenAndroidManifest(libraryBaseDir);
}
}
}

对于使用AppCompat库(aar类型)的Android Studio+Robolectric2.3+Android maven插件3.9.0-rc.2项目,我遇到了类似的问题,导致:

java.lang.RuntimeException:嗯?找不到的父对象 StyleData{name='Theme'u Custom',parent='@style/Theme\u AppCompat\u Light'

要处理此问题,我创建了自定义测试运行程序:

public class MyTestRunner extends RobolectricTestRunner {
    private static boolean alreadyRegisteredAbs = false;

    public MyTestRunner(Class<?> testClass) throws InitializationError {
        super(testClass);
    }

    @Override
    protected AndroidManifest createAppManifest(FsFile manifestFile, FsFile resDir, FsFile assetsDir) {
        return new MavenAndroidManifest( manifestFile,  resDir,  assetsDir);
    }

    public static class MavenAndroidManifest extends AndroidManifest {
        public MavenAndroidManifest(FsFile androidManifestFile, FsFile resDirectory, FsFile assetsDirectory) {
            super(androidManifestFile, resDirectory, assetsDirectory);
        }

        public MavenAndroidManifest(FsFile libraryBaseDir) {
            super(libraryBaseDir);
        }

        @Override
        protected List<FsFile> findLibraries() {
            // Try unpack folder from maven.
            FsFile unpack = getBaseDir().join("target/unpacked-libs");
            if (unpack.exists()) {
                FsFile[] libs = unpack.listFiles();
                if (libs != null) {
                    return Arrays.asList(libs);
                }
            }
            return Collections.emptyList();
        }

        @Override
        protected AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir) {
            return new MavenAndroidManifest(libraryBaseDir);
        }
    }
}
公共类MyTestRunner扩展了RobolectrictTestRunner{
私有静态布尔值alreadyRegisteredAbs=false;
公共MyTestRunner(类testClass)引发初始化错误{
超级(测试类);
}
@凌驾
受保护的AndroidManifest createAppManifest(FsFile manifestFile、FsFile resDir、FsFile assetsDir){
返回新的MavenAndroidManifest(manifestFile、resDir、assetsDir);
}
公共静态类MavenAndroidManifest扩展了AndroidManifest{
公共MavenAndroidManifest(FsFile androidManifestFile、FsFile resDirectory、FsFile assetsDirectory){
super(androidManifestFile、resDirectory、assetsDirectory);
}
公共MavenAndroidManifest(FsFile libraryBaseDir){
超级(库基目录);
}
@凌驾
受保护列表findLibraries(){
//尝试从maven解包文件夹。
FsFile unpack=getBaseDir();
if(unpack.exists()){
FsFile[]libs=unpack.listFiles();
if(libs!=null){
返回数组.asList(libs);
}
}
返回集合。emptyList();
}
@凌驾
受保护的AndroidManifest createLibraryAndroidManifest(FsFile libraryBaseDir){
返回新的MavenAndroidManifest(libraryBaseDir);
}
}
}

有些库可能没有res文件夹,这会导致测试无法启动。通过迭代libs数组并使用FileUtils.forceMakeDirs(libs,“res”);为我解决了这个问题。目录名现在显示为“target/unpack libs”,而不是“target/unpack/apklibs”