Android 机器人分子2.x+;Jenkins上的Maven因APKLIB依赖项而失败
我在使用APKLIBs的Android Maven项目中使用Robolectric 2.x(实际上我使用的是2.1)时遇到了一个问题 Robolectric 2.x希望在project.properties中引用Android库(该文件由Intellij或Eclipse自动填充) 在开发环境中使用Maven时效果很好,但是如果我想在CI服务器(Jenkins)上构建Android Maven项目,我的构建会失败: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
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”