10

Trong gradle.properties của android của tôi, tôi đã điều sau đây:Configure gradle.properties android.enableAapt = false vào travis yml nộp

android.enableAapt2=false 

My gradle.properties tọa lạc tại ~/.gradle/gradle.properties của tôi trong máy tính cục bộ của tôi.

Tôi tự hỏi làm thế nào tôi có thể thêm android.enableAapt=false vào tệp yml của tôi.

Tôi đã cố thêm nó dưới dạng toàn cục nhưng không hoạt động nhưng không có lỗi nhưng trong robolectric, bạn cần phải đặt nếu bạn đang sử dụng 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) 

Dưới đây là file cấu hình đó là trên 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" 
} 

Class dưới kiểm tra:

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

Các lỗi travis-ci nhật ký:

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) 

Tôi nghĩ rằng travis-ci không thể tìm thấy nơi res thư mục là như bố trí/recipe_item không thể được tìm thấy:

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

Bạn có chắc chắn không trộn 'android.enableAapt' với' android.enableAapt2'? Bạn không thể tắt AAPT, bạn có thể tắt AAPT2. – azizbekian

+1

Ngoài ra bạn đã viết 'android.enableApat = false' trong tệp' yml' của bạn, nó phải là 'Aapt' thay vì' Apat'. – azizbekian

+0

Đó là sai lầm của tôi trong travis-ci. Đó là một lỗi đánh máy. Tôi đã cập nhật câu hỏi của mình cho phù hợp. – ant2009

Trả lời

6

Tôi nghĩ vấn đề là bạn đang vô hiệu hóa AAPT2 trong tính toàn cầu tập tin ~/.gradle/gradle.properties thay vì thuộc tính dự án tập tin /yourproject/gradle.properties.

+0

Điều đó làm việc cho travis-ci, cảm ơn. Tuy nhiên, chỉ là một câu hỏi nhanh. Trong dự án cục bộ của tôi, studio android sẽ sử dụng toàn cục ~/.gradle/grade.properties hoặc địa phương ~/myProject/gradle.properties? – ant2009

+1

Thuộc tính toàn cầu được ưu tiên hơn các thuộc tính cục bộ, tức là nếu bạn xác định biến có cùng tên trong tệp 'gradle.properties' toàn cầu và dự án, so với thuộc tính toàn cục sẽ có mức độ ưu tiên cao hơn. – azizbekian

0

Nó có thể là, rằng bạn đã sao chép tên của tập tin gradle.properties từ chính thức tweet này:

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

Unfortunettely văn bản gradle.propertіes được viết với cyrilic 'i ':

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

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

0xd196 nằm trong UTF8 'CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I'.

Trong trường hợp này, tệp sẽ không được nhận dạng và sử dụng.