Only prune dead library items from root set
Bug: 150736225
Change-Id: I8cdf0a019f9c897d0673f9790aea0001989b71be
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 7c21891..c4dcb14 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2286,10 +2286,21 @@
return targetedMethods.contains(method);
}
+ public boolean isTypeLive(DexClass clazz) {
+ return clazz.isProgramClass()
+ ? isTypeLive(clazz.asProgramClass())
+ : isNonProgramTypeLive(clazz);
+ }
+
public boolean isTypeLive(DexProgramClass clazz) {
return liveTypes.contains(clazz);
}
+ public boolean isNonProgramTypeLive(DexClass clazz) {
+ assert !clazz.isProgramClass();
+ return liveNonProgramTypes.contains(clazz);
+ }
+
// Package protected due to entry point from worklist.
void markInstanceFieldAsReachable(DexEncodedField encodedField, KeepReason reason) {
DexField field = encodedField.field;
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
index b48c50c..c89dd04 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetBuilder.java
@@ -1475,16 +1475,27 @@
reference -> {
if (reference.isDexField()) {
DexEncodedField definition = definitions.definitionFor(reference.asDexField());
- return definition == null || !enqueuer.isFieldReferenced(definition);
+ if (definition == null) {
+ return true;
+ }
+ DexClass holder = definitions.definitionFor(definition.holder());
+ if (holder.isProgramClass()) {
+ return !enqueuer.isFieldReferenced(definition);
+ }
+ return !enqueuer.isNonProgramTypeLive(holder);
} else if (reference.isDexMethod()) {
DexEncodedMethod definition = definitions.definitionFor(reference.asDexMethod());
- return definition == null
- || !(enqueuer.isMethodLive(definition) || enqueuer.isMethodTargeted(definition));
+ if (definition == null) {
+ return true;
+ }
+ DexClass holder = definitions.definitionFor(definition.holder());
+ if (holder.isProgramClass()) {
+ return !enqueuer.isMethodLive(definition) && !enqueuer.isMethodTargeted(definition);
+ }
+ return !enqueuer.isNonProgramTypeLive(holder);
} else {
DexClass definition = definitions.definitionFor(reference.asDexType());
- return definition == null
- || (definition.isProgramClass()
- && !enqueuer.isTypeLive(definition.asProgramClass()));
+ return definition == null || !enqueuer.isTypeLive(definition);
}
});
}