com.xml.guard.tasks.CustomStringChangeTask.kt Maven / Gradle / Ivy
package com.xml.guard.tasks
import com.xml.guard.entensions.GuardExtension
import com.xml.guard.model.MappingParser
import com.xml.guard.utils.aidlDirs
import com.xml.guard.utils.allDependencyAndroidProjects
import com.xml.guard.utils.isAidl
import com.xml.guard.utils.isJava
import com.xml.guard.utils.isKt
import com.xml.guard.utils.isXml
import com.xml.guard.utils.javaDirs
import com.xml.guard.utils.manifestFile
import com.xml.guard.utils.replaceWordsByPattern
import com.xml.guard.utils.resDirs
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
import java.io.File
import javax.inject.Inject
open class CustomStringChangeTask @Inject constructor(
private val guardExtension: GuardExtension,
private val variantName: String,
) : DefaultTask() {
init {
group = "guard"
}
private val mappingFile by lazy { project.file(MappingParser.MAPPING_CUSTOM_STRING) }
private val mapping by lazy {
MappingParser.parseCustomString(
project,
guardExtension,
mappingFile,
isSelfParse = true
)
}
@TaskAction
fun execute() {
val androidProjects = allDependencyAndroidProjects(project)
// 1、混淆自定义字符
val obfuscateMap = mapping.obfuscateCustomString()
// 2、替换所有文件里引用到的混淆字符
if (obfuscateMap.isNotEmpty()) {
val files = androidProjects.flatMap { project ->
val dirs = mutableListOf()
dirs.add(project.manifestFile())
dirs.addAll(project.aidlDirs(variantName))
dirs.addAll(project.resDirs(variantName))
dirs.addAll(project.javaDirs(variantName))
project.files(dirs).asFileTree.files
}
replaceText(files, obfuscateMap)
}
// 3、混淆映射写出到文件
mapping.writeMappingToFile(mappingFile)
}
private fun replaceText(
files: List,
obfuscateMap: Map
) {
files.forEach { file ->
if (!file.isXml && !file.isJava && !file.isKt && !file.isAidl) {
return@forEach
}
var replaceText = file.readText()
obfuscateMap.forEach { (oldName, newName) ->
replaceText = replaceText.replaceWordsByPattern(oldName, newName)
}
file.writeText(replaceText)
}
}
}