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

2023-12-22

在我将 Android 项目构建为两个不同的付费和免费应用程序之前。

我更改了每个值和字符串,所以昨天我犯了一个大错误。

所以,我正在学习如何使用 gradle 来构建我的应用程序。

我的应用程序有一些差异。

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

  2. 更改我的 *.java 中的标志

// 签名配置被省略。

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 http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Product-flavors

In your build.gradle,在每种风格中,您可以定义要在您的BuildConfig.java file:

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) { ... } 

对于覆盖资源,您可以在源文件夹中为每种风格创建不同的资源文件:

使用以下结构

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>

您也许能够以不同的方式覆盖字符串,但为了清楚起见,我喜欢将覆盖的字符串与其余字符串分开。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 gradle 构建 android,替换每个产品风味的字符串 的相关文章

随机推荐

  • Vue - 您可能需要一个额外的加载器来处理这些加载器的结果

    我使用 Vue 和 babel 我有一个导出的函数 file a js export async function get 我需要将此导出函数连接到 MyClass 的静态方法 file b js import myInterface fr
  • 在 Java 中使用各种日历时区(不使用 Joda Time)

    我正在寻找一种根据用户输入获取各个时区的当前时间的方法 我知道我可以使用乔达时间 http joda time sf net 但这是唯一的方法吗 Java 中没有一个选项可以做到这一点吗 我尝试了以下代码 它为所有 3 个系统输出提供了相同
  • 如何使用 matlab 从图像中去除纹理?

    如何使用傅立叶变换找出导致表面纹理的频率分量 然后我必须把它们去掉 以获得没有纹理的光滑表面 This http www flickr com photos 63036721 N02 5733958932 in photostream是图像
  • 如何处理原始Python套接字中的ssl连接?

    我正在编写一个程序来下载给定的网页 由于某些限制 我只需要使用原始 python 套接字来进行所有连接 因此 我与给定域 对象的响应标头中的 Host 字段 建立套接字连接 然后发送 GET 请求 现在 当 url 是 https url
  • 如何将文本附加到 jenkinsfile 中的文件

    如何将文本追加到文件中Jenkinsfile注入詹金斯BUILD ID 我希望看到 version 1 0 25 其中 25 是BUILD ID 这是我的尝试 import hudson EnvVars node stage version
  • Kubernetes 服务和集群与 Google Compute Engine 对象之间有什么关系?

    我正在设置几个在 Google Container Engine 上运行的服务 流量通过 Google HTTP 负载均衡器使用路径映射传入 有一个关于设置基于内容的负载平衡的很好的谷歌教程here https cloud google c
  • 时间序列数据和 LSTM 中分类的实体嵌入

    我正在尝试解决时间序列问题 简而言之 对于每个客户和材料 SKU代码 我过去都下了不同的订单 我需要建立一个模型来预测每个客户和材料下一次订单之前的天数 我想做的是在 Keras 中构建一个 LSTM 模型 其中对于每个客户和材料 我有 5
  • 输入一天中的时间或持续时间的最直观、最可用的方法是什么?

    我正在 Silverlight 中构建业务线应用程序 需要让用户编辑两个 NET TimeSpan 值 一个是一天中的某个时间 相对于午夜 另一个是持续时间 目前我正在使用两个文本框 格式为 hh mm 这非常简单 但绝对可以改进 我观察到
  • 如何在android中的文件中追加数据

    谁能告诉我如何将数据附加到 Android 中已有数据的文件中 我写了一些代码 但它不起作用 这是我的活动 package updatefile developer com updatefiledemo import android sup
  • android 上的 saxParser 有错误(格式不正确(无效令牌))

    我正在尝试从 url link 获取 xml 文件 此代码适用于安卓 我正在使用 SAXParser 来完成此操作 但我有错误 org apache harmony xml ExpatParser ParseException At lin
  • C# Windows 服务 - 安装时的默认参数

    我的应用程序 这是一项 Windows 服务 需要一个命令行参数 它是配置文件的位置 我希望该服务能够自动启动 填写 启动参数 值仅适用于手动启动它 并且该值在服务停止后不会保留 我尝试在注册表中手动编辑 可执行文件的路径 但 net 服务
  • 为什么 `(['1','2','3']).map(parseInt)` 无法得到正确的结果?

    1 2 3 map n gt parseInt n 将返回预期结果 1 2 3 But 1 2 3 map parseInt returns 1 NaN NaN 哪里错了 As Array map https developer mozil
  • 从 C++ 中的另一个程序重定向标准输出

    我正在编写单元测试 因此无法更改我正在测试的文件中的代码 我正在测试的代码在 cout 中有消息 我试图将其重定向到文件中以检查以确保程序输出正确的消息 有谁有办法在另一个程序中重定向标准输出而不会导致延迟 我尝试过 freopen 这导致
  • 从 C++ 调用 Java:如何捕获/检测致命 JVM 错误?

    我正在开发一个 C 程序 Win32 MS Visual Studio 2008 它通过 JNI 创建一个 Java VM 如下所示here http docs oracle com javase 6 docs technotes guid
  • Android Listview项目10秒后自动更改?

    我有两个数组列表 一个是出发列表 一个是到达列表我想显示此列表 或者表示 10 秒后列表会自动更改 前 10 秒出发列表和后 10 秒到达列表 我将把我的代码放在这里我将尝试使用可运行的但我的应用程序在运行此代码时挂起 主页活动 java
  • 将数据从子窗口传递到主窗口 TextBlock

    在这个例子中 MainWindow有一个打开的按钮Window2 Window2有一个按钮写着 Hello World 到MainWindow文本块 项目来源 https www dropbox com s jegeguhycs1mewu
  • C++ 中的 substr() 方法

    我正在尝试将一些表达式子串为单个标记 例如 等 我遇到的问题是 当我尝试使用下面的 cout 行创建 S B H S J R P 的子字符串时 我得到 S J R P 而我认为应该是 S J R 它要么超出了我所见过的范围 要么就是太简单了
  • ASP.NET MVC 中的面向方面编程

    我目前正在 ASP NET 中开发 MVC 应用程序 我正在尝试分离关注点 以便最终得到更干净 更易于维护的代码 因此 作为一个起点 我正在考虑日志记录方面 我的想法是 最初 记录每个控制器中每个方法的调用和返回 我会将这个逻辑放在一个单独
  • 改造 POST 请求 response.isSuccessful() 返回 false

    我正在努力使POST使用 Retrofit2 请求 但我现在的处境是response isSuccessful 返回 false 我不知道如何调试它 我检查了后端的日志 没有错误 什么也没有 我确保请求的 URL 正确 所有参数也正确 我做
  • 使用 gradle 构建 android,替换每个产品风味的字符串

    在我将 Android 项目构建为两个不同的付费和免费应用程序之前 我更改了每个值和字符串 所以昨天我犯了一个大错误 所以 我正在学习如何使用 gradle 来构建我的应用程序 我的应用程序有一些差异 应用程序名称 只需添加后缀 Free