2016-05-25 18 views
14

Tôi có một câu hỏi rất ngu ngốc, nhưng tôi đang ngồi ở đây trước ứng dụng của mình từ nhiều giờ nhưng tôi không thể hiểu vấn đề là gì.Hương vị sản phẩm: Lớp trùng lặp được tìm thấy

Tôi có một ứng dụng android (viết bằng Kotlin) và tôi muốn làm cho hai hương vị sản phẩm và ghi đè lên một lớp/tập tin trong hương vị sản phẩm:

Vì vậy, kịch bản gradle của tôi là:

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 


android { 
    ... 
    productFlavors { 
    foo { 
     applicationId "com.foo" 
    } 
    } 
} 

My files được cấu trúc như sau:

- src 
    - androidTest 
    - foo 
     - java 
     - com 
      - example 
      - Bar.kt 
    - main 
     - java 
     - com 
      - example 
      - Bar.kt 
    - test 

vì vậy, về cơ bản tôi muốn ghi đè lên tập tin trong Bar.ktfoo hương vị sản phẩm, nhưng bằng cách nào đó nó không hoạt động: Nó cho biết lớp Bar bị trùng lặp.

Bất kỳ gợi ý nào?

+2

nên không nguồn hương vị đặc trưng chỉ tồn tại trong falvors bạn đã xác định (ví dụ:không phải trong chính)? Vì vậy, bạn muốn xác định ít nhất hai hương vị, và chỉ có Bar.kt trong bộ nguồn cho những hương vị đó. – Michael

+0

Hm, có thể bạn đúng ... thực sự tôi đang cố gắng ghi đè lên một mô-đun dagger ... vì vậy 'Bar.kt' thực sự là một mô-đun Dagger 2 – sockeqwe

+0

Có thể trùng lặp của [Android gradle buildTypes: Duplicate class] (http://stackoverflow.com/questions/18782368/android-gradle-buildtypes-duplicate-class) – miensol

Trả lời

25

The documentation for variants bang (tôi nhấn mạnh):

Lưu ý: Đối với một xây dựng biến thể nhất định, Gradle ném một lỗi build nếu nó gặp hai hoặc nhiều thư mục nguồn thiết rằng đã xác định cùng lớp Java. Ví dụ: khi tạo APK gỡ lỗi, bạn không thể xác định cả src/debug/Utility.java và src/main/Utility.java. Đây là vì Gradle xem cả hai thư mục này trong quá trình xây dựng và ném lỗi 'lớp trùng lặp'. Nếu bạn muốn các phiên bản khác nhau của Utility.java cho các loại bản dựng khác nhau, bạn có thể có mỗi loại xây dựng xác định phiên bản riêng của tệp và không bao gồm nó trong nguồn chính/nguồn.

Vì vậy, giải pháp là có phiên bản riêng là Bar.kt cho mỗi biến thể và loại trừ khỏi tập hợp nguồn chính.

+3

Nếu tôi nói 4-5 mùi vị, và 3 trong số họ sử dụng cùng một lớp và mã sử dụng cụ thể, tôi có cần phải sao chép nó không ở khắp mọi nơi hoặc sourceSets có thể làm điều đó? Không thể làm với bộ nguồn –

+1

@AkhilDad Tôi đoán bạn có thể tạo một mô-đun riêng để chia sẻ mã qua các hương vị. – miensol

7

Như đã nêu bởi miensol, bạn không thể đặt tệp của mình vào main và hương vị thư mục cụ thể và mong muốn gradle hoạt động theo cách tương tự như hệ thống tài nguyên android hoạt động. Nhưng tôi đã tìm ra cách để thực hiện điều này mà không cần sao chép mã, do đó bạn không phải sao chép Bar.kt vào mọi thư mục hương vị mà bạn có.

Vì vậy, giả sử bạn có ba hương vị dev, prodgiả. Bạn muốn chế nhạo đặc biệt của mình Bar.kt trong giả nhưng việc triển khai bình thường trong devsản phẩm hương vị. Bạn đặt tệp đã được tạo của mình vào mock thư mục hương vị cụ thể mock/java/com/something/ và bạn đặt triển khai "mặc định" vào thư mục mới với một số tên ngẫu nhiên như non-mock/java/com/something/ đặt tên cho nó là "phổ biến" cũng có ý nghĩa. Bây giờ bạn phải nói với gradle nơi những hương vị nên tìm kiếm của họ Bar.kt lớp học.

Đặt này trong để build.gradle của bạn:

android { 
    ... 
    sourceSets { 
     prod { 
      java.srcDirs('src/non-mock/java') 
     } 
     dev { 
      java.srcDirs('src/non-mock/java') 
     } 
    } 

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