Allow merging supertype into pinned subtype
If developers wish to do reflection on the super class or interfaces of a given class, it is still possible to prevent the vertical class merging of these super types by pinning the super types themselves.
Note that Proguard eliminates the interface A in the following example although MainActivity is kept.
public class MainActivity extends Activity implements A {
@Override
protected void onCreate(android.os.Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
f();
}
@Override
public void f() {}
}
public interface A {
void f();
}
Change-Id: I82b4700044a5c1ba07218250a544a6453ff4d140
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index c5d2144..222f979 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -77,7 +77,6 @@
ILLEGAL_ACCESS,
NO_SIDE_EFFECTS,
PINNED_SOURCE,
- PINNED_TARGET,
RESOLUTION_FOR_FIELDS_MAY_CHANGE,
RESOLUTION_FOR_METHODS_MAY_CHANGE,
STATIC_INITIALIZERS,
@@ -109,9 +108,6 @@
case PINNED_SOURCE:
message = "it should be kept";
break;
- case PINNED_TARGET:
- message = "its target should be kept";
- break;
case RESOLUTION_FOR_FIELDS_MAY_CHANGE:
message = "it could affect field resolution";
break;
@@ -469,13 +465,6 @@
DexClass targetClass = appInfo.definitionFor(clazz.type.getSingleSubtype());
assert !mergedClasses.containsKey(targetClass.type);
- if (appInfo.isPinned(targetClass.type)) {
- // We have to keep the target class intact, so we cannot merge it.
- if (Log.ENABLED) {
- AbortReason.PINNED_TARGET.printLogMessageForClass(clazz);
- }
- continue;
- }
if (clazz.hasClassInitializer() && targetClass.hasClassInitializer()) {
// TODO(herhut): Handle class initializers.
if (Log.ENABLED) {