用gradle构建android,替换每个产品的字符串味道

Fla*_*_KR 17 android gradle

之前我建立Android项目到两个不同的应用程序付费和免费.

我改变了每个值和字符串所以昨天我犯了一个大错误.

所以,我是如何使用gradle来构建我的应用程序的.

我的应用程序有一些不同.

  1. 应用名称(只需添加后缀'-Free') - > values/string.xml

  2. 在我的*.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 2.14无法识别`buildConfig`函数。仅`buildConfigField`。 (2认同)

4em*_*dan 7

接受的答案不适用于较新版本的Gradle.您需要更换buildConfigbuildConfigField得到相同的结果:

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)

}