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

时间:2016-01-04 16:33:32

标签: android gradle android-gradle

我有以下项目结构

MyProject
|-- build.gradle
|-- client.private
|-- server.public
|-- app
|   |-- build.gradle
|   |-- lint.xml
|   |-- proguard-project.txt
|   |-- project.properties
|   `-- src

并希望将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}")
            }
        }
    }
}

但它只将文件复制到app/build/assets/debug,它没有与apk一起打包。

2 个答案:

答案 0 :(得分:5)

EDITED

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

android {
  sourceSets {
    main {
        assets.srcDirs = ['../client.private','../server.public']
    }
  }
}

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

afterEvaluate {
    android.sourceSets.main.assets.srcDirs.each{println it}
}

答案 1 :(得分:2)

更新(正确解决方案)

最后!我想我已经理解了评论意味着什么

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

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

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

该解决方案基于this reddit thread

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

注意:根据reddit主题中的one of the comments,有更好的方法,但我unable to figure it out