如何使用Gradle中的不同资源文件夹为每个flavor创建两个应用程序?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Gradle中的不同资源文件夹为每个flavor创建两个应用程序?相关的知识,希望对你有一定的参考价值。

目前我正在开发一个有5种口味的应用程序,这是我的build.gradle文件的一部分:

buildscript {
   repositories {
       mavenCentral()
   }
   dependencies {
       classpath 'com.android.tools.build:gradle:0.14.0'
   }
}

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

android {
    compileSdkVersion 20
    buildToolsVersion '20.0.0'

    signingConfigs {
        release {
            storeFile file("")
            storePassword "password"
            keyAlias "alias"
            keyPassword "password"
        }
    }

    lintOptions {
        abortOnError false
    }

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 20

        applicationId 'application.package'
        signingConfig signingConfigs.release
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

    productFlavors {
        flavor1{
            applicationId 'com.flavor1.package'
        }
        flavor2{
            applicationId 'com.flavor2.package'
        }
        flavor3{
            applicationId 'com.flavor3.package'
        }
        flavor4{
            applicationId 'com.flavor4.package'
        }
        flavor5{
            applicationId 'com.flavor5.package'
        }
    }
}

dependencies {
    compile project(':SDK')
}

我不得不在文件中做一些更改,但基本上就是这样。

问题是:我要求在assets文件夹中为每一种风格提供一组不同的资产文件,这些文件将创建一个不同的apk文件,但具有相同的包名。这些apk文件将作为相同的应用程序上传到Google Play,但针对不同的地区。

所以包名必须保持不变。所以基本上我需要创建一种机制,当它们中的每两个具有相同的包名但具有不同的资产文件夹时,而不是5种风格将创建10种风味。如何使用gradle完成?

我尝试使用BuildTypes实现这一点,如下所示:

buildTypes {
    release {
        signingConfig signingConfigs.release
        sourceSets.main.assets.srcDirs = ['assets']
    }
    releaseAlt {
        signingConfig signingConfigs.release
        sourceSets.main.assets.srcDirs = ['assetsalt']
    }
}

但由于某种原因,releaseAlt还会获取位于assets目录中的文件,而不是assetsalt目录。

答案

您可以使用buildTypes。

buildTypes {
  release {
    // ... the usual stuff here
  }
  releaseAlt {
    // .. the usual stuff here too like signing config etc...
  }
}

现在文件层次结构:

你应该有

project/
- app/
 - src/
  - main/
   - assets/
    - logo.png // Generic assets go here
   - java/
   - res/
   - ...

  - flavor1/
   - assets/
    - logo.png // Specific assets for all the flavor1 Variants

  - releaseAlt/
   - asset/
    - logo.png // Specific assets for all the releaseAlt Variants.

  - flavor1ReleaseAlt/
   - assets/
    - logo.png // very specific assets for the flavor1ReleaseAlt Variant
- SDK/

使用此文件层次结构,当您构建flavor1Release变体时,您将获得flavor1/assets/中的logo.png文件,但是当您构建flavor1ReleaseAlt变体时,此png将替换为来自flavor1ReleaseAlt/assets/文件夹的on。

说明:

Gradle使用约定而不是配置(默认情况下)。特别是在项目结构方面。当构建flavor1ReleaseAlt Variant时,Gradle(实际上是Android插件;))正在寻找一个名为flavor1ReleaseAlt /的文件夹,里面有一些资产,资源,java等...这些是Gradle可以为此Variant找到的最具体的应用资源。然后Gradle会为一些不太具体的应用资源寻找一个名为flavor1 /的文件夹。然后到一个名为releaseAlt /的更小的特定文件夹,最后到通用文件夹(main /)。

不同的文件夹必须具有非常严格的名称才能匹配Variant查找:

  • flavorBuildType /。 (顺序很重要)。
  • 味道/
  • buildType /
  • 主要/

希望这可以帮助。

以上是关于如何使用Gradle中的不同资源文件夹为每个flavor创建两个应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

每个构建变体有两个 res 目录,Gradle 停止跟踪资源文件中的更改

gradle 打包不同资源

自动发布 FLA 文件;多次调用 Process.Start

如何使用 Gradle 访问 Java 项目中的资源?

使用 gradle 为不同的应用程序风格使用不同的资源(图形和字符串)

在使用 Android Gradle 插件 3.3.0 合并资源期间构建失败