Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Gradle中的不同资产文件夹为每种风格创建两个应用程序?_Java_Android_Gradle_Android Gradle Plugin_Build.gradle - Fatal编程技术网

Java 如何使用Gradle中的不同资产文件夹为每种风格创建两个应用程序?

Java 如何使用Gradle中的不同资产文件夹为每种风格创建两个应用程序?,java,android,gradle,android-gradle-plugin,build.gradle,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 {

目前,我正在开发一个具有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,但适用于不同的地区

因此包名必须保持不变。所以基本上我需要创建一个机制,当每两个都有相同的包名但有不同的资产文件夹时,将创建10个flavor,而不是5个flavor。如何使用gradle实现这一点

我曾尝试使用如下构建类型实现此功能:

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/
文件夹替换

说明:

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

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

  • flavorBuildType/。(秩序很重要)
  • 风味/
  • 建筑类型/
  • 主要/

希望这会有所帮助。

谢谢您的帮助,但我希望找到一种解决方案,在这种解决方案中,我不必为具有相同软件包的应用程序再次创建一个完整的版本,而是使用不同的资产目录提供相同的版本,以创建两个APK,它们之间唯一的区别就是此资产文件夹。您认为不创建flavor1ReleaseAlt风味就可以做到这一点吗?您不必创建新的风味。在Android Gradle中,风味的概念与变体的概念相联系。一个变体是BuildType+Flavor。例如,如果您有buildType调试和FlavorFlavor1,则完整的变体是flavor1Debug。在我的解决方案中,您使用的是自定义构建类型,以便在相同的风格上有更多的变体。你只需要定义一个新的构建类型,所有已经定义的风格都将有一个新的变体。使用Gradle,文件夹层次结构是基于变体的。如果您知道每种风格都为ReleaseAlt BuildType共享相同的资产,那么只需添加一个新文件夹
ReleaseAlt/assets/
,并将所有可选资产放在其中。编辑答案问题在于,并非所有的备选口味都将共享同一个备选资源文件夹。我需要为不同的口味提供不同的资产文件夹。这就是我在《第二次代码和平》中所写内容的原因。另一个问题是,我需要替代的flavor包含来自flavor1目录的所有文件,但要从flavor1alt目录获取资产。从你的解释中我真的不明白这是怎么做到的。您能详细说明一下吗?如果您有一个特定的替代资产用于flavor1替代构建,请将其放入
flavor1ReleaseAlt/assets/
文件夹中。如果您有一个用于Flavor2Alt构建的特定替代资产,请将其放入
flavor2ReleaseAlt/assets/
文件夹中。