10

在我的Android的gradle.properties我有以下几点:配置gradle.properties android.enableAapt =上特拉维斯阳明虚假文件

android.enableAapt2=false 

gradle.properties位于我~/.gradle/gradle.properties在我的本地机器。

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

我试图在全球范围内添加它,但没有工作没有错误,但在robolectric它需要设置,如果您使用gradle:3.0.0-beta3

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) 

下面是配置文件是在特拉维斯-Cl

{ 
    "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(); 
    } 
} 

特拉维斯慈错误日志:

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) 

我认为特拉维斯-CI找不到在哪里res文件夹是布局/ recipe_item无法找到:

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

你确定你没有将'android.enableAapt'与'android.enableAapt2'混合吗?您不能禁用AAPT,您可以禁用AAPT2。 – azizbekian

+1

另外你在你的'yml'文件中写了'android.enableApat = false',它应该是'Aapt'而不是'Apat'。 – azizbekian

+0

这是我在travis-ci中的错误。这是一个错字。我相应地更新了我的问题。 – ant2009

回答

6

我认为问题是,你是在全球性禁止AAPT2文件~/.gradle/gradle.properties而不是项目属性文件/yourproject/gradle.properties

+0

这对于travis-ci非常有用,谢谢。然而,只是一个简单的问题。在我的本地项目中,android studio会使用全局〜/ .gradle/grade.properties或本地〜/ myProject/gradle.properties? – ant2009

+1

全局属性优先于本地属性,即如果在全局和项目'gradle.properties'文件中定义了具有相同名称的变量,那么全局属性将具有更高的优先级。 – azizbekian

0

这可能是,你从这个官方鸣叫复制的gradle.properties文件的名称:

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

Unfortunettely文本gradle.propertіes与cyrilic写“我':

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小字母BYELORUSSIAN-UKRAINIAN我'。

在这种情况下,文件将不会被识别和使用。