如何将工件转换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时发生变化。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...