使用 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,替换每个产品风味的字符串 的相关文章

  • 使用 google Directions API 的地图视图绘制方向 - 解码折线

    我正在尝试使用 Google 方向 API 在我的地图视图上显示方向 但我在从 JSON 响应获取数据时遇到困难 我可以获得 级别 和 点 字符串 但无法弄清楚如何将它们解码为地图上的点 任何帮助将非常感激 我有一个类可以为您解码它们 添加
  • 自定义选择器活动:SecurityException UID n 无权 content:// uri

    我正在构建一个选择器应用程序来替换本机 Android 共享对话框 它工作正常 除非我尝试通过长按图像 gt 共享图像从 Chrome 共享图像 我发现 Google 没有捕获异常 它崩溃了 所以我可以通过 Logcat 查看它 在 Goo
  • 带有一、二和三个按钮的 Android 警报对话框

    我不经常发出警报 但每次发出警报时 我都会花一些时间来阅读文档 https developer android com guide topics ui dialogs html并弄清楚如何去做 由于我现在不得不这样做几次 所以我将在下面写一
  • Android 如何更改 OnTouchListener 上的按钮背景

    你好 我在 xml 中有一个按钮 我正在使用OnTouchListener在我的活动中获得button按下并释放 但问题是 当我按下按钮时背景颜色没有改变 当我延长可能的活动时OnClickListener背景正在改变 任何人都可以告诉我的
  • ffmpeg视频已压缩但无法在浏览器中播放

    我已经集成了ffmpeg4android lib 视频压缩工作正常 但视频无法在除 safari 浏览器之外的浏览器中播放 上传到服务器后 我使用了以下命令 ffmpeg y i
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 调试:在 Android 1.0 中找不到文件

    今天我更新到 Android Studio v 1 0 在尝试编译任何项目时出现以下错误 app build intermediates classes debug 找不到文件 问题是在更新之前我没有任何问题 这是我实际尝试编译的代码 构建
  • Android 自定义布局 - onDraw() 永远不会被调用

    public class MainActivity extends Activity Override public void onCreate Bundle savedInstanceState super onCreate savedI
  • 使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

    我可以测试 Retrofit2beta4 的真实响应吗 我需要 Mockito 或 Robolectic 吗 我的项目中没有活动 它将是一个库 我需要测试服务器是否正确响应 现在我有这样的代码并卡住了 Mock ApiManager api
  • Java 文件上传速度非常慢

    我构建了一个小型服务 它从 Android 设备接收图像并将其保存到 Amazon S3 存储桶中 代码非常简单 但是速度非常慢 事情是这样的 public synchronized static Response postCommentP
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • 使用 SQLITE 按最近的纬度和经度坐标排序

    我必须获得一个 SQLite SQL 语句 以便在给定初始位置的情况下按最近的纬度和经度坐标进行排序 这是我在 sqlite 数据库中的表的例句 SELECT id name lat lng FROM items EXAMPLE RESUL
  • 在 Android 中调整可绘制对象的大小

    我正在为进度对话框设置一个可绘制对象 pbarDialog 但我的问题是我想每次调整可绘制的大小 但不知道如何调整 这是一些代码 Handler progressHandler new Handler public void handleM
  • Android 后台服务示例,具有交互式调用方法

    我不是 Android 方面的专家 我正在寻找一个 Android 应用程序的示例 该应用程序使用一个服务 其中有真正的功能方法 或者换句话说 一个服务可以用来做什么 我们什么时候需要它 超越简单的东西服务举例 我确信您渴望获得一些工作代码
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • Android:RecyclerView 不显示片段中的列表项

    有人可以帮我尝试让我的 RecyclerView 出现吗 如果我不在片段中实现它 就会出现这种情况 然而 当我尝试将其实现到片段中时 CarFront 中的其他 XML 代码与 RecyclerView 分开显示 我的日志中收到此错误 E
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 在 KitKat 4.4.2 中获取 SDard 路径和大小

    我在 Google Play 上有一个设备信息应用程序 在该应用程序中我有存储信息 我知道 Android 4 4 在访问外部 SD 卡方面发生了一些变化 内部似乎没有给我带来问题 我的问题是 如何可靠地获取 KitKat 上 SD 卡的大
  • 如何在基本活动中使用 ViewBinding 的抽象?

    我正在创建一个基类 以便子级的所有绑定都将设置在基类中 我已经做到了这一点 abstract class BaseActivity2 b AppCompatActivity private var viewBinding B null pr
  • 获取其他指针的MotionEvent.getRawX/getRawY

    我可以获取其他指针的MotionEvent getRawX getRawY 值吗 MotionEvent getRawX API 参考 http developer android com reference android view Mo

随机推荐

  • 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