hoststubgen: Slightly refined stats. To give more accurate statistics, focus only on public non-abstract methods. Shift measurement back to `BaseAdapter`, but only collect stats when operating in the `impl` mode; this ensures we're early enough to accurately count `substitute-from` methods. Also ignore common generated code like Protos, StatsLog, and LogTags, as we'll eventually be handling them all in a more consistent way. Bug: 324417456 Test: atest FrameworksCoreTestsRavenwood Change-Id: I07e0ea4107b27dbfa241c48c9f05def445b78cfe
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt index 06eeb47c..1089f82 100644 --- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt +++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt
@@ -382,7 +382,7 @@ stubOutStream.putNextEntry(newEntry) convertClass(classInternalName, /*forImpl=*/false, bis, stubOutStream, filter, packageRedirector, enableChecker, classes, - errors, stats) + errors, null) stubOutStream.closeEntry() } } @@ -415,7 +415,7 @@ enableChecker: Boolean, classes: ClassNodes, errors: HostStubGenErrors, - stats: HostStubGenStats, + stats: HostStubGenStats?, ) { val cr = ClassReader(input)
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenStats.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenStats.kt index fe4072f..50518e1 100644 --- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenStats.kt +++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/HostStubGenStats.kt
@@ -17,6 +17,7 @@ import com.android.hoststubgen.asm.toHumanReadableClassName import com.android.hoststubgen.filters.FilterPolicyWithReason +import org.objectweb.asm.Opcodes import java.io.PrintWriter open class HostStubGenStats { @@ -28,12 +29,26 @@ private val stats = mutableMapOf<String, Stats>() - fun onVisitPolicyForMethod(fullClassName: String, policy: FilterPolicyWithReason) { + fun onVisitPolicyForMethod(fullClassName: String, methodName: String, descriptor: String, + policy: FilterPolicyWithReason, access: Int) { + // Ignore methods that aren't public + if ((access and Opcodes.ACC_PUBLIC) == 0) return + // Ignore methods that are abstract + if ((access and Opcodes.ACC_ABSTRACT) != 0) return + // Ignore methods where policy isn't relevant if (policy.isIgnoredForStats) return val packageName = resolvePackageName(fullClassName) val className = resolveClassName(fullClassName) + // Ignore methods for certain generated code + if (className.endsWith("Proto") + or className.endsWith("ProtoEnums") + or className.endsWith("LogTags") + or className.endsWith("StatsLog")) { + return + } + val packageStats = stats.getOrPut(packageName) { Stats() } val classStats = packageStats.children.getOrPut(className) { Stats() }
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicyWithReason.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicyWithReason.kt index 53eb5a8..eb03f66 100644 --- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicyWithReason.kt +++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/filters/FilterPolicyWithReason.kt
@@ -72,6 +72,6 @@ || reason.contains("is-enum") || reason.contains("is-synthetic-method") || reason.contains("special-class") - || reason.contains("substitute-from") + || reason.contains("substitute-to") } }
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt index c20aa8b..45e140c 100644 --- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt +++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt
@@ -51,7 +51,7 @@ */ data class Options ( val errors: HostStubGenErrors, - val stats: HostStubGenStats, + val stats: HostStubGenStats?, val enablePreTrace: Boolean, val enablePostTrace: Boolean, val enableNonStubMethodCallDetection: Boolean, @@ -178,6 +178,7 @@ } val p = filter.getPolicyForMethod(currentClassName, name, descriptor) log.d("visitMethod: %s%s [%x] [%s] Policy: %s", name, descriptor, access, signature, p) + options.stats?.onVisitPolicyForMethod(currentClassName, name, descriptor, p, access) log.withIndent { // If it's a substitute-from method, then skip (== remove).
diff --git a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt index beca945..416b782 100644 --- a/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt +++ b/tools/hoststubgen/hoststubgen/src/com/android/hoststubgen/visitors/ImplGeneratingAdapter.kt
@@ -141,11 +141,6 @@ substituted: Boolean, superVisitor: MethodVisitor?, ): MethodVisitor? { - // Record statistics about visiting this method when visible. - if ((access and Opcodes.ACC_PRIVATE) == 0) { - options.stats.onVisitPolicyForMethod(currentClassName, policy) - } - // Inject method log, if needed. var innerVisitor = superVisitor