之前我建立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
}
}
Run Code Online (Sandbox Code Playgroud)
但是,构建的应用程序根本没有改变.
我错过了什么?
tre*_*ere 52
请参阅以下文档product flavors
:
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors
在您build.gradle
的每种风格中,您可以定义要在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;"
}
}
Run Code Online (Sandbox Code Playgroud)
此示例使用枚举(您需要在Java代码中的某处定义):
public enum MonetizationType {
PAID, FREE
}
Run Code Online (Sandbox Code Playgroud)
你现在可以在任何地方使用它:
if (BuildConfig.monetizationType == MonetizationType.FREE) { ... }
Run Code Online (Sandbox Code Playgroud)
对于覆盖资源,您可以在源文件夹中为每个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
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
您可能能够以不同的方式覆盖字符串,但为了清楚起见,我希望将重写的字符串与其余字符串分开.
接受的答案不适用于较新版本的Gradle.您需要更换buildConfig
与buildConfigField
得到相同的结果:
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"
}
Run Code Online (Sandbox Code Playgroud)
}
归档时间: |
|
查看次数: |
15587 次 |
最近记录: |