如何解决如何将工件转换API任务结果连接到Android Studio
我一直在尝试新的com.android.tools.build:gradle-api
,如
https://medium.com/androiddevelopers/new-apis-in-the-android-gradle-plugin-f5325742e614。
具体地说,我正在看的是有关如何转换apk工件的部分,例如:
abstract class MyTask: DefaultTask() {
@get:InputFiles
abstract val inputApkFiles: DirectoryProperty
@get:OutputDirectory
abstract val outputApkDirectory: DirectoryProperty
@TaskAction
fun taskAction() {
println("MyTask running")
inputApkFiles.asFileTree.files.forEach(Consumer {
println("Copying ${it} to ${File(outputApkDirectory.asFile.get(),it.name)}")
it.copyTo(File(outputApkDirectory.asFile.get(),it.name),overwrite = true)
})
}
}
class ExamplePlugin: Plugin<Project> {
override fun apply(project: Project) {
project.extensions.getByType(CommonExtension::class.java).let { androidExtension ->
androidExtension.onVariantProperties {
val myTask = project.tasks.register("myTask${this.name.capitalize()}",MyTask::class.java) {
it.inputApkFiles.set(artifacts.get(ArtifactType.APK))
}
artifacts
.use(myTask)
.wiredWithDirectories(
MyTask::inputApkFiles,MyTask::outputApkDirectory
)
.toTransform(ArtifactType.APK)
}
}
}
}
我正在尝试将此新api与gradle插件中的自定义任务结合起来,以便Android Studio接受这些更改。换句话说,如果您在Android Studio中点击“播放”图标,我希望运行我的自定义gradle apk转换任务,并安装并运行在该设备上的新apk。
我发现即使我克服了How to avoid dependencies on internal android tasks in new com.android.tools.build:gradle-api中描述的问题(通过将Before launch
中的自定义gradle任务包含在app
的android studio的运行配置中)它仍在从旧路径安装和运行apk。本质上,它忽略了对apk进行了转换的自定义任务的输出。
我得到:
Copying /app/build/outputs/apk/debug/output-metadata.json to /app/build/intermediates/apk/debug/myTaskDebug/output-metadata.json
Copying /app/build/outputs/apk/debug/app-debug.apk to /app/build/intermediates/apk/debug/myTaskDebug/app-debug.apk
但是在安装过程中,我可以看到它正在使用
/app/build/outputs/apk/debug/app-debug.apk
推送/安装到设备
我该如何说服Android Studio以及项目中可能存在的其他其他apk消费任务,以使用我在自定义任务中生成的新apk?
解决方法
失败的原因是因为您未经修改就复制了output-metadata.json文件(其中包含原始文件的路径)。因此,安装任务将使用新的json文件(该文件指向旧的APK!)。
我们实际上有一个在此处复制APK的示例: https://github.com/android/gradle-recipes/tree/master/Kotlin/workerEnabledTransformation
它比您做的要复杂一些,因为它使用Worker并行复制文件,但是您应该可以按原样使用它。
还请注意,我们正在更改那些正在孵化的API,并且该示例中使用的某些API可能会在达到4.2-beta01时发生变化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。