文章目录
Task29 checkDebugLibraries
1. inut/ouput
taskName:checkDebugLibraries
=========================================================
output:/Users/dingbaosheng/work/mockuai/project/AndroidGradleTaskDemo/app/build/intermediates/check-libraries/debug
这个任务就是用来做校验的,如果存在多个modules打包成相同库,则会提示报错
2. 核心类(CheckMultiApkLibrariesTask)
@TaskAction
fun taskAction() {
// Build a map of libraries to their corresponding modules. If two modules package the same
// library, we will use the map to output a user-friendly error message.
val map = mutableMapOf<String, MutableList<String>>()
var found = false
for (artifact in featureTransitiveDeps) {
// Sanity check. This should never happen.
if (artifact.id.componentIdentifier !is ProjectComponentIdentifier) {
throw GradleException(
artifact.id.componentIdentifier.displayName + " is not a Gradle project.")
}
val projectPath =
(artifact.id.componentIdentifier as ProjectComponentIdentifier).projectPath
if (artifact.file.isFile) {
found = found || updateLibraryMap(artifact.file, projectPath, map)
}
}
if (found) {
// Build the error message. Sort map and projectPaths for consistency.
val output = StringBuilder()
for ((library, projectPaths) in map.toSortedMap()) {
if (projectPaths.size > 1) {
output
.append(projectPaths.sorted().joinToString(prefix = "[", postfix = "]"))
.append(" all package the same library [$library].\n")
}
}
throw GradleException(output.toString())
}
}
private fun updateLibraryMap(
file: File,
projectPath: String,
map: MutableMap<String, MutableList<String>>
): Boolean {
var found = false
for (library in Files.readLines(file, Charsets.UTF_8)) {
val libraryWithoutVariant = library.substringBeforeLast("::")
if (map.containsKey(libraryWithoutVariant)