【问题标题】:How to create two applications for each flavor with different assets folders in Gradle?如何在 Gradle 中使用不同的资产文件夹为每种风格创建两个应用程序?
【发布时间】:2015-01-08 23:14:24
【问题描述】:

目前我正在开发一个有 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 目录中的文件。

【问题讨论】:

    标签: java android gradle android-gradle-plugin build.gradle


    【解决方案1】:

    您可以为此使用 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 将被替换为 on from flavor1ReleaseAlt/assets/ 文件夹。

    说明:

    Gradle 使用约定而不是配置(默认情况下)。尤其是在项目结构方面。在构建 flavor1ReleaseAlt 变体时,Gradle(实际上是 Android 插件;))正在寻找一个名为 flavor1ReleaseAlt/ 的文件夹,其中包含一些资产、资源、java 等。这些是 Gradle 可以为此变体找到的最具体的应用程序资源。然后,Gradle 将查找一个简单称为 flavor1/ 的文件夹,以获取一些不太具体的应用程序资源。然后是一个更小的特定文件夹,称为 releaseAlt/,最后是通用文件夹 (main/)。

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

    • 风味构建类型/。 (顺序很重要)。
    • 风味/
    • buildType/
    • 主要/

    希望这会有所帮助。

    【讨论】:

    • 感谢您的帮助,但我希望有一个解决方案,在这种解决方案中,我不必为具有相同包的应用程序再次创建完整风格,而是提供具有不同资产的相同风格目录来创建两个 apk,它们之间的唯一区别是这个 assets 文件夹。你认为这可以在不创建 flavor1ReleaseAlt 风味的情况下完成吗?
    • 您不必创造新口味。在 Android Gradle 中,风味的概念与 Variant 的概念相关联。变体是 BuildType + Flavor。例如,如果您有一个 buildType Debug 和一个 Flavor flavor1,则完整的变体是 flavor1Debug。使用我的解决方案,您正在使用自定义 buildType 在相同的 Flavors 上拥有更多变体。你只需要定义一个新的 BuildType,所有你已经定义的 Flavors 都会有一个新的 Variant。
    • 使用 Gradle,文件夹层次结构是基于变体的。如果您知道每个 Flavor 都为 ReleaseAlt BuildType 共享相同的资产,您只需添加一个新文件夹 releaseAlt/assets/ 并将所有替代资产放入其中。编辑答案
    • 问题在于并非所有替代风格都将共享相同的替代资产文件夹。我需要为不同的风格提供不同的资产文件夹。那就是我写我在第二段代码中写的内容的原因。另一个问题是我需要替代风味将包含风味1 目录中的所有文件,但要从风味1alt 目录中获取资产。从您的解释中,我真的不明白如何做到这一点。你能详细说明一下吗?
    • 如果您有特定的替代资产适用于 flavor1 替代构建,请将其放在 flavor1ReleaseAlt/assets/ 文件夹中。如果您有特定的替代资产适用于风味 2 alt 构建,请将其放在 flavor2ReleaseAlt/assets/ 文件夹中。
    猜你喜欢
    • 2013-06-10
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多