java - 如何在 Gradle 中使用不同的 Assets 文件夹为每种风格创建两个应用程序?

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

目前我正在开发一个有 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 文件夹中为这些风格中的每一种提供一组不同的 Assets 文件,这些文件将创建不同的 apk 文件但具有相同的包名称。这些 apk 文件将作为同一应用程序上传到 Google play,但适用于不同的地区。

所以包名必须保持不变。所以基本上我需要创建一种机制,而不是 5 种口味,当每两种口味都具有相同的包名称但 Assets 文件夹不同时,将创建 10 种口味。如何使用 gradle 完成此操作?

我试过像这样使用 BuildTypes 实现它:

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

但出于某种原因,releaseAlt 还采用位于 Assets 目录而不是 Assets 盐目录中的文件。

最佳答案

您可以为此使用 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/ 文件夹中的替换。

解释:

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

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

  • flavorBuildType/. (顺序很重要)。
  • 味道/
  • 建筑类型/
  • 主/

希望这对您有所帮助。

关于java - 如何在 Gradle 中使用不同的 Assets 文件夹为每种风格创建两个应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26881266/

相关文章:

java - 哪种代码性能更好?

java - 确认传递到 Spring Rest Endpoint 的 RequestBody 的无效输入的方法

java - 将 jsp 文件合并/叠加到特定位置

Android SDK 安装失败 - 连接重置。什么都没有安装

java - Android MPAndroid图表

安卓工作室 : Keep project file tree state expanded

java - libsodium + Windows 10 x64 + Eclipse

java - 在 IntelliJ Java 项目中添加了 Gradle 看不到的外部静态库

Android Studio : Migrate complex build. xml 到 build.gradle

gradle - 如何在模型外部访问model.android属性