2013-07-17 29 views
19

Có cách nào để thêm thuộc tính tùy chỉnh vào productFlavor hoặc buildType trong plugin android cho gradle không? Tôi muốn có tính linh hoạt bổ sung như vậy trong cấu hình của buildVariants, để tôi có thể kiểm tra thuộc tính tùy chỉnh của mình khi chỉ định các tác vụ cho buildVariants.Plugin Android Gradle - thêm thuộc tính hương vị tùy chỉnh?

productFlavors { 
    flavorGroups "drm", "storeType" 
    googlePlay { 
     flavorGroup "storeType" 
     buildConfig "public static final String TARGET_STORE = \"google\";" 
    } 
    samsungApps { 
     flavorGroup "storeType" 
     buildConfig "public static final String TARGET_STORE = \"samsung\";" 
    } 

    platformDrm { 
     flavorGroup "drm" 
    } 

    widevineAppDrm { 
     flavorGroup "drm" 
     minSdkVersion 9 
     useWidevineAppDrmLib true 
    } 

}

vì vậy đây bạn có thể thấy tôi đã thêm thuộc tính tùy chỉnh "useWidevineAppDrmLib" để xây dựng hương vị. Nó sẽ được tốt đẹp để xem các thuộc tính như nhau trong buildVariant.mergedFlavor, vì vậy mà tôi có thể kiểm tra giá trị thuộc tính và không xây dựng nhiệm vụ bổ sung, chẳng hạn như gói thêm file .so khi thuộc tính được thiết lập là true:

android.applicationVariants.each { variant -> if(variant.mergedFlavor.useWidevineAppDrmLib) { ... // add copy .so task } }

có thể có cách để làm điều đó nhưng tôi chưa tìm ra ... kiểm tra tên biến thể xây dựng cho chuỗi con (tên hương vị) hoạt động đối với tôi, nhưng có vẻ bẩn.

Lý tưởng nhất là tôi muốn có một bản đồ thuộc tính tùy chỉnh của các loại khác nhau cho buildType và productFlavor.

Trả lời

14

Có một giải pháp thay thế không yêu cầu tạo lớp tùy chỉnh của riêng bạn. Bạn có thể sử dụng extras property đã tồn tại đã được gắn với lớp 'productFlavors'. Điều này được thiết kế đặc biệt để cho phép biến do người dùng xác định tùy chỉnh.

android { 
    // We can add any custom variable so long as it's prefaced with ext 
    productFlavors { 
    widevineAppDrm { 
     ext.useWidevineAppDrmLib = true 
    } 
    } 
} 

Sau đó, bạn có thể tham khảo sau đó như vậy. Lưu ý, nếu bạn không thêm biến tùy chỉnh vào productFlavors khác, bạn sẽ cần phải chắc chắn kiểm tra biến đầu tiên, nếu không, gradle sẽ khiếu nại về việc không tìm thấy thuộc tính.

android.applicationVariants.each { variant -> 
    if (variant.productFlavors[0].ext.has("useWidevineAppDrmLib")) { 
     if (variant.productFlavors.get(0).ext.useWidevineAppDrmLib) { 
      ... 
     } 
    } 
} 
20

Bạn có thể mở rộng đối tượng để thêm thuộc tính động. Vì vậy, bạn có thể làm điều đó trên đối tượng hương vị khi họ được thêm vào, sử dụng một cái gì đó như thế này:

// First declare a class that holds a boolean 
class BooleanExtension { 
    boolean value 
    BooleanExtension(boolean value) { 
    this.value = value 
    } 

    public void setValue(boolean value) { 
    this.value = value 
    } 

    public boolean getValue() { 
    return value 
    } 
} 

android { 
    // add the boolean extension to all flavor object when they are created. 
    productFlavors.whenObjectAdded { flavor -> 
    flavor.extensions.create("useWidevineAppDrmLib", BooleanExtension, false) 
    } 

    // then we can set the value on the extension of any flavor object 
    productFlavors { 
    widevineAppDrm { 
     useWidevineAppDrmLib.value true 
    } 
    } 
} 

Tuy nhiên điều này sẽ không có được thông qua để hương vị sáp nhập. Vì vậy, bạn phải làm

android.applicationVariants.each { variant -> 
    if (variant.productFlavors.get(0).useWidevineAppDrmLib.value) { 
    ... 
    } 
} 

Được chỉnh sửa để làm cho mã thực sự hoạt động từ phản hồi của @ blackdigger.

+0

Xav, cảm ơn rất nhiều vì đã trả lời nhanh! – blackdigger

+1

tôi cố gắng làm điều đó theo cách sau: define lớp mở rộng trên phần "android" - nếu không nó mang lại cho biên dịch lỗi: lớp BooleanExtension { giá trị Boolean BooleanExtension (giá trị Boolean) { \t this.value = giá trị } công cộng khoảng trống setValue (giá trị Boolean) { \t this.value = giá trị } công Boolean getValue() { \t trở lại giá trị }} sau đó viết: widevineAppDrm { ... useWidevineAppDrmLib.v alue true ... } .... và: nếu (variant.productFlavors.get (0) .useWidevineAppDrmLib.value) {...} – blackdigger

+1

và một điều nữa, để thêm phần mở rộng hương tôi phải làm: productFlavors.whenObjectAdded {hương vị -> flavor.extensions.create ("useWidevineAppDrmLib", BooleanExtension, false) } – blackdigger

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