2014-10-24 16 views
21

Tôi có và ứng dụng android cũ mà tôi đang cố gắng di chuyển sang hệ thống xây dựng gradle android. Ứng dụng hiện được xây dựng trong một thiết lập nhiều dự án và được xuất bản dưới dạng bốn ứng dụng khác nhau (hai tập dữ liệu khác nhau được bao gồm và các phiên bản miễn phí/trả phí cho cả hai tập dữ liệu). Tôi đã xoay sở để thoát khỏi thiết lập đa dự án bằng cách sử dụng flavorDimensions (trước đây được gọi là flavorGroups), nhưng tôi không thể tìm ra cách để thiết lập một applicationId khác nhau cho mỗi kết hợp hương vị.Cách đặt applicationId khác nhau cho mỗi kết hợp hương vị bằng cách sử dụng flavorDimensions?

Vì phiên bản ứng dụng đã được xuất bản, tôi cần giữ cùng một ứng dụng như hiện tại. Vì cách đặt tên gói ban đầu của tôi đã được thực hiện, tôi không thể chỉ sử dụng kết hợp hương vị-buildtype với "packageNameSuffix" (đây sẽ là một lựa chọn tuyệt vời nếu nó là một ứng dụng chưa được xuất bản).

https://stackoverflow.com/a/20956353/4177090 đang trả lời cách sử dụng các thư mục nguồn khác nhau cho kết hợp hương vị chứ không phải cách (nếu có thể) để đặt cấu hình cụ thể cho từng kết hợp trong tệp xây dựng.

Gradle xây dựng đoạn file:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { flavorDimension "price" } 
    paid { flavorDimension "price" } 
    dataset1 { flavorDimension "dataset" } 
    dataset2 { flavorDimension "dataset" } 
} 

Tôi muốn có một cái gì đó như sau trong gradle xây dựng tập tin của tôi (chú ý cách unlogic đặt tên của tôi là, đó là lý do tôi không thể sử dụng packageNameSuffix):

freeDataset1 { applicationId "com.beansys.freeappdataset1" } 
freeDataset2 { applicationId "com.beansys.freedataset2" } 
paidDataset1 { applicationId "com.beansys.dataset1paid" } 
paidDataset2 { applicationId "com.beansys.mypaiddataset2" } 
+0

Tại sao bạn không chỉ mương kích thước và tạo hương vị riêng biệt? – Simas

+0

Cảm ơn bạn đã đề xuất. Tôi có thể làm điều đó, nhưng trong trường hợp đó tôi sẽ phải sao chép các thư mục nguồn hương vị, tức là dữ liệu dataset1 sẽ được sao chép vào cả thư mục freeDataset1 và thư mục paidDataset1. Nếu sao chép mã và dữ liệu là lựa chọn duy nhất của tôi, tôi muốn đi "trở lại" để sử dụng một giải pháp đa dự án (không phải rất sạch sẽ, nhưng ít nhất là tốt hơn so với nhân bản nội dung thư mục nguồn của tôi). – Fredrik

+0

Tại sao bạn liên kết câu trả lời gợi ý nhiều thư mục? – Simas

Trả lời

6

Cuối cùng tôi đã giải quyết được vấn đề này. Tôi nghĩ rằng giải pháp này là thanh lịch (mặc dù mã thực tế có thể được viết rất hay bởi một người có kiến ​​thức groovy).

Giải pháp cho việc thiết lập một applicationId cụ thể cho từng hương vị kết hợp:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { flavorDimension "price" } 
    paid { flavorDimension "price" } 
    dataset1 { flavorDimension "dataset" } 
    dataset2 { flavorDimension "dataset" } 
} 

android.variantFilter { variant -> 
    def flavorString = "" 
    def flavors = variant.getFlavors() 
    for (int i = 0; i < flavors.size(); i++) { 
     flavorString += flavors[i].name; 
    } 
    if(flavorString.equalsIgnoreCase("freeDataset1")) { 
     variant.getDefaultConfig().applicationId "com.beansys.freeappdataset1" 
    } 
    if(flavorString.equalsIgnoreCase("freeDataset2")) { 
     variant.getDefaultConfig().applicationId "com.beansys.freedataset2" 
    } 
    if(flavorString.equalsIgnoreCase("paidDataset1")) { 
     variant.getDefaultConfig().applicationId "com.beansys.dataset1paid" 
    } 
    if(flavorString.equalsIgnoreCase("paidDataset2")) { 
     variant.getDefaultConfig().applicationId "com.beansys.mypaiddataset2" 
    } 
} 
19

Giải pháp bởi Fredrik đề xuất ngừng làm việc sau khi nâng cấp Android Studio để 1.0.2 (và plugin gradle đến 1.0.0) vì vậy tôi đã phải thêm các thay đổi sau, hiện tại như của plugin gradle 1.3.1:

flavorDimensions "price", "dataset" 

productFlavors { 
    free { dimension "price" } 
    paid { dimension "price" } 
    dataset1 { dimension "dataset" } 
    dataset2 { dimension "dataset" } 
} 

android.applicationVariants.all { variant -> 
    def mergedFlavor = variant.mergedFlavor 
    switch (variant.flavorName) { 
     case "freeDataset1": 
      mergedFlavor.setApplicationId("com.beansys.freeappdataset1") 
      break 
     case "freeDataset2": 
      mergedFlavor.setApplicationId("com.beansys.freedataset2") 
      break 
     case "paidDataset1": 
      mergedFlavor.setApplicationId("com.beansys.dataset1paid") 
      break 
     case "paidDataset2": 
      mergedFlavor.setApplicationId("com.beansys.mypaiddataset2") 
      break 
    } 
} 
Các vấn đề liên quan