Gradle交换jniLibs资源基于构建风格

use*_*882 5 android gradle android-gradle-plugin

我试图根据它的a 或a 来交换res/raw文件夹和jniLibs/armeabi文件夹中的一些资源.我目前也有两种产品口味.release buildTypedebug buildType

build.gradle文件:

apply plugin: 'com.android.application'

android {
    dexOptions {
        preDexLibraries = false
    }

    compileSdkVersion 21
    buildToolsVersion "22.0.1"

    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 17
        targetSdkVersion 22
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
    }

    productFlavors{
        phone{
            applicationId "com.example.testPhone"
        }
        tablet{
            applicationId "com.example.testTablet"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

    sourceSets{
        release{
            res.srcDirs = ['androidRelease/res/raw']
        }
    }
}

dependencies {
    compile project(':facebook')

}
Run Code Online (Sandbox Code Playgroud)

是用sourceSet正确的方法吗?如果是,应该创建什么文件夹,以便它根据buildType唯一的资源交换适当的资源,而不管是productFlavors什么?

编辑:甚至可以交换jniLibsraw文件夹资源?

文件夹结构:

src/main/jniLibs/armeabi
phoneRelease/jniLibs/armeabi
tabletRelease/jniLibs/armeabi 
Run Code Online (Sandbox Code Playgroud)

文件夹结构是否正确.?

编辑2:根据Xavier的答案,gradle应如下所示:

android {

      sourcesets {
        phone {
          jniLibs.srcDirs = ['phoneRelease/jniLibs/']
          res.srcDirs = ['androidRelease/res/raw']
        }
        tablet {
          jniLibs.srcDirs = ['tabletRelease/jniLibs/']
          res.srcDirs = ['androidRelease/res/raw']
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

我一直在阅读很多相互矛盾的答案,其中一些人提到你只需要基于构建变体的单独文件夹,还有一些提到必须使用sourceSet?谢谢!

Com*_*are 5

他们中的一些人提到您只需要基于构建变体的单独文件夹,有些人提到必须使用 sourceSet?

Android 的 Gradle/Gradle 具有源集的预期结构:

  • 安卓资源在 res/
  • Java源代码树 java/
  • 预编译的 JNI 库 jniLibs/
  • 资产在 assets/
  • 等等。

sourceSets关闭进场是,如果对于给定的sourceset,你想有一个不同的结构

  • 安卓资源在 foo/
  • Java源代码树 bar/
  • 预编译的 JNI 库 ickyNativeStuff/
  • 资产在 assetsBecauseThatSeemsLikeADecentName/
  • 等等。

每个构建类型、产品风格和构建变体都可以有一个单独的源集(androidTest用于仪器测试),与main. 它们的名称与构建类型/产品风格/构建变体相同。这些将在库存结构中,除非您用于sourceSets更改内容。

因此,要回滚到:

我试图根据它是发布构建类型还是调试构建类型来交换 res/raw 文件夹和 jniLibs/armeabi 文件夹中的一些资源

在资源的情况下,其他源集覆盖main。因此,如果您有src/main/res/...andsrc/main/debug/...src/main/release/...,并且您正在进行debug构建,src/main/release/...则忽略in 中的任何内容(因为我们没有这样做release),src/main/res/...并且src/main/debug/...将使用in 中和中的任何内容。如果 (src/main/res/raw/boom.oggsrc/debug/res/raw/boom.ogg) 中的资源相同,则debug一个胜过main一个。

我还没有尝试过随jniLibs/构建变体而变化。我的猜测是它的行为更像 Java 代码,在构建变体的源集中的内容和main. 因此,您可以将编译后的 JNI 代码的调试版本src/debug/jniLibs/放在src/release/jniLibs/. 仅在src/main/jniLibs/没有变化的任何库中都有。话虽如此,正如我所提到的,我还没有尝试过这个,所以这里可能会出现问题。

因此,我希望您在 中没有sourcesets闭包build.gradle,而仅使用股票源集结构来处理您的各种位:

src/
  main/
    ...
  debug/
    jniLibs/
    res/
      raw/
  release
    jniLibs/
    res/
      raw/
Run Code Online (Sandbox Code Playgroud)