2013-10-10 22 views
17

Trước khi tôi tạo dự án android cho hai ứng dụng khác nhau được thanh toán và miễn phí.Xây dựng android với gradle, thay thế chuỗi mỗi hương vị sản phẩm

Tôi đã thay đổi từng giá trị và chuỗi vì vậy hôm qua tôi đã phạm một sai lầm lớn.

Vì vậy, tôi đang sáng suốt cách sử dụng gradle để xây dựng ứng dụng của mình.

Ứng dụng của tôi có một số điểm khác biệt.

  1. tên ứng dụng (chỉ cần thêm hậu tố '-Miễn phí') -> giá trị/string.xml

  2. thay đổi cờ trong * .java tôi

// signingConfigs được Bỏ qua phần.

productFlavors{ 
    free{ 
     packageName "my.app.free" 
     versionCode 20 
     signingConfig signingConfigs.freeConfing 

     copy{ 
      from('/res'){ 
       include '**/*.xml' 
      } 
      into 'build/res/' 

      filter{ 
       String line -> line.replaceAll("android:label=\"@string/app_name\"", "android:label=\"@string/app_name_free\"") 
      } 
     } 
     copy{ 
      from('/src'){ 
       include '**/*.java' 
      } 
      into 'build/src/' 

      filter{ 
       String line -> line.replaceAll("public static final Boolean IS_FULL_VER = true;", "public static final Boolean IS_FULL_VER = false;") 
      } 
     } 
    } 
    paid{ 
     packageName "my.app.paid" 
     versionCode 20 
     signingConfig signingConfigs.paidConfing 
    } 
} 

nhưng, ứng dụng được xây dựng không thay đổi gì cả.

Những gì tôi đã bỏ lỡ?

Trả lời

52

Xem tài liệu trên product flavors:

http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors

Trong build.gradle của bạn, trong từng hương vị, bạn có thể xác định cờ được tạo ra trong BuildConfig.java tập tin của bạn:

productFlavors { 
    free { 
     packageName "com.company.appfree" 
     buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.FREE;" 
    } 

    paid { 
     packageName "com.company.apppaid" 
     buildConfig "public final static com.company.common.MonetizationType monetizationType = com.company.common.MonetizationType.PAID;" 
    } 
} 

Ví dụ này sử dụng một enum (mà bạn cần phải xác định một nơi nào đó trong mã java của bạn):

public enum MonetizationType { 
    PAID, FREE 
} 

Bây giờ bạn có thể sử dụng bất cứ nơi nào như thế này:

if (BuildConfig.monetizationType == MonetizationType.FREE) { ... } 

Đối với trọng tài, bạn có thể tạo các file tài nguyên khác nhau trong các thư mục nguồn cho mỗi hương vị:

Sử dụng cấu trúc sau đây

app/build.gradle 
app/ [.. some other files...] 
app/src/main/ 
app/src/main/java 
app/src/main/res 
app/src/main/assets 
app/src/main/AndroidManifest.xml 


app/src/free/res/values/apptitle.xml 
app/src/paid/res/values/apptitle.xml 

apptitle.xml sẽ là tệp tài nguyên chuỗi (giống như strings.xml), nhưng với o nly một chuỗi: chuỗi bạn muốn khác nhau tùy thuộc vào hương vị. (Bạn không cần có apptitle.xml trong thư mục chính/res của bạn).

<?xml version="1.0" encoding="utf-8"?> 
<resources xmlns:tools="http://schemas.android.com/tools"> 
    <string name="app_title">App Title (or whatever you want)</string> 
</resources> 

Bạn có thể ghi đè các chuỗi theo nhiều cách khác nhau, nhưng tôi muốn giữ các chuỗi ghi đè riêng biệt với phần còn lại để làm rõ.

+0

Cảm ơn! Bây giờ tôi có thể xây dựng với loại kiếm tiền khác nhau. Nhưng tôi không thể thay đổi tên ứng dụng của mình. Cấu trúc dự án của tôi không giống nhau. Trong dự án của tôi, **/src/my/app/**/*. Java, /res/values/string.xml**. Đó có phải là cấu trúc dự án maven không? Tôi có thể phải thay đổi cấu trúc dự án không? –

+0

Cấu trúc dự án của tôi là cấu trúc dự án Android Studio/Gradle mới. Xem tài liệu http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors. Nó sẽ giải thích mọi thứ. Có, bạn có thể phải thay đổi các thư mục của bạn, nhưng nó thực sự không phải là khó khăn để làm điều đó. Tạo một dự án mẫu mới cho studio android và xem tệp build.gradle đó và cách các thư mục được thiết lập. Sau đó thay đổi dự án của bạn để phản ánh cấu trúc đó. – treesAreEverywhere

+0

Tôi làm cách nào để tham chiếu app_title trong AndroidManifest.xml? Tôi đã thử @ apptitle/app_title nhưng không thể giải quyết được. – dannyroa

1

treesCâu trả lời của mọi nơi (cũng như tên người dùng) đều đúng. Nhưng cũng rất có giá trị khi biết rằng Android Studio sẽ đơn giản hóa quá trình tạo ra hương vị xây dựng hoặc các tệp tài nguyên thuộc tính cụ thể.

Trong cửa sổ dự án AS, nhấp chuột phải vào thư mục res/values ​​và chọn New> Values ​​resource file. Sau đó đặt tên cho nó (ví dụ: "chuỗi"), chọn Tập hợp nguồn nếu không phải là mặc định và chọn bất kỳ vòng loại mong muốn nào (ví dụ:, Chiều rộng màn hình = 800). Đây là cách dễ nhất để đảm bảo bạn đang ghi đè tài nguyên của mình nơi trình biên dịch muốn chúng.

0

Đây là cách tôi đã làm trong dự án của mình. Tôi đã tạo nhiều loại bản dựng thay vì hương vị. Giải pháp này sẽ thêm tiền tố vào tên gói của bạn dựa trên loại xây dựng bạn đang cố gắng lắp ráp. Ví dụ, đối với dev tên gói sẽ là com.sample.myapp.dev và tương tự cho tên gói beta sẽ được đổi thành com.sample.myapp.release. Bạn có thể tinh chỉnh nó để nhận tiền tố miễn phí và trả tiền. Hy vọng nó sẽ giúp.

buildTypes { 
    release { 
     minifyEnabled false 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     signingConfig signingConfigs.production 
     applicationIdSuffix '.release' 
     versionNameSuffix '-RELEASE' 
    } 

    dev { 
     signingConfig signingConfigs.debug 
     applicationIdSuffix '.dev' 
     versionNameSuffix '-DEV' 
    } 

    beta { 
     signingConfig signingConfigs.debug 
     applicationIdSuffix '.beta' 
     versionNameSuffix '-BETA' 
    } 

    debug { 
     signingConfig signingConfigs.debug 
     applicationIdSuffix '.debug' 
     versionNameSuffix '-DEBUG' 
     debuggable true 
    } 
} 
4

Câu trả lời được chấp nhận không hoạt động với các phiên bản mới hơn của Gradle. Bạn cần phải thay buildConfig với buildConfigField để có được kết quả tương tự:

productFlavors { 
free { 
    packageName "com.company.appfree" 
    buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.FREE" 
} 

paid { 
    packageName "com.company.apppaid" 
    buildConfigField "com.company.common.MonetizationType", "MONETIZATION_TYPE", "company.common.MonetizationType.PAID" 
} 

}

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