From a9761624a842f93363b37c7758da2d9cdc17beac Mon Sep 17 00:00:00 2001 From: df13954 <1124466590@qq.com> Date: Wed, 15 Jan 2025 15:30:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(scan):=20=E5=8A=9F=E8=83=BD,=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E5=8A=9F=E8=83=BD=E5=92=8C=E5=85=B6=E4=BB=96=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=B8=8D=E5=86=B2=E7=AA=81,=E5=8F=AA=E6=98=AF?= =?UTF-8?q?=E5=81=9A=E4=B8=80=E4=B8=AA=E8=A1=A5=E5=85=85.=E6=AD=A4?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=B8=8D=E5=81=9A=E4=BB=BB=E4=BD=95=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BF=AE=E6=94=B9,=E5=8F=AA=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E7=9B=B8=E5=90=8C=E5=90=8D=E5=AD=97=E7=9A=84=E7=B1=BB.=20?= =?UTF-8?q?=E5=9C=A8=E4=BD=BF=E7=94=A8xmlClassGuard=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E6=B7=B7=E6=B7=86=E4=BB=A3=E7=A0=81=E5=90=8E,=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E5=AD=98=E5=9C=A8=E8=BF=99=E6=A0=B7=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98.=20=E4=BE=8B=E5=A6=82=E4=BD=A0=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=B8=AD=E6=9C=89/data/Book.java=E5=92=8C/app/test/Bo?= =?UTF-8?q?ok.java=E7=94=9A=E8=87=B3=E5=A4=9A=E4=B8=AA=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E4=B8=8B=E5=AD=98=E5=9C=A8=E7=9B=B8=E5=90=8C=E6=96=87=E4=BB=B6?= =?UTF-8?q?=20=E5=90=8D=E5=AD=97,=E5=BD=93=E6=B7=B7=E6=B7=86=E4=B9=8B?= =?UTF-8?q?=E5=90=8E,=E5=AD=98=E5=9C=A8=E5=AF=BC=E5=8C=85=E6=B7=B7?= =?UTF-8?q?=E4=B9=B1=E6=83=85=E5=86=B5,=E5=9C=A8=E4=BD=BF=E7=94=A8/app/tes?= =?UTF-8?q?t/Book.java=E7=9A=84=E7=B1=BB=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=BA=86=20data/Book.java=E7=9A=84=E7=B1=BB.=20?= =?UTF-8?q?=E5=9C=A8=E6=89=A7=E8=A1=8CxmlClassGuard=E4=B9=8B=E5=89=8D?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E4=B8=80=E6=AC=A1=E7=9B=B8=E5=90=8C=E7=B1=BB?= =?UTF-8?q?=E5=90=8D=E7=9A=84=E7=B1=BB,=E8=87=AA=E5=B7=B1=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E9=87=8D=E5=91=BD=E5=90=8D=E5=94=AF=E4=B8=80=E7=9A=84?= =?UTF-8?q?=E7=B1=BB=20=E5=8F=AF=E4=BB=A5=E9=81=BF=E5=85=8D=E4=B8=8A?= =?UTF-8?q?=E8=BF=B0=E9=97=AE=E9=A2=98.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 ++ .../java/com/xml/guard/XmlClassGuardPlugin.kt | 2 + .../xml/guard/tasks/FindDuplicateFileTask.kt | 77 +++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 plugin/src/main/java/com/xml/guard/tasks/FindDuplicateFileTask.kt diff --git a/README.md b/README.md index a3dd48c..85b0139 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,12 @@ - `XmlClassGuard`最主要的功能是混淆xml文件用到的类,故取名为`XmlClassGuard`,与[AndResGuard](https://github.com/shwenzhang/AndResGuard)、[AabResGuard](https://github.com/bytedance/AabResGuard)对应 +- `findDuplicateFile`功能,这个功能和其他功能不冲突,只是做一个补充.此任务不做任何代码修改,只扫描相同名字的类. +在使用xmlClassGuard任务混淆代码后,可能存在这样的问题. +例如你的代码中有/data/Book.java和/app/test/Book.java甚至多个目录下存在相同文件 +名字,当混淆之后,存在导包混乱情况,在使用/app/test/Book.java的类可能导入了 +data/Book.java的类. 在执行xmlClassGuard之前检测一次相同类名的类,自己进行重命名唯一的类 +可以避免上述问题. # 有什么用? diff --git a/plugin/src/main/java/com/xml/guard/XmlClassGuardPlugin.kt b/plugin/src/main/java/com/xml/guard/XmlClassGuardPlugin.kt index 1456811..6af85dc 100644 --- a/plugin/src/main/java/com/xml/guard/XmlClassGuardPlugin.kt +++ b/plugin/src/main/java/com/xml/guard/XmlClassGuardPlugin.kt @@ -6,6 +6,7 @@ import com.xml.guard.entensions.GuardExtension import com.xml.guard.model.aabResGuard import com.xml.guard.model.andResGuard import com.xml.guard.tasks.FindConstraintReferencedIdsTask +import com.xml.guard.tasks.FindDuplicateFileTask import com.xml.guard.tasks.MoveDirTask import com.xml.guard.tasks.PackageChangeTask import com.xml.guard.tasks.XmlClassGuardTask @@ -52,6 +53,7 @@ class XmlClassGuardPlugin : Plugin { createTask("xmlClassGuard$variantName", XmlClassGuardTask::class, guardExt, variantName) createTask("packageChange$variantName", PackageChangeTask::class, guardExt, variantName) createTask("moveDir$variantName", MoveDirTask::class, guardExt, variantName) + createTask("findDuplicateFile$variantName", FindDuplicateFileTask::class, guardExt, variantName) if (guardExt.findAndConstraintReferencedIds) { createAndFindConstraintReferencedIdsTask(variantName) } diff --git a/plugin/src/main/java/com/xml/guard/tasks/FindDuplicateFileTask.kt b/plugin/src/main/java/com/xml/guard/tasks/FindDuplicateFileTask.kt new file mode 100644 index 0000000..3829b7b --- /dev/null +++ b/plugin/src/main/java/com/xml/guard/tasks/FindDuplicateFileTask.kt @@ -0,0 +1,77 @@ +package com.xml.guard.tasks + +import com.xml.guard.utils.aidlDirs +import com.xml.guard.utils.allDependencyAndroidProjects +import com.xml.guard.utils.javaDirs +import org.gradle.api.DefaultTask +import org.gradle.api.Project +import org.gradle.api.tasks.TaskAction +import java.io.File +import javax.inject.Inject + +/** + * User: debug + * Date: 2025/01/15 + * Time: 13:06 + * 扫描项目中相同名字的类. + * 扫描结果查看日志:发现相同名字的类. + * 为什么要增加这个功能? 这个功能和其他功能不冲突,只是做一个补充. + * 在使用xmlClassGuard任务混淆代码后,可能存在这样的问题. + * 例如你的代码中有/data/Book.java和/app/test/Book.java甚至多个目录下存在相同文件 + * 名字,当混淆之后,存在导包混乱情况,在使用/app/test/Book.java的类可能导入了 + * data/Book.java的类. 在执行xmlClassGuard之前检测一次相同类名的类,自己进行重命名唯一的类 + * 可以避免上述问题. + */ +open class FindDuplicateFileTask @Inject constructor( + private val variantName: String, +) : DefaultTask() { + + init { + // 将任务设置在那个分组, gradle任务组中,例如install,help,build等 + group = "guard" + } + + @TaskAction + fun execute() { + // 任务执行入口 + // 返回主module依赖的所有Android子module,包含间接依赖的 + val androidProjects = allDependencyAndroidProjects() + androidProjects.forEach { it.startScan() } + } + + /** + * 扫描代码 + */ + private fun Project.startScan() { + val dirs = mutableListOf(); + val aidlDirs = aidlDirs(variantName) + dirs.addAll(aidlDirs) + val javaDirs = javaDirs(variantName) + dirs.addAll(javaDirs) + val filePaths = mutableListOf() + // 储存文件路径 + files(dirs).asFileTree.forEach { + filePaths.add(it.absolutePath) + } + + // 用于存储具有相同基本名称的文件 + val fileNameMap = mutableMapOf>() + // 遍历文件路径列表,将文件名作为键,文件路径作为值存入 Map + for (filePath in filePaths) { + // 提取文件名(包含扩展名) + val fileName = filePath.substringAfterLast("/") + + // 将文件路径添加到对应的列表中 + fileNameMap.computeIfAbsent(fileName) { mutableListOf() }.add(filePath) + } + // 过滤出那些具有多个路径的文件名 + val filteredList = fileNameMap.filter { it.value.size > 1 }.values.flatten() + + // 输出过滤后的文件路径列表 + if (filteredList.isEmpty()) { + return + } + println("发现相同名字的类:") + println(filteredList) + } +} \ No newline at end of file