Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 422388ff authored by Makoto Onuki's avatar Makoto Onuki Committed by Android (Google) Code Review
Browse files

Merge "[Hoststubgen] Allow to apply policy based on inheritance" into main

parents a6bf9b66 3e12731d
Loading
Loading
Loading
Loading
+76 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.android.hoststubgen.filters

import com.android.hoststubgen.asm.ClassNodes
import com.android.hoststubgen.asm.toJvmClassName

/**
 * Filter to apply a policy to classes extending or implementing a class,
 * either directly or indirectly. (with a breadth first search.)
 *
 * The policy won't apply to the super class itself.
 */
class SubclassFilter(
        private val classes: ClassNodes,
        fallback: OutputFilter
) : DelegatingFilter(fallback) {
    private val mPolicies: MutableMap<String, FilterPolicyWithReason> = mutableMapOf()

    /**
     * Add a policy to all classes extending or implementing a class, either directly or indirectly.
     */
    fun addPolicy(superClassName: String, policy: FilterPolicyWithReason) {
        mPolicies[superClassName.toJvmClassName()] = policy
    }

    override fun getPolicyForClass(className: String): FilterPolicyWithReason {
        return findPolicyForClass(className) ?: super.getPolicyForClass(className)
    }

    /**
     * Find a policy for a class with a breadth-first search.
     */
    private fun findPolicyForClass(className: String): FilterPolicyWithReason? {
        val cn = classes.findClass(className) ?: return null

        if (cn.superName == null) {
            return null
        }
        // First, check the direct super class / interfaces.
        mPolicies[cn.superName]?.let { policy ->
            return policy
        }
        cn.interfaces?.forEach { iface ->
            mPolicies[iface]?.let { policy ->
                return policy
            }
        }

        // Then recurse.
        cn.superName?.let { superName ->
            findPolicyForClass(superName)?.let { policy ->
                return policy
            }
        }
        cn.interfaces?.forEach { iface ->
            findPolicyForClass(iface)?.let { policy ->
                return policy
            }
        }
        return null
    }
}
 No newline at end of file
+21 −3
Original line number Diff line number Diff line
@@ -58,7 +58,8 @@ fun createFilterFromTextPolicyFile(
        ): OutputFilter {
    log.i("Loading offloaded annotations from $filename ...")
    log.withIndent {
        val imf = InMemoryOutputFilter(classes, fallback)
        val subclassFilter = SubclassFilter(classes, fallback)
        val imf = InMemoryOutputFilter(classes, subclassFilter)

        var lineNo = 0

@@ -94,6 +95,10 @@ fun createFilterFromTextPolicyFile(
                            }
                            className = fields[1]

                            // superClass is set when the class name starts with a "*".
                            val superClass = resolveExtendingClass(className)

                            // :aidl, etc?
                            val classType = resolveSpecialClass(className)

                            if (fields[2].startsWith("!")) {
@@ -124,8 +129,14 @@ fun createFilterFromTextPolicyFile(
                                when (classType) {
                                    SpecialClass.NotSpecial -> {
                                        // TODO: Duplicate check, etc
                                        if (superClass == null) {
                                            imf.setPolicyForClass(
                                                className, policy.withReason(FILTER_REASON))
                                                className, policy.withReason(FILTER_REASON)
                                            )
                                        } else {
                                            subclassFilter.addPolicy(superClass,
                                                policy.withReason("extends $superClass"))
                                        }
                                    }
                                    SpecialClass.Aidl -> {
                                        if (aidlPolicy != null) {
@@ -243,6 +254,13 @@ private fun resolveSpecialClass(className: String): SpecialClass {
    throw ParseException("Invalid special class name \"$className\"")
}

private fun resolveExtendingClass(className: String): String? {
    if (!className.startsWith("*")) {
        return null
    }
    return className.substring(1)
}

private fun parsePolicy(s: String): FilterPolicy {
    return when (s.lowercase()) {
        "s", "stub" -> FilterPolicy.Stub
+561 −0

File changed.

Preview size limit exceeded, changes collapsed.

+160 −0
Original line number Diff line number Diff line
@@ -2055,6 +2055,166 @@ RuntimeVisibleAnnotations:
RuntimeInvisibleAnnotations:
  x: #x()
    android.hosttest.annotation.HostSideTestWholeClassStub
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C1.class
  Compiled from "C1.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C1
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C2.class
  Compiled from "C2.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C2 extends com.android.hoststubgen.test.tinyframework.subclasstest.C1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C2
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C1
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C3.class
  Compiled from "C3.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C3 extends com.android.hoststubgen.test.tinyframework.subclasstest.C2
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C3
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C2
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/CA.class
  Compiled from "CA.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.CA
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/CA
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "CA.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/CB.class
  Compiled from "CB.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.CB
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/CB
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "CB.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I1.class
  Compiled from "I1.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I1
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I1
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I2.class
  Compiled from "I2.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I2 extends com.android.hoststubgen.test.tinyframework.subclasstest.I1
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I2
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I3.class
  Compiled from "I3.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I3 extends com.android.hoststubgen.test.tinyframework.subclasstest.I2
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I3
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/IA.class
  Compiled from "IA.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.IA
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/IA
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "IA.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/IB.class
  Compiled from "IB.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.IB
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/IB
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "IB.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/unsupported/UnsupportedClass.class
  Compiled from "UnsupportedClass.java"
public class com.unsupported.UnsupportedClass
+258 −0
Original line number Diff line number Diff line
@@ -3371,6 +3371,264 @@ RuntimeVisibleAnnotations:
RuntimeInvisibleAnnotations:
  x: #x()
    android.hosttest.annotation.HostSideTestWholeClassStub
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C1.class
  Compiled from "C1.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C1
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C2.class
  Compiled from "C2.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C2 extends com.android.hoststubgen.test.tinyframework.subclasstest.C1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C2
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C1
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/C3.class
  Compiled from "C3.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.C3 extends com.android.hoststubgen.test.tinyframework.subclasstest.C2
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/C3
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C2
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "C3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/CA.class
  Compiled from "CA.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.CA
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/CA
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "CA.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/CB.class
  Compiled from "CB.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.CB
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/CB
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "CB.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_C1.class
  Compiled from "Class_C1.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_C1 extends com.android.hoststubgen.test.tinyframework.subclasstest.C1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_C1
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C1
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_C1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_C2.class
  Compiled from "Class_C2.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_C2 extends com.android.hoststubgen.test.tinyframework.subclasstest.C2
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_C2
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C2
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_C2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_C3.class
  Compiled from "Class_C3.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_C3 extends com.android.hoststubgen.test.tinyframework.subclasstest.C3
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_C3
  super_class: #x                         // com/android/hoststubgen/test/tinyframework/subclasstest/C3
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_C3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_I1.class
  Compiled from "Class_I1.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_I1 implements com.android.hoststubgen.test.tinyframework.subclasstest.I1
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_I1
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_I1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_I1_IA.class
  Compiled from "Class_I1_IA.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_I1_IA implements com.android.hoststubgen.test.tinyframework.subclasstest.I1,com.android.hoststubgen.test.tinyframework.subclasstest.IA
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_I1_IA
  super_class: #x                         // java/lang/Object
  interfaces: 2, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_I1_IA.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_I2.class
  Compiled from "Class_I2.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_I2 implements com.android.hoststubgen.test.tinyframework.subclasstest.I2
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_I2
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_I2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/Class_I3.class
  Compiled from "Class_I3.java"
public class com.android.hoststubgen.test.tinyframework.subclasstest.Class_I3 implements com.android.hoststubgen.test.tinyframework.subclasstest.I3
  minor version: 0
  major version: 61
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/Class_I3
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "Class_I3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I1.class
  Compiled from "I1.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I1
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I1
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I1.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I2.class
  Compiled from "I2.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I2 extends com.android.hoststubgen.test.tinyframework.subclasstest.I1
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I2
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I2.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/I3.class
  Compiled from "I3.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.I3 extends com.android.hoststubgen.test.tinyframework.subclasstest.I2
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/I3
  super_class: #x                         // java/lang/Object
  interfaces: 1, fields: 0, methods: 0, attributes: 2
}
SourceFile: "I3.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/IA.class
  Compiled from "IA.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.IA
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/IA
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "IA.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/android/hoststubgen/test/tinyframework/subclasstest/IB.class
  Compiled from "IB.java"
public interface com.android.hoststubgen.test.tinyframework.subclasstest.IB
  minor version: 0
  major version: 61
  flags: (0x0601) ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
  this_class: #x                          // com/android/hoststubgen/test/tinyframework/subclasstest/IB
  super_class: #x                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 0, attributes: 2
}
SourceFile: "IB.java"
RuntimeVisibleAnnotations:
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInStub
  x: #x()
    com.android.hoststubgen.hosthelper.HostStubGenKeptInImpl
## Class: com/supported/UnsupportedClass.class
  Compiled from "UnsupportedClass.java"
public class com.supported.UnsupportedClass
Loading