Allow using directive for proto shrinking

Change-Id: Ia94489bd74e22a5b87f94c75ecdb8890190bd732
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
index 8b86596..3598fd8 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfiguration.java
@@ -70,6 +70,7 @@
     private boolean keepRuleSynthesisForRecompilation = false;
     private boolean configurationDebugging = false;
     private boolean dontUseMixedCaseClassnames = false;
+    private boolean protoShrinking = false;
     private int maxRemovedAndroidLogLevel = 1;
     private ProguardKeepRule keepAllRule;
 
@@ -290,6 +291,10 @@
       this.dontUseMixedCaseClassnames = dontUseMixedCaseClassnames;
     }
 
+    public void enableProtoShrinking() {
+      protoShrinking = true;
+    }
+
     public int getMaxRemovedAndroidLogLevel() {
       return maxRemovedAndroidLogLevel;
     }
@@ -357,6 +362,7 @@
               keepDirectories.build(),
               configurationDebugging,
               dontUseMixedCaseClassnames,
+              protoShrinking,
               maxRemovedAndroidLogLevel,
               keepAllRule);
 
@@ -431,6 +437,7 @@
   private final ProguardPathFilter keepDirectories;
   private final boolean configurationDebugging;
   private final boolean dontUseMixedCaseClassnames;
+  private final boolean protoShrinking;
   private final int maxRemovedAndroidLogLevel;
   private final ProguardKeepRule keepAllRule;
 
@@ -473,6 +480,7 @@
       ProguardPathFilter keepDirectories,
       boolean configurationDebugging,
       boolean dontUseMixedCaseClassnames,
+      boolean protoShrinking,
       int maxRemovedAndroidLogLevel,
       ProguardKeepRule keepAllRule) {
     this.parsedConfiguration = parsedConfiguration;
@@ -513,6 +521,7 @@
     this.keepDirectories = keepDirectories;
     this.configurationDebugging = configurationDebugging;
     this.dontUseMixedCaseClassnames = dontUseMixedCaseClassnames;
+    this.protoShrinking = protoShrinking;
     this.maxRemovedAndroidLogLevel = maxRemovedAndroidLogLevel;
     this.keepAllRule = keepAllRule;
   }
@@ -681,6 +690,10 @@
     return dontUseMixedCaseClassnames;
   }
 
+  public boolean isProtoShrinkingEnabled() {
+    return protoShrinking;
+  }
+
   public int getMaxRemovedAndroidLogLevel() {
     return maxRemovedAndroidLogLevel;
   }
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index f1a2b0f..7e9ed91 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -71,7 +71,6 @@
       // TODO(b/62524562): we may support this later.
       "mergeinterfacesaggressively",
       "android",
-      "shrinkunusedprotofields",
       "allowruntypeandignoreoptimizationpasses",
       "dontshrinkduringoptimization",
       "convert_proto_enum_to_string");
@@ -286,6 +285,8 @@
         if (isOptionalArgumentGiven()) {
           configurationBuilder.setPrintUsageFile(parseFileName(false));
         }
+      } else if (acceptString("shrinkunusedprotofields")) {
+        configurationBuilder.enableProtoShrinking();
       } else if (acceptString("verbose")) {
         configurationBuilder.setVerbose(true);
       } else if (acceptString("ignorewarnings")) {
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 173d169..c9a9165 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -148,6 +148,19 @@
       disableAllOptimizations();
     }
     configurationDebugging = proguardConfiguration.isConfigurationDebugging();
+    if (proguardConfiguration.isProtoShrinkingEnabled()) {
+      enableProtoShrinking();
+    }
+  }
+
+  void enableProtoShrinking() {
+    applyInliningToInlinee = true;
+    enableFieldBitAccessAnalysis = true;
+    enableStringSwitchConversion = true;
+    protoShrinking.enableGeneratedMessageLiteShrinking = true;
+    protoShrinking.enableGeneratedMessageLiteBuilderShrinking = true;
+    protoShrinking.enableGeneratedExtensionRegistryShrinking = true;
+    protoShrinking.traverseOneOfAndRepeatedProtoFields = false;
   }
 
   void disableAllOptimizations() {
@@ -997,17 +1010,10 @@
 
   public static class ProtoShrinkingOptions {
 
-    public boolean enableGeneratedExtensionRegistryShrinking =
-        System.getProperty("com.android.tools.r8.generatedExtensionRegistryShrinking") != null;
-
-    public boolean enableGeneratedMessageLiteShrinking =
-        System.getProperty("com.android.tools.r8.generatedMessageLiteShrinking") != null;
-
-    public boolean enableGeneratedMessageLiteBuilderShrinking =
-        System.getProperty("com.android.tools.r8.generatedMessageLiteBuilderShrinking") != null;
-
-    public boolean traverseOneOfAndRepeatedProtoFields =
-        System.getProperty("com.android.tools.r8.traverseOneOfAndRepeatedProtoFields") == null;
+    public boolean enableGeneratedExtensionRegistryShrinking = false;
+    public boolean enableGeneratedMessageLiteShrinking = false;
+    public boolean enableGeneratedMessageLiteBuilderShrinking = false;
+    public boolean traverseOneOfAndRepeatedProtoFields = true;
 
     public boolean isProtoShrinkingEnabled() {
       return enableGeneratedExtensionRegistryShrinking
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index f847f34..1031845 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -427,6 +427,10 @@
     return self();
   }
 
+  public T enableProtoShrinking() {
+    return addKeepRules("-shrinkunusedprotofields");
+  }
+
   public T enableSideEffectAnnotations() {
     if (!enableSideEffectAnnotations) {
       enableSideEffectAnnotations = true;
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1419TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1419TreeShakeJarVerificationTest.java
index f20a827..48acfdb 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1419TreeShakeJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1419TreeShakeJarVerificationTest.java
@@ -46,23 +46,6 @@
     R8TestCompileResult compileResult =
         testForR8(parameters.getBackend())
             .addKeepRuleFiles(getKeepRuleFiles())
-            .addOptionsModification(
-                options -> {
-                  assert !options.enableFieldBitAccessAnalysis;
-                  options.enableFieldBitAccessAnalysis = true;
-
-                  assert !options.protoShrinking().enableGeneratedExtensionRegistryShrinking;
-                  options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-
-                  assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-                  options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-
-                  assert options.protoShrinking().traverseOneOfAndRepeatedProtoFields;
-                  options.protoShrinking().traverseOneOfAndRepeatedProtoFields = false;
-
-                  assert !options.enableStringSwitchConversion;
-                  options.enableStringSwitchConversion = true;
-                })
             .allowUnusedProguardConfigurationRules()
             .compile();
 
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1444TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1444TreeShakeJarVerificationTest.java
index ab63ba7..b2498b5 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1444TreeShakeJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1444TreeShakeJarVerificationTest.java
@@ -59,26 +59,6 @@
             .addLibraryFiles(librarySanitizer.getSanitizedLibrary())
             .addKeepRuleFiles(getKeepRuleFiles())
             .addMainDexRuleFiles(getMainDexRuleFiles())
-            .addOptionsModification(
-                options -> {
-                  assert !options.applyInliningToInlinee;
-                  options.applyInliningToInlinee = true;
-
-                  assert !options.enableFieldBitAccessAnalysis;
-                  options.enableFieldBitAccessAnalysis = true;
-
-                  assert !options.protoShrinking().enableGeneratedExtensionRegistryShrinking;
-                  options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-
-                  assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-                  options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-
-                  assert options.protoShrinking().traverseOneOfAndRepeatedProtoFields;
-                  options.protoShrinking().traverseOneOfAndRepeatedProtoFields = false;
-
-                  assert !options.enableStringSwitchConversion;
-                  options.enableStringSwitchConversion = true;
-                })
             .setMinApi(AndroidApiLevel.H_MR2)
             .allowDiagnosticMessages()
             .allowUnusedProguardConfigurationRules()
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java
index 01120c8..e63b126 100644
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/YouTubeV1508TreeShakeJarVerificationTest.java
@@ -59,26 +59,6 @@
             .addLibraryFiles(librarySanitizer.getSanitizedLibrary())
             .addKeepRuleFiles(getKeepRuleFiles())
             .addMainDexRuleFiles(getMainDexRuleFiles())
-            .addOptionsModification(
-                options -> {
-                  assert !options.applyInliningToInlinee;
-                  options.applyInliningToInlinee = true;
-
-                  assert !options.enableFieldBitAccessAnalysis;
-                  options.enableFieldBitAccessAnalysis = true;
-
-                  assert !options.protoShrinking().enableGeneratedExtensionRegistryShrinking;
-                  options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-
-                  assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-                  options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-
-                  assert options.protoShrinking().traverseOneOfAndRepeatedProtoFields;
-                  options.protoShrinking().traverseOneOfAndRepeatedProtoFields = false;
-
-                  assert !options.enableStringSwitchConversion;
-                  options.enableStringSwitchConversion = true;
-                })
             .allowCheckDiscardedErrors()
             .allowDiagnosticMessages()
             .allowUnusedProguardConfigurationRules()
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
index 0788985..23dc574 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
@@ -72,30 +72,11 @@
             .addProgramFiles(PROGRAM_FILES)
             .addKeepMainRules(mains)
             .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
-            .addOptionsModification(
-                options -> {
-                  assert !options.applyInliningToInlinee;
-                  options.applyInliningToInlinee = true;
-
-                  assert !options.enableFieldBitAccessAnalysis;
-                  options.enableFieldBitAccessAnalysis = true;
-
-                  assert !options.protoShrinking().enableGeneratedExtensionRegistryShrinking;
-                  options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-
-                  assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-                  options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-
-                  assert !options.protoShrinking().enableGeneratedMessageLiteBuilderShrinking;
-                  options.protoShrinking().enableGeneratedMessageLiteBuilderShrinking = true;
-
-                  assert !options.enableStringSwitchConversion;
-                  options.enableStringSwitchConversion = true;
-                })
             .allowAccessModification()
             .allowDiagnosticMessages()
             .allowUnusedProguardConfigurationRules()
             .enableInliningAnnotations()
+            .enableProtoShrinking()
             .setMinApi(parameters.getApiLevel())
             .compile()
             .assertAllInfoMessagesMatch(
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
index 1473e03..cd743a9 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
@@ -82,17 +82,10 @@
             .addKeepMainRule("proto2.TestClass")
             .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
             .addKeepRules(allGeneratedMessageLiteSubtypesAreInstantiatedRule())
-            .addOptionsModification(
-                options -> {
-                  options.enableFieldBitAccessAnalysis = true;
-                  options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-                  options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-                  options.protoShrinking().enableGeneratedMessageLiteBuilderShrinking = true;
-                  options.enableStringSwitchConversion = true;
-                })
             .allowAccessModification(allowAccessModification)
             .allowDiagnosticMessages()
             .allowUnusedProguardConfigurationRules()
+            .enableProtoShrinking()
             .minification(enableMinification)
             .setMinApi(parameters.getApiLevel())
             .compile()
@@ -357,15 +350,10 @@
         .addKeepRules(keepAllProtosRule())
         // Retain the signature of dynamicMethod() and newMessageInfo().
         .addKeepRules(keepDynamicMethodSignatureRule(), keepNewMessageInfoSignatureRule())
-        // Enable the dynamicMethod() rewritings.
-        .addOptionsModification(
-            options -> {
-              assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-              options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-            })
         .allowAccessModification(allowAccessModification)
         .allowDiagnosticMessages()
         .allowUnusedProguardConfigurationRules()
+        .enableProtoShrinking()
         .minification(enableMinification)
         .setMinApi(parameters.getApiLevel())
         .compile()
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
index 7a261ff..429c340 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
@@ -58,17 +58,10 @@
         .addProgramFiles(PROGRAM_FILES)
         .addKeepMainRule("proto3.TestClass")
         .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
-        .addOptionsModification(
-            options -> {
-              options.enableFieldBitAccessAnalysis = true;
-              options.protoShrinking().enableGeneratedExtensionRegistryShrinking = true;
-              options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-              options.protoShrinking().enableGeneratedMessageLiteBuilderShrinking = true;
-              options.enableStringSwitchConversion = true;
-            })
         .allowAccessModification(allowAccessModification)
         .allowDiagnosticMessages()
         .allowUnusedProguardConfigurationRules()
+        .enableProtoShrinking()
         .minification(enableMinification)
         .setMinApi(parameters.getApiLevel())
         .compile()
@@ -113,15 +106,10 @@
         .addKeepRules(keepAllProtosRule())
         // Retain the signature of dynamicMethod() and newMessageInfo().
         .addKeepRules(keepDynamicMethodSignatureRule(), keepNewMessageInfoSignatureRule())
-        // Enable the dynamicMethod() rewritings.
-        .addOptionsModification(
-            options -> {
-              assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-              options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-            })
         .allowAccessModification(allowAccessModification)
         .allowDiagnosticMessages()
         .allowUnusedProguardConfigurationRules()
+        .enableProtoShrinking()
         .minification(enableMinification)
         .setMinApi(parameters.getApiLevel())
         .compile()
diff --git a/src/test/java/com/android/tools/r8/internal/proto/YouTubeProtoRewritingTest.java b/src/test/java/com/android/tools/r8/internal/proto/YouTubeProtoRewritingTest.java
index cff1e45..6088600 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/YouTubeProtoRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/YouTubeProtoRewritingTest.java
@@ -46,12 +46,6 @@
         .addKeepRules(keepAllProtosRule())
         // Retain the signature of dynamicMethod() and newMessageInfo().
         .addKeepRules(keepDynamicMethodSignatureRule(), keepNewMessageInfoSignatureRule())
-        // Enable the dynamicMethod() rewritings.
-        .addOptionsModification(
-            options -> {
-              assert !options.protoShrinking().enableGeneratedMessageLiteShrinking;
-              options.protoShrinking().enableGeneratedMessageLiteShrinking = true;
-            })
         .allowUnusedProguardConfigurationRules()
         .compile()
         .inspect(
diff --git a/tools/run_on_app.py b/tools/run_on_app.py
index b96ccf4..ae8001a 100755
--- a/tools/run_on_app.py
+++ b/tools/run_on_app.py
@@ -517,14 +517,6 @@
         args.extend(['--main-dex-rules', rules])
     if 'allow-type-errors' in values:
       extra_args.append('-Dcom.android.tools.r8.allowTypeErrors=1')
-    if 'proto-shrinking' in values:
-      extra_args.append('-Dcom.android.tools.r8.applyInliningToInlinee=1')
-      extra_args.append('-Dcom.android.tools.r8.fieldBitAccessAnalysis=1')
-      extra_args.append('-Dcom.android.tools.r8.generatedExtensionRegistryShrinking=1')
-      extra_args.append('-Dcom.android.tools.r8.generatedMessageLiteShrinking=1')
-      extra_args.append('-Dcom.android.tools.r8.generatedMessageLiteBuilderShrinking=1')
-      extra_args.append('-Dcom.android.tools.r8.stringSwitchConversion=1')
-      extra_args.append('-Dcom.android.tools.r8.traverseOneOfAndRepeatedProtoFields=0')
 
   if not options.no_libraries:
     for lib in libraries:
diff --git a/tools/youtube_data.py b/tools/youtube_data.py
index 226ad4c..828e04b 100644
--- a/tools/youtube_data.py
+++ b/tools/youtube_data.py
@@ -141,7 +141,6 @@
       'pgconf': [
           '%s_proguard.config' % V14_19_PREFIX,
           '%s/proguardsettings/YouTubeRelease_proguard.config' % utils.THIRD_PARTY],
-      'proto-shrinking': 1,
       'maindexrules' : [
           os.path.join(V14_19_BASE, 'mainDexClasses.rules'),
           os.path.join(V14_19_BASE, 'main-dex-classes-release-optimized.pgcfg'),
@@ -171,7 +170,6 @@
       'pgconf': [
           '%s_proguard.config' % V14_44_PREFIX,
           '%s/proguardsettings/YouTubeRelease_proguard.config' % utils.THIRD_PARTY],
-      'proto-shrinking': 1,
       'maindexrules' : [
           os.path.join(V14_44_BASE, 'mainDexClasses.rules'),
           os.path.join(V14_44_BASE, 'main-dex-classes-release-optimized.pgcfg'),
@@ -202,7 +200,6 @@
           '%s_proguard.config' % V15_08_PREFIX,
           '%s_proto_safety.pgcfg' % V15_08_PREFIX,
           '%s/proguardsettings/YouTubeRelease_proguard.config' % utils.THIRD_PARTY],
-      'proto-shrinking': 1,
       'maindexrules' : [
           os.path.join(V15_08_BASE, 'mainDexClasses.rules'),
           os.path.join(V15_08_BASE, 'main-dex-classes-release-optimized.pgcfg'),
@@ -232,7 +229,6 @@
       'pgconf': [
           '%s_proguard.config' % V15_09_PREFIX,
           '%s/proguardsettings/YouTubeRelease_proguard.config' % utils.THIRD_PARTY],
-      'proto-shrinking': 1,
       'maindexrules' : [
           os.path.join(V15_09_BASE, 'mainDexClasses.rules'),
           os.path.join(V15_09_BASE, 'main-dex-classes-release-optimized.pgcfg'),