AGP 3.0.0 以上的 Transfrom 资源处理

AGP 3.0.0 以上的 Transfrom 资源处理

15 January 2018

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

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




现象


@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)
            }
        }
    }
}


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

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

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


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




解决


这个问题,也很简单。

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

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

3. 开始 copy file


@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()
            }
        }
    }
}