Tôi đã đấu tranh với cùng một vấn đề. Lúc đầu, tôi sử dụng hai nhánh trong bộ điều khiển nguồn của mình, nhưng đó là một cái đầu khiến chúng không đồng bộ. Gradle là một hệ thống xây dựng rất linh hoạt, nhưng các quy ước mặc định không phải lúc nào cũng đủ. Đây là cách cuối cùng tôi giải quyết nó trong cơ sở mã của tôi.
tôi đã kết thúc với bản chất cấu trúc sau đây thư mục (giản thể):
+ src
+ main
| + res
| | + values
| | - strings.xml
| + java
| ...
+ debug
| + free
| | + res
| | + values
| | - strings.xml
| + paid
| + res
| + values
| - strings.xml
+ free
| + res
| | + values
| | - strings.xml
| + java
| ...
+ paid
+ res
| + values
| - strings.xml
+ java
...
Trong thư mục chính tôi giữ tất cả mọi thứ đó là chung cho cả hai hương vị. Trong thư mục miễn phí, tôi giữ mọi thứ duy nhất cho phiên bản miễn phí (tương tự cho thanh toán). Các tệp trong thư mục hương vị sẽ được phủ lên trên chính.
Quy tắc lớp phủ mặc định sẽ xử lý các hương vị sản phẩm "miễn phí" và "trả tiền" bằng cách sử dụng các thư mục trong "src" có cùng tên. Vấn đề đối với tôi bắt đầu với lớp phủ của các loại xây dựng.
Nếu tôi tạo một thư mục gỡ lỗi có cùng cấu trúc với các thư mục vị trí, nó sẽ được phủ lên trên cùng của thư mục hương vị hiện đang được sử dụng. Điều đó dẫn đến cùng một tên gỡ lỗi cho cả hai sở thích, nhưng tôi muốn các tên gỡ lỗi khác nhau tùy thuộc vào hương vị. Sau khi một số nghiên cứu tôi đã đưa ra các sửa đổi sau đây để xây dựng tập tin của tôi.
...
android {
buildTypes {
debug {
...
}
release {
...
}
}
productFlavors {
free {}
paid {}
}
}
android.applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
...
}
else if (variant.buildType.name == "debug") {
switch (variant.name) {
case "FreeDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/free")
}
break;
case "PaidDebug":
variant.mergeResources.doFirst {
android.sourceSets.debug.setRoot("src/debug/paid")
}
break;
}
}
}
...
Bây giờ xây dựng biến thể sẽ được xây dựng bằng cách đầu tiên bao phủ các thư mục sau:
PaidRelease -> /src/main + /src/paid
PaidDebug -> /src/main + /src/paid + /src/debug/paid
FreeRelease -> /src/main + /src/free
FreeDebug -> /src/main + /src/free + /src/debug/free
Và nếu bạn chỉ muốn thay đổi một biểu tượng và không lặp lại trong các cây tài nguyên toàn bộ? – powder366
src/main/res áp dụng cho tất cả các bản dựng nên bạn chỉ cần thêm tài nguyên khác nhau giữa các biến thể xây dựng cho các thư mục biến thể xây dựng cụ thể – ianhanniballake
Ok cảm ơn! Nhưng khi tôi chuyển đổi một dự án từ Eclipse sang Studio, tôi đã không nhận được một src/main/java chẳng hạn, chỉ src như bình thường. Và ví dụ cho sourceSets, tôi phải có một chính (như nó mặc định tôi đoán). Không chắc chắn cách xử lý này ... – powder366