android - 使用多个模板/风格构建单个 Apk

标签 android android-layout gradle android-gradle-plugin android-productflavors

是否可以构建具有超过 1 种产品 flavor 的 apk?

例如: 我有一个具有 3 种风格的项目(App1 - App2 - App3)。
每个app都有自己的applicationId等配置。

现在我想构建不同的模板(不同的 XML 布局),并且用户应该能够从应用程序内部从布局切换到另一个布局。

我的问题是 res 文件夹会很大并且很难维护,所以我试图找到一种方法来分离不同的布局并尽可能保持干净。

如果有可能这样做,那么我该如何 Intent 或重新启动应用程序以构建其他版本?

我想到的另一件事是在主资源中构建所有 XML 文件并选择不同的限定符,就像我们在创建不同的屏幕尺寸(sm - larg - 等)时所做的那样,但无论如何我找不到添加自定义限定符.

我的 Gradle 代码是这样的:

flavorDimensions "default"

    productFlavors {

        demo {
            applicationId "test.demo"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.demo.fileprovider"
            resValue "string", "bc", "com.demo"
            resValue "string", "bc_e", "extra_data.com.demo"
            resValue "string", "default_hostname", "demo.test.com"
            resValue "string", "default_username", "demo"
            resValue "string", "default_password", "demo"
        }
         AppOne {
            applicationId "test.AppOne"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.AppOne.fileprovider"
            resValue "string", "bc", "com.AppOne"
            resValue "string", "bc_e", "extra_data.com.AppOne "
            resValue "string", "default_hostname", "AppOne.test.com"
            resValue "string", "default_username", "AppOne"
            resValue "string", "default_password", "AppOne"
        }
          AppTwo {
            applicationId "test.AppTwo"
            versionCode 2
            versionName "1.1.2"
            resValue "string", "backage_name_file", "test.AppTwo.fileprovider"
            resValue "string", "bc", "com.AppTwo"
            resValue "string", "bc_e", "extra_data.com.AppTwo"
            resValue "string", "default_hostname", "demoAppTwotest.com"
            resValue "string", "default_username", "AppTwo"
            resValue "string", "default_password", "AppTwo"
        }
}

最佳答案

您无法构建具有多种风格的 APK,就像您无法在调试和发布 buildTypes 中构建一个 APK 一样。所选风格的配置/资源被提取到实际的 APK 元数据/ list 中,因此无法在运行时修改。

您需要将所有内容包含在 res 文件夹中,但有几种方法可能有助于简化管理。我会推荐前 3 个选项,如果您有大量具有不同行为的代码 + 布局文件,我会推荐第 4 个:

  1. Use Fragments以避免需要复制您的大部分 Java/Kotlin 代码。
  2. Include XML layouts而不是每次都重新定义一切以重用公共(public)元素。
  3. 仔细命名您的文件,例如 template1_backgroundtemplate2_background
  4. Use multiple modules ,每个"template"一个。然后,您将拥有多个合理的 res 文件夹。

我明白为什么 flavor 看起来像是解决方案,但由于您需要在一个应用程序中使用所有 flavors,因此很遗憾,这种方法行不通。您可能会发现第 2 步将删除几乎所有重复文件,从而完全避免该问题!

关于android - 使用多个模板/风格构建单个 Apk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56012816/

相关文章:

Android O HIDL 不可用

Android repo init - 如何以非交互方式运行(或没有姓名/电子邮件提示)

android - 带有两个 EditText 字段的 AlertDIalog

android - 其他按钮下方的按钮以编程方式android

android - 滚动时工具栏折叠不起作用

android - 关于 Spinner INVALID_POSITION 的基本查询

AndroidManifest.xml - 该元素必须是 <application> 元素错误的直接子元素

java - 从多模块gradle项目的子项目配置中的子项目获取变量

gradle - Gradle插件Spock测试

java - 将gradle项目导入Spring Tool Suite会导致依赖项错误