[英]Build android with gradle, replace string each product flavor
之前我建立Android項目到兩個不同的應用程序付費和免費。
我改變了每個值和字符串,所以昨天我犯了一個大錯。
所以,我是如何使用gradle來構建我的應用程序的。
我的應用程序有一些不同。
應用名稱(只需添加后綴'-Free') - > values / string.xml
在我的* .java中更改標志
// signedConfigs是ommited。
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
}
}
但是,構建的應用程序根本沒有改變。
我錯過了什么?
請參閱有關product flavors
的文檔:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors
在build.gradle
,在每個flavor中,您可以定義要在BuildConfig.java
文件中生成的標志:
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;"
}
}
此示例使用枚舉(您需要在Java代碼中的某處定義):
public enum MonetizationType {
PAID, FREE
}
你現在可以在任何地方使用它:
if (BuildConfig.monetizationType == MonetizationType.FREE) { ... }
對於覆蓋資源,您可以在源文件夾中為每個flavor創建不同的資源文件:
使用以下結構
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將是一個字符串資源文件(就像strings.xml一樣),但只有一個字符串:根據風格你想要的不同。 (您不需要在main / res目錄中有apptitle.xml)。
<?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>
您可能能夠以不同的方式覆蓋字符串,但為了清楚起見,我希望將重寫的字符串與其余字符串分開。
接受的答案不適用於較新版本的Gradle。 您需要使用buildConfigField
替換buildConfig
以獲得相同的結果:
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"
}
}
treesAreEverywhere的答案(以及用戶名)是正確的。 但是,知道Android Studio將極大地簡化創建構建風格或屬性特定資源文件的過程也非常有價值。
在AS項目窗口中,右鍵單擊res / values文件夾,然后選擇New> Values resource file。 然后命名它(例如,“字符串”),如果不是默認值,則選擇源集,並選擇任何所需的限定符(例如,屏幕寬度= 800)。 這是確保將資源覆蓋放在編譯器需要的地方的最簡單方法。
這就是我在項目中的表現。 我創建了多種構建類型而不是flavor。 此解決方案將根據您嘗試組裝的構建類型為您的包名添加前綴。 例如,對於dev,包名稱將為com.sample.myapp.dev,類似地,beta包名稱將更改為com.sample.myapp.release。 您可以調整它以獲得免費和付費前綴。 希望它會有所幫助。
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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.