Loading ravenwood/texts/ravenwood-standard-options.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -5,6 +5,8 @@ # Keep all classes / methods / fields, but make the methods throw. # Keep all classes / methods / fields, but make the methods throw. --default-throw --default-throw --delete-finals # Uncomment below lines to enable each feature. # Uncomment below lines to enable each feature. #--default-method-call-hook #--default-method-call-hook Loading ravenwood/tools/hoststubgen/hoststubgen-standard-options.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -2,6 +2,8 @@ --debug --debug --delete-finals # Uncomment below lines to enable each feature. # Uncomment below lines to enable each feature. #--default-method-call-hook #--default-method-call-hook Loading ravenwood/tools/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -411,6 +411,8 @@ class HostStubGen(val options: HostStubGenOptions) { stats = stats, stats = stats, enablePreTrace = options.enablePreTrace.get, enablePreTrace = options.enablePreTrace.get, enablePostTrace = options.enablePostTrace.get, enablePostTrace = options.enablePostTrace.get, deleteClassFinals = options.deleteFinals.get, deleteMethodFinals = options.deleteFinals.get, ) ) outVisitor = BaseAdapter.getVisitor( outVisitor = BaseAdapter.getVisitor( classInternalName, classes, outVisitor, filter, classInternalName, classes, outVisitor, filter, Loading ravenwood/tools/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,8 @@ class HostStubGenOptions( var cleanUpOnError: SetOnce<Boolean> = SetOnce(false), var cleanUpOnError: SetOnce<Boolean> = SetOnce(false), var deleteFinals: SetOnce<Boolean> = SetOnce(false), var enableClassChecker: SetOnce<Boolean> = SetOnce(false), var enableClassChecker: SetOnce<Boolean> = SetOnce(false), var enablePreTrace: SetOnce<Boolean> = SetOnce(false), var enablePreTrace: SetOnce<Boolean> = SetOnce(false), var enablePostTrace: SetOnce<Boolean> = SetOnce(false), var enablePostTrace: SetOnce<Boolean> = SetOnce(false), Loading Loading @@ -218,6 +220,8 @@ class HostStubGenOptions( "--gen-keep-all-file" -> "--gen-keep-all-file" -> ret.inputJarAsKeepAllFile.set(nextArg()) ret.inputJarAsKeepAllFile.set(nextArg()) "--delete-finals" -> ret.deleteFinals.set(true) // Following options are for debugging. // Following options are for debugging. "--enable-class-checker" -> ret.enableClassChecker.set(true) "--enable-class-checker" -> ret.enableClassChecker.set(true) "--no-class-checker" -> ret.enableClassChecker.set(false) "--no-class-checker" -> ret.enableClassChecker.set(false) Loading Loading @@ -293,6 +297,7 @@ class HostStubGenOptions( defaultMethodCallHook=$defaultMethodCallHook, defaultMethodCallHook=$defaultMethodCallHook, policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()}, policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()}, defaultPolicy=$defaultPolicy, defaultPolicy=$defaultPolicy, deleteFinals=$deleteFinals, cleanUpOnError=$cleanUpOnError, cleanUpOnError=$cleanUpOnError, enableClassChecker=$enableClassChecker, enableClassChecker=$enableClassChecker, enablePreTrace=$enablePreTrace, enablePreTrace=$enablePreTrace, Loading ravenwood/tools/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt +31 −4 Original line number Original line Diff line number Diff line Loading @@ -50,7 +50,13 @@ abstract class BaseAdapter( val errors: HostStubGenErrors, val errors: HostStubGenErrors, val stats: HostStubGenStats?, val stats: HostStubGenStats?, val enablePreTrace: Boolean, val enablePreTrace: Boolean, val enablePostTrace: Boolean val enablePostTrace: Boolean, val deleteClassFinals: Boolean, val deleteMethodFinals: Boolean, // We don't remove finals from fields, because final fields have a stronger memory // guarantee than non-final fields, see: // https://docs.oracle.com/javase/specs/jls/se22/html/jls-17.html#jls-17.5 // i.e. changing a final field to non-final _could_ result in different behavior. ) ) protected lateinit var currentPackageName: String protected lateinit var currentPackageName: String Loading @@ -58,14 +64,33 @@ abstract class BaseAdapter( protected var redirectionClass: String? = null protected var redirectionClass: String? = null protected lateinit var classPolicy: FilterPolicyWithReason protected lateinit var classPolicy: FilterPolicyWithReason private fun isEnum(access: Int): Boolean { return (access and Opcodes.ACC_ENUM) != 0 } protected fun modifyClassAccess(access: Int): Int { if (options.deleteClassFinals && !isEnum(access)) { return access and Opcodes.ACC_FINAL.inv() } return access } protected fun modifyMethodAccess(access: Int): Int { if (options.deleteMethodFinals) { return access and Opcodes.ACC_FINAL.inv() } return access } override fun visit( override fun visit( version: Int, version: Int, access: Int, origAccess: Int, name: String, name: String, signature: String?, signature: String?, superName: String?, superName: String?, interfaces: Array<String>, interfaces: Array<String>, ) { ) { val access = modifyClassAccess(origAccess) super.visit(version, access, name, signature, superName, interfaces) super.visit(version, access, name, signature, superName, interfaces) currentClassName = name currentClassName = name currentPackageName = getPackageNameFromFullClassName(name) currentPackageName = getPackageNameFromFullClassName(name) Loading Loading @@ -130,13 +155,14 @@ abstract class BaseAdapter( } } } } override fun visitMethod( final override fun visitMethod( access: Int, origAccess: Int, name: String, name: String, descriptor: String, descriptor: String, signature: String?, signature: String?, exceptions: Array<String>?, exceptions: Array<String>?, ): MethodVisitor? { ): MethodVisitor? { val access = modifyMethodAccess(origAccess) if (skipMemberModificationNestCount > 0) { if (skipMemberModificationNestCount > 0) { return super.visitMethod(access, name, descriptor, signature, exceptions) return super.visitMethod(access, name, descriptor, signature, exceptions) } } Loading Loading @@ -176,6 +202,7 @@ abstract class BaseAdapter( if (newAccess == NOT_COMPATIBLE) { if (newAccess == NOT_COMPATIBLE) { return null return null } } newAccess = modifyMethodAccess(newAccess) log.v( log.v( "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor, "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor, Loading Loading
ravenwood/texts/ravenwood-standard-options.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -5,6 +5,8 @@ # Keep all classes / methods / fields, but make the methods throw. # Keep all classes / methods / fields, but make the methods throw. --default-throw --default-throw --delete-finals # Uncomment below lines to enable each feature. # Uncomment below lines to enable each feature. #--default-method-call-hook #--default-method-call-hook Loading
ravenwood/tools/hoststubgen/hoststubgen-standard-options.txt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -2,6 +2,8 @@ --debug --debug --delete-finals # Uncomment below lines to enable each feature. # Uncomment below lines to enable each feature. #--default-method-call-hook #--default-method-call-hook Loading
ravenwood/tools/hoststubgen/src/com/android/hoststubgen/HostStubGen.kt +2 −0 Original line number Original line Diff line number Diff line Loading @@ -411,6 +411,8 @@ class HostStubGen(val options: HostStubGenOptions) { stats = stats, stats = stats, enablePreTrace = options.enablePreTrace.get, enablePreTrace = options.enablePreTrace.get, enablePostTrace = options.enablePostTrace.get, enablePostTrace = options.enablePostTrace.get, deleteClassFinals = options.deleteFinals.get, deleteMethodFinals = options.deleteFinals.get, ) ) outVisitor = BaseAdapter.getVisitor( outVisitor = BaseAdapter.getVisitor( classInternalName, classes, outVisitor, filter, classInternalName, classes, outVisitor, filter, Loading
ravenwood/tools/hoststubgen/src/com/android/hoststubgen/HostStubGenOptions.kt +5 −0 Original line number Original line Diff line number Diff line Loading @@ -106,6 +106,8 @@ class HostStubGenOptions( var cleanUpOnError: SetOnce<Boolean> = SetOnce(false), var cleanUpOnError: SetOnce<Boolean> = SetOnce(false), var deleteFinals: SetOnce<Boolean> = SetOnce(false), var enableClassChecker: SetOnce<Boolean> = SetOnce(false), var enableClassChecker: SetOnce<Boolean> = SetOnce(false), var enablePreTrace: SetOnce<Boolean> = SetOnce(false), var enablePreTrace: SetOnce<Boolean> = SetOnce(false), var enablePostTrace: SetOnce<Boolean> = SetOnce(false), var enablePostTrace: SetOnce<Boolean> = SetOnce(false), Loading Loading @@ -218,6 +220,8 @@ class HostStubGenOptions( "--gen-keep-all-file" -> "--gen-keep-all-file" -> ret.inputJarAsKeepAllFile.set(nextArg()) ret.inputJarAsKeepAllFile.set(nextArg()) "--delete-finals" -> ret.deleteFinals.set(true) // Following options are for debugging. // Following options are for debugging. "--enable-class-checker" -> ret.enableClassChecker.set(true) "--enable-class-checker" -> ret.enableClassChecker.set(true) "--no-class-checker" -> ret.enableClassChecker.set(false) "--no-class-checker" -> ret.enableClassChecker.set(false) Loading Loading @@ -293,6 +297,7 @@ class HostStubGenOptions( defaultMethodCallHook=$defaultMethodCallHook, defaultMethodCallHook=$defaultMethodCallHook, policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()}, policyOverrideFiles=${policyOverrideFiles.toTypedArray().contentToString()}, defaultPolicy=$defaultPolicy, defaultPolicy=$defaultPolicy, deleteFinals=$deleteFinals, cleanUpOnError=$cleanUpOnError, cleanUpOnError=$cleanUpOnError, enableClassChecker=$enableClassChecker, enableClassChecker=$enableClassChecker, enablePreTrace=$enablePreTrace, enablePreTrace=$enablePreTrace, Loading
ravenwood/tools/hoststubgen/src/com/android/hoststubgen/visitors/BaseAdapter.kt +31 −4 Original line number Original line Diff line number Diff line Loading @@ -50,7 +50,13 @@ abstract class BaseAdapter( val errors: HostStubGenErrors, val errors: HostStubGenErrors, val stats: HostStubGenStats?, val stats: HostStubGenStats?, val enablePreTrace: Boolean, val enablePreTrace: Boolean, val enablePostTrace: Boolean val enablePostTrace: Boolean, val deleteClassFinals: Boolean, val deleteMethodFinals: Boolean, // We don't remove finals from fields, because final fields have a stronger memory // guarantee than non-final fields, see: // https://docs.oracle.com/javase/specs/jls/se22/html/jls-17.html#jls-17.5 // i.e. changing a final field to non-final _could_ result in different behavior. ) ) protected lateinit var currentPackageName: String protected lateinit var currentPackageName: String Loading @@ -58,14 +64,33 @@ abstract class BaseAdapter( protected var redirectionClass: String? = null protected var redirectionClass: String? = null protected lateinit var classPolicy: FilterPolicyWithReason protected lateinit var classPolicy: FilterPolicyWithReason private fun isEnum(access: Int): Boolean { return (access and Opcodes.ACC_ENUM) != 0 } protected fun modifyClassAccess(access: Int): Int { if (options.deleteClassFinals && !isEnum(access)) { return access and Opcodes.ACC_FINAL.inv() } return access } protected fun modifyMethodAccess(access: Int): Int { if (options.deleteMethodFinals) { return access and Opcodes.ACC_FINAL.inv() } return access } override fun visit( override fun visit( version: Int, version: Int, access: Int, origAccess: Int, name: String, name: String, signature: String?, signature: String?, superName: String?, superName: String?, interfaces: Array<String>, interfaces: Array<String>, ) { ) { val access = modifyClassAccess(origAccess) super.visit(version, access, name, signature, superName, interfaces) super.visit(version, access, name, signature, superName, interfaces) currentClassName = name currentClassName = name currentPackageName = getPackageNameFromFullClassName(name) currentPackageName = getPackageNameFromFullClassName(name) Loading Loading @@ -130,13 +155,14 @@ abstract class BaseAdapter( } } } } override fun visitMethod( final override fun visitMethod( access: Int, origAccess: Int, name: String, name: String, descriptor: String, descriptor: String, signature: String?, signature: String?, exceptions: Array<String>?, exceptions: Array<String>?, ): MethodVisitor? { ): MethodVisitor? { val access = modifyMethodAccess(origAccess) if (skipMemberModificationNestCount > 0) { if (skipMemberModificationNestCount > 0) { return super.visitMethod(access, name, descriptor, signature, exceptions) return super.visitMethod(access, name, descriptor, signature, exceptions) } } Loading Loading @@ -176,6 +202,7 @@ abstract class BaseAdapter( if (newAccess == NOT_COMPATIBLE) { if (newAccess == NOT_COMPATIBLE) { return null return null } } newAccess = modifyMethodAccess(newAccess) log.v( log.v( "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor, "Emitting %s.%s%s as %s %s", currentClassName, name, descriptor, Loading