使用 multiable template/flavors 构建单个 Apk

Build Single Apk with multiable template/flavors

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

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

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

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

如果可以这样做,那么我应该如何将应用重新启动到其他版本?

我想到的另一件事是在主资源中构建所有 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 元数据/清单,因此无法在运行时修改。

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

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

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

您可以使用 sourceSets 命令合并来自不同风格的资源。 SourceSet 允许您配置 buildVariants 资源文件夹 例如,您可以将 App2 风格配置为包括 App2 res 文件夹和 App1 res 文件夹。 示例代码:

sourceSets {


        App2Debug{
            res.srcDirs = ['src/App1/res', 'src/App2/res']

        }

    }