2013-10-28 16 views
12

Tôi đã vật lộn trong một thời gian với các phiên bản gradle và xây dựng.Quy ước đặt tên thư mục cho các biến thể xây dựng gradle

Tôi có những xây dựng các loại định nghĩa:

  • debug
  • phát hành

Và những hương vị:

  • miễn phí
  • trả

Làm cách nào để xác định tài nguyên và nội dung duy nhất cho một biến thể xây dựng nhất định. FreeDebug? Ví dụ: tôi muốn có bốn tên ứng dụng khác nhau tùy thuộc vào biến thể xây dựng và một biểu tượng khác nhau cho mỗi biến thể.

Trả lời

12

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 
11

Theo Gradle Sourcesets and Dependencies guide, bạn có thể thêm thư mục mới src/freeDebug/res hoặc src/paidRelease/res, v.v ... để tùy chỉnh các thuộc tính cụ thể cho từng Biến thể xây dựng.

+0

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

+2

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

+0

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

1

Cấu trúc thư mục trong khi tạo xây dựng các biến thể nên là:

app 
    | 
    ->src 
     | 
     ->buildvariantname1(as defined in gradle) 
          | 
          ->java (follow the same structure here, as in main folder) 
          ->res (follow the same structure here, as in main folder)  

Bây giờ trên chọn cụ thể biến thể, như buildVariantname1debug, các thay đổi được viết trong thư mục res trong biến thể này sẽ được chọn.

Tên ứng dụng phải được xác định trong tệp string.xml trong thư mục res-> values ​​để tên ứng dụng được tải xuống tùy thuộc vào giá trị trong xml theo từng biến thể xây dựng. Tương tự cho các biểu tượng ứng dụng.

hình ảnh đầu tiên cho thấy làm thế nào để khai xây dựng các biến thể (hương vị với tên gói khác nhau)
enter image description here

Các show hình ảnh thứ hai, làm thế nào cấu trúc dự án trông như thế nào nếu bạn muốn mỗi hương vị có một đoạn mã khác nhau, drawables và biểu hiện là tốt. Hãy ghi nhớ MainActivity sẽ bị xóa khỏi thư mục chính để nó có thể tồn tại trong mỗi build biến

enter image description here

Các vấn đề liên quan