在travis yml文件中配置gradle.properties android.enableAapt=false

9

在我的安卓的gradle.properties文件中,我有以下内容:

android.enableAapt2=false

我的gradle.properties文件位于本地机器的~/.gradle/gradle.properties

我想知道如何将android.enableAapt=false添加到我的yml文件中。

我尝试在全局范围内添加它,但没有任何错误,但是在使用gradle:3.0.0-beta3时,需要在robolectric中设置它。

language: android

jdk: oraclejdk8

env:
  global:
    - ANDROID_TARGET=android-25
    - ANDROID_ABI=armeabi-v7a
    - android.enableAapt2=false

android:
  components:
  - tools
  - platform-tools
  - build-tools-25.0.3
  - android-25
  - extra-android-m2repository
  - sys-img-${ANDROID_ABI}-${ANDROID_TARGET}


licenses:
  - android-sdk-license-.+
  - '.+'

script:
    - ./gradlew --daemon build jacocoTestReport --info

after_success:
    - bash <(curl -s https://codecov.io/bash)

以下是travis-ci上的配置文件:
{
  "language": "android",
  "jdk": "oraclejdk8",
  "android": {
    "components": [
      "tools",
      "platform-tools",
      "build-tools-25.0.3",
      "android-25",
      "extra-android-m2repository",
      "sys-img-${ANDROID_ABI}-${ANDROID_TARGET}"
    ]
  },
  "licenses": [
    "android-sdk-license-.+",
    ".+"
  ],
  "script": [
    "./gradlew --daemon build jacocoTestReport --info"
  ],
  "after_success": [
    "bash <(curl -s https://codecov.io/bash)"
  ],
  "global_env": "ANDROID_TARGET=android-25 ANDROID_ABI=armeabi-v7a android.enableAapt2=false",
  "group": "stable",
  "dist": "precise",
  "os": "linux"
}

测试用的类:

public class RecipeListViewHolderTest extends BaseRobolectricTestRunner {
    @Inject Map<Integer, RecipeListViewHolderFactory> viewHolderFactories;
    @Inject @LayoutRes int recipeItem; /* This is injected return R.layout.recipe_item; */

    private RecipeListViewHolder recipeListViewHolder;

    @Before
    public void setup() {
        getTestComponent().inject(RecipeListViewHolderTest.this);
        final Context context = ShadowApplication.getInstance().getApplicationContext();

        final View view = View.inflate(
                context,
                recipeItem,
                new LinearLayout(context));

        recipeListViewHolder = viewHolderFactories.get(Constants.RECIPE_LIST).create(view);
        assertThat(recipeListViewHolder, is(notNullValue()));
    }

    private Recipe createRecipeData() {
        Recipe recipe = new Recipe();
        recipe.setName("Test Brownies");
        recipe.setServings(10);

        return recipe;
    }

    @Test
    public void testRecipeDataIsPopulated() {
        recipeListViewHolder.populateDate(createRecipeData());

        assertThat(recipeListViewHolder.tvQuantity.getText().toString(), is("Quantity: 10"));
        assertThat(recipeListViewHolder.tvRecipeName.getText().toString(), is("Test Brownies"));
    }
}

Robolectric:

@Config(constants = BuildConfig.class,
        sdk = Build.VERSION_CODES.LOLLIPOP,
        packageName = "me.androidbox.busbybaking",
        application = BusbyBakingApplication.class)
@RunWith(RobolectricTestRunner.class)
public abstract class BaseRobolectricTestRunner {

    protected TestBusbyComponent getTestComponent() {
        return DaggerTestBusbyComponent.builder()
                .mockRecipeListModule(new MockRecipeListModule())
                .mockRecipeSchedulersModule(new MockRecipeSchedulersModule())
                .build();
    }
}
travis-ci错误日志:
me.androidbox.busbybaking.recipieslist.RecipeListViewHolderTest > testRecipeDataIsPopulated FAILED
    android.content.res.Resources$NotFoundException: me.androidbox.busbybaking:layout/recipe_item
        at org.robolectric.shadows.ShadowAssetManager.loadXmlResourceParser(ShadowAssetManager.java:391)
        at org.robolectric.shadows.ShadowResources.loadXmlResourceParser(ShadowResources.java:211)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java)
        at android.content.res.Resources.getLayout(Resources.java:1049)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:412)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
        at android.view.View.inflate(View.java:18415)
        at me.androidbox.busbybaking.recipieslist.RecipeListViewHolderTest.setup(RecipeListViewHolderTest.java:41)

我认为travis-ci找不到res文件夹的位置,因为找不到layout/recipe_item:

 android.content.res.Resources$NotFoundException: me.androidbox.busbybaking:layout/recipe_item

1
你确定你没有混淆 android.enableAaptandroid.enableAapt2 吗?你不能禁用 AAPT,但可以禁用 AAPT2。 - azizbekian
1
另外,您在 yml 文件中写入了 android.enableApat=false,应该是 Aapt 而不是 Apat - azizbekian
那是我在travis-ci中犯的错误。那是一个打字错误。我已经相应地更新了我的问题。 - ant2009
我已经更新了我的问题,并附上了我遇到的确切错误。回答你关于 ~/.gradle/gradle.properties 的问题是因为我设置了构建 ramdisk android.buildCacheDir=/mnt/ramdisk/buildCache,而我不想将其导出到 travis-ci。但是,我已经将 gradle.properties 移动到了我的项目目录并删除了那一行。我正在尝试在 travis-ci 上重新构建。 - ant2009
2个回答

6
我认为问题在于您在全局属性文件~/.gradle/gradle.properties中禁用了AAPT2,而不是项目属性文件/yourproject/gradle.properties

那个对于travis-ci有效,谢谢。不过,我有一个快速的问题。在我的本地项目中,Android Studio会使用全局的/.gradle/grade.properties还是本地的/myProject/gradle.properties? - ant2009
1
全局属性优先于本地属性,即如果您在全局和项目gradle.properties文件中定义了同名变量,则来自全局的变量将具有更高的优先级。 - azizbekian

0

可能是因为您从这个官方推文中复制了gradle.properties文件的名称:

https://twitter.com/androidstudio/status/875311569219006464

不幸的是,文本gradle.propertіes中使用了西里尔字母“i”:

echo 'gradle.propertіes' | hexdump -C

00000000 67 72 61 64 6c 65 2e 70 72 6f 70 65 72 74 d1 96 |gradle.propert..| 00000010 65 73 0a |es.|

0xd196 在 UTF8 中代表 'CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I'。

在这种情况下,该文件将无法被识别和使用。


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