使用多种模板/风味构建单个Apk

时间:2019-05-06 21:45:58

标签: android android-layout gradle android-gradle android-productflavors

是否可以构建具有1种以上产品风味的APK?

例如: 我有一个3种口味的项目(App1-App2-App3)。
每个应用程序都有自己的配置,例如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"
        }
}

2 个答案:

答案 0 :(得分:2)

您无法构建具有多种风味的APK,就像无法在debug和release buildTypes中构建一个APK一样。所选风味的配置/资源将被拉入实际的APK元数据/清单中,因此无法在运行时进行修改。

您需要将所有内容都包含在res文件夹中,但是有几种方法可以帮助您更轻松地进行管理。如果您有大量具有不同行为的代码+布局文件,我建议使用前3个选项,第4个选项:

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

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

答案 1 :(得分:0)

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

sourceSets {


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

        }

    }