AGP 3.0.0 以上的 Transfrom 资源处理

AGP 3.0.0 以上的 Transfrom 资源处理

18 January 2018 Android

AGP 3.0.0 以上的 Transfrom 处理,会有一个致命的问题。

就是,通过 transformInvocation.outputProvider.getContentLocation 去获取一个 outputPath 的时候,会一直获得同一个路径。




现象


`{r, engine='groovy', count_lines} @Override void transform(TransformInvocation transformInvocation) throws TransformException, InterruptedException, IOException { transformInvocation.inputs.each { it.directoryInputs.each { DirectoryInput directoryInput -> def inputDir = directoryInput.file.path directoryInput.file.traverse(type: FileType.FILES) { def inputFileSuffixName = it.path.substring(inputDir.length() + 1) def destName = directoryInput.name + "/" + inputFileSuffixName def outputPath = transformInvocation.outputProvider.getContentLocation(destName, directoryInput.contentTypes, directoryInput.scopes, Format.DIRECTORY) FileUtils.copyFile(it, outputPath) } } } }


<br>

在 **destName** 里,规定了具体输出 **file name**。   

**outputPath** 的 **期望值** 是 **intermediates/transfroms/${目前 transfrom}/debug/0/xxx/xxx/xxx/.class**。  

但是,在 **AGP 3.0.0** 中,**结果值** 一直都是唯一的: **intermediates/transfroms/${目前 transfrom}/debug/0**。   

<br>

从 **结果值** 分析,无法通过 `transformInvocation.outputProvider.getContentLocation` 拿到具体 **file path**。

<br>

---

<br>

# 解决

<br>

这个问题,也很简单。      

**1.** 从 **结果值**,可以拿到 **目录**。   

**2.** **手动** 生成一下 **后续的子目录**。   

**3.** 开始 **copy file**。

<br>

```{r, engine='groovy', count_lines}
@Override
void transform(TransformInvocation transformInvocation)
        throws TransformException, InterruptedException, IOException {
    transformInvocation.inputs.each {
        it.directoryInputs.each { DirectoryInput directoryInput ->
            def inputDir = directoryInput.file.path
            directoryInput.file.traverse(type: FileType.FILES) {
                def inputFileSuffixName = it.path.substring(inputDir.length() + 1)
                def outputDir = transformInvocation.outputProvider.getContentLocation(
                        directoryInput.name,
                        directoryInput.contentTypes,
                        directoryInput.scopes, Format.DIRECTORY)
                def output = new File(
                        "${outputDir.path}${File.separator}${inputFileSuffixName}")
                if (!output.parentFile.exists()) {
                    output.mkdirs()
                }
                FileUtils.copyFile(it, output)
                copySuccess = output.exists()
            }
        }
    }
}