blob: 01d6946c8ce1d2c0072b9f19fcc65ed0e3df4e5c [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.build.gradle.internal.dependency
import com.android.SdkConstants
import com.android.SdkConstants.FD_RES
import com.android.SdkConstants.FD_RES_VALUES
import com.android.build.gradle.internal.LoggerWrapper
import com.android.build.gradle.internal.res.Aapt2CompileRunnable
import com.android.build.gradle.internal.res.namespaced.registerAaptService
import com.android.build.gradle.options.SyncOptions
import com.android.ide.common.resources.CompileResourceRequest
import com.android.ide.common.xml.AndroidManifestParser
import org.gradle.api.artifacts.transform.InputArtifact
import org.gradle.api.artifacts.transform.TransformAction
import org.gradle.api.artifacts.transform.TransformOutputs
import org.gradle.api.artifacts.transform.TransformParameters
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.FileSystemLocation
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.Internal
import java.io.BufferedInputStream
import java.io.File
import java.nio.file.Files
import java.nio.file.Path
abstract class AarResourcesCompilerTransform :
TransformAction<AarResourcesCompilerTransform.Parameters> {
@get:InputArtifact
abstract val primaryInput: Provider<FileSystemLocation>
override fun transform(transformOutputs: TransformOutputs) {
val inputFile = primaryInput.get().asFile
val manifest = inputFile.resolve(SdkConstants.FN_ANDROID_MANIFEST_XML)
val outputDir = transformOutputs.dir(getPackage(manifest.toPath()))
outputDir.mkdirs()
val resourceDir = File(inputFile, FD_RES)
val resourceFolders = if (resourceDir.exists()) {
resourceDir.listFiles { dir, name ->
dir.isDirectory && !name.startsWith(FD_RES_VALUES)
}
} else {
arrayOf<File>()
}
val requestList = ArrayList<CompileResourceRequest>()
resourceFolders?.forEach { folder ->
folder?.listFiles()?.forEach {
// TODO(b/130160921): Add compile options
requestList.add(CompileResourceRequest(it, outputDir))
}
}
val aapt2ServiceKey =
registerAaptService(
parameters.aapt2FromMaven,
LoggerWrapper.getLogger(this::class.java)
)
Aapt2CompileRunnable(
Aapt2CompileRunnable.Params(
aapt2ServiceKey,
requestList,
parameters.errorFormatMode.getOrElse(SyncOptions.ErrorFormatMode.HUMAN_READABLE)
)
).run()
}
private fun getPackage(manifest: Path): String =
BufferedInputStream(Files.newInputStream(manifest)).use {
AndroidManifestParser.parse(it).`package`
}
interface Parameters : TransformParameters {
@get:Input
val aapt2Version: Property<String>
@get:Internal
val aapt2FromMaven: ConfigurableFileCollection
@get:Internal
val errorFormatMode: Property<SyncOptions.ErrorFormatMode>
}
}