Android Gradle - 如何从根项目中包含资产?

Kri*_*raj 3 android gradle android-gradle-plugin

我有以下项目结构

MyProject
|-- build.gradle
|-- client.private
|-- server.public
|-- app
|   |-- build.gradle
|   |-- lint.xml
|   |-- proguard-project.txt
|   |-- project.properties
|   `-- src
Run Code Online (Sandbox Code Playgroud)

并希望包含client.privateserver.public文件到最终apk的assets文件夹,但遗憾的是无法这样做.

在我的中有以下内容 app/build.gradle

...
android {
    ...
    applicationVariants.all { variant ->
        variant.mergeAssets.doLast {
            copy {
              from(['../client.private', '../server.public'])
              into("${buildDir}/assets/${variant.dirName}")
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它只复制文件app/build/assets/debug,它没有与apk打包.

tak*_*rom 7

EDITED

请尝试使用sourceSets.(路径编辑)

android {
  sourceSets {
    main {
        assets.srcDirs = ['../client.private','../server.public']
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以检查每个资产目录的路径.

afterEvaluate {
    android.sourceSets.main.assets.srcDirs.each{println it}
}
Run Code Online (Sandbox Code Playgroud)


Kri*_*raj 4

更新(正确的解决方案)

最后!我想我已经明白评论的意思了

android {
  ...
  ...
  applicationVariants.all { variant ->
    variant.mergeResources.doLast {
      copy {
        from (["../client.private", "../server.public"])
        into ("$outputDir/raw")
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

较旧的解决方案(有效但不是理想的解决方案)

我无法找到将单个文件包含在源集中的方法,因此下一个技巧是尝试将文件复制到文件夹raw

该解决方案基于reddit 线程

task copyKeyStores(type: Copy) {
    from files(["../client.private", "../server.public"])
    into 'src/main/res/raw'
}
tasks.copyKeyStores.execute()
Run Code Online (Sandbox Code Playgroud)

注意:根据reddit 线程中的评论之一,有一种更好的方法,但我无法弄清楚