From 572fa5810b1461f7d001d6f58a19bfe6d42fa8fc Mon Sep 17 00:00:00 2001 From: You Qi Date: Sat, 29 Apr 2023 18:05:59 +0800 Subject: [PATCH] Introduce stats and use relative path in report --- README.md | 14 ++++++++ .../com/axzae/unmeta/UnmetaClassVisitor.kt | 1 - .../java/com/axzae/unmeta/UnmetaExtension.kt | 2 +- .../main/java/com/axzae/unmeta/UnmetaTask.kt | 35 ++++++++++++++----- 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 66a691e..4c521e8 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,20 @@ unmeta { } ``` +## Report + +Generated task report is located at `$BUILD_DIR/outputs/logs/unmeta-report.txt` + +``` +Start dropping @DebugMetadata from kotlin classes + Removed @DebugMetadata annotation from com\example\main\MainActivity$greetings$2.class + Removed @DebugMetadata annotation from com\example\main\MainActivity$onCreate$2.class +Task finished. +Class files scanned: 7 +Class files modified: 7 +Execution time: 12ms. +``` + ## Contributing Feel free to open a issue or submit a pull request for any bugs/improvements. diff --git a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaClassVisitor.kt b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaClassVisitor.kt index beeed6b..c086329 100644 --- a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaClassVisitor.kt +++ b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaClassVisitor.kt @@ -5,7 +5,6 @@ import org.objectweb.asm.ClassVisitor import org.objectweb.asm.Opcodes class UnmetaClassVisitor( - val path: String, classVisitor: ClassVisitor, ) : ClassVisitor(Opcodes.ASM7, classVisitor), Opcodes { diff --git a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaExtension.kt b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaExtension.kt index fc5d2ae..592a17a 100644 --- a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaExtension.kt +++ b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaExtension.kt @@ -7,7 +7,7 @@ import javax.inject.Inject const val DEFAULT_IS_ENABLED = true const val DEFAULT_VERBOSE = false -const val DEFAULT_OUTPUT_FILE = "outputs/logs/unmeta.txt" +const val DEFAULT_OUTPUT_FILE = "outputs/logs/unmeta-report.txt" @Suppress("UnnecessaryAbstractClass") abstract class UnmetaExtension @Inject constructor(project: Project) { diff --git a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaTask.kt b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaTask.kt index 0bfea51..c5eb2e4 100644 --- a/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaTask.kt +++ b/plugin-build/unmeta/src/main/java/com/axzae/unmeta/UnmetaTask.kt @@ -31,7 +31,14 @@ abstract class UnmetaTask : DefaultTask() { @get:OutputFile abstract val outputFile: RegularFileProperty - private val fileLogger by lazy { outputFile.get().asFile } + private val fileLogger by lazy { + outputFile.get().asFile.apply { + writeText("", Charsets.UTF_8) + } + } + + private var scannedFiles = 0 + private var modifiedFiles = 0 @TaskAction fun unmetaAction() { @@ -41,12 +48,20 @@ abstract class UnmetaTask : DefaultTask() { } log("Start dropping @DebugMetadata from kotlin classes") val executionMs = measureTimeMillis { - val kotlinClassesPath = project.buildDir.absolutePath + "/tmp/kotlin-classes/${variantName.get()}" - File(kotlinClassesPath).listFiles()?.forEach { file -> - if (file.isDirectory) removeAnnotation(file) - } + val kotlinClassesBasePathName = project.buildDir.absolutePath + "/tmp/kotlin-classes/${variantName.get()}" + val kotlinClassesBasePath = File(kotlinClassesBasePathName) + kotlinClassesBasePath.listFiles() + ?.filter { it.isDirectory } + ?.forEach { directory -> removeAnnotation(directory, kotlinClassesBasePath) } } - log("Unmeta Total Time: ${executionMs}ms") + log( + listOf( + "Task finished.", + "Class files scanned: $scannedFiles", + "Class files modified: $modifiedFiles", + "Execution time: ${executionMs}ms.", + ).joinToString("\n"), + ) } private fun log(message: String) { @@ -57,17 +72,19 @@ abstract class UnmetaTask : DefaultTask() { fileLogger.appendText(message + System.lineSeparator(), Charsets.UTF_8) } - private fun removeAnnotation(directory: File) { + private fun removeAnnotation(directory: File, basePath: File) { directory.walk() .filter { it.path.contains("classes") && it.path.endsWith(".class") && it.isFile } .forEach { + ++scannedFiles val sourceClassBytes = it.readBytes() val classReader = ClassReader(sourceClassBytes) val classWriter = ClassWriter(classReader, ClassWriter.COMPUTE_MAXS) - val unmetaClassVisitor = UnmetaClassVisitor(it.absolutePath, classWriter) + val unmetaClassVisitor = UnmetaClassVisitor(classWriter) classReader.accept(unmetaClassVisitor, ClassReader.SKIP_DEBUG) if (unmetaClassVisitor.isModified) { - log("Removed @DebugMetadata annotation from ${unmetaClassVisitor.path}") + ++modifiedFiles + log("- Removed @DebugMetadata annotation from ${it.toRelativeString(basePath)}") it.writeBytes(classWriter.toByteArray()) } }