Android/Gradle: 编译后添加资产

3
我有一个任务,可以基于Android Gradle构建中编译的类生成元数据文件。我可以通过在编译任务后执行它来运行它:
android.applicationVariants.all { variant ->
    def variantName = variant.name.capitalize()
    def compileSourcesTaskName = "compile${variantName}Sources"
    def compileSourcesTask = project.tasks.findByName(compileSourcesTaskName)
    compileSourcesTask.finalizedBy "myTaskThatGeneratesAssets"
}

很遗憾,此时Android已经处理了资产。新文件不会被包含在已组装的APK中。 回答一个类似问题的答案建议在对齐/签名之前调用aapt add将文件添加到APK中。这似乎可行,但该帖子没有详细说明实现细节。在Android Gradle插件中调用aapt的代码对于构建脚本来说看起来相当复杂,我不确定如何访问它所引用的IAndroidTarget。 我会欣赏有关如何实现此操作或任何其他解决方案的建议!
1个回答

3
好的,这是我最终得出的结果。它有两个假设,可能会在以后的Android Gradle插件版本中失效(我正在使用1.3.0):
  1. 平台工具的路径为${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.buildToolsVersion}/
  2. 中间(资源)APK的路径为${buildDir}/intermediates/res/resources-${variant.baseName}.ap_
只要这些是正确的,这将生成一个任务,在构建资源APK之后使用aapt添加新的资产文件:
def overlayDir = ... // path to a resources overlay directory that contains "assets/my.json"
def addMyAssetTaskName = "add${variantName}MyAsset"
task "${addMyAssetTaskName}" (type: Exec) {
    dependsOn myTaskThatGeneratesAssets
    workingDir overlayDir
    def aaptCommand = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.buildToolsVersion}/aapt"
    def apkPath = "${buildDir}/intermediates/res/resources-${variant.baseName}.ap_"
    commandLine aaptCommand, 'add', apkPath, "assets/my.json"
}

然后我像上面的问题一样使用finalizedBy来添加addMyAssetTaskName

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接