[android_webview] Save boundary interfaces from proguard obfuscation

We need to keep the names of all boundary interface classes and methods
used by the support library and chromium to ensure their names are the
same in the support library as in the WebView APK.
However, utility classes in the boundary interface package can be
obfuscated just fine since they are not part of the boundary interface
API.

Ideally then, we will put everything that is part of the boundary
interface API in one specific package, and keep utility methods in a
sub-package, to allow for simple proguard rules (and avoid bugs where we
incorrectly keep/remove new boundary interfaces).

Bug: 809471
Change-Id: I7a700fcc50998d83bf3bfa799196477289bedb3e
Reviewed-on: https://chromium-review.googlesource.com/943504
Reviewed-by: agrieve <agrieve@chromium.org>
Reviewed-by: Richard Coles <torne@chromium.org>
Commit-Queue: Gustav Sennton <gsennton@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#540800}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 0a6e992e64dcf503e038e34a0c7952172b29d9a9
diff --git a/BUILD.gn b/BUILD.gn
index 6f08b1d..bc1fcb3 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -7,15 +7,17 @@
 
 android_library("boundary_interface_java") {
   java_files = [
-    "src/org/chromium/support_lib_boundary/BoundaryInterfaceReflectionUtil.java",
     "src/org/chromium/support_lib_boundary/StaticsBoundaryInterface.java",
     "src/org/chromium/support_lib_boundary/VisualStateCallbackBoundaryInterface.java",
     "src/org/chromium/support_lib_boundary/WebSettingsBoundaryInterface.java",
     "src/org/chromium/support_lib_boundary/WebViewProviderBoundaryInterface.java",
     "src/org/chromium/support_lib_boundary/WebViewProviderFactoryBoundaryInterface.java",
     "src/org/chromium/support_lib_boundary/WebkitToCompatConverterBoundaryInterface.java",
+    "src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java",
   ]
 
+  proguard_configs = [ "proguard.flags" ]
+
   # We can't use ANY deps here, the support library should be able to build
   # these interfaces without any other chromium dependencies.
   deps = []
diff --git a/proguard.flags b/proguard.flags
new file mode 100644
index 0000000..4a0d580
--- /dev/null
+++ b/proguard.flags
@@ -0,0 +1,9 @@
+# Copyright 2018 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+# We need to avoid obfuscating the support library boundary interface because
+# this API is shared with the Android Support Library.
+# Note that we only 'keep' the package org.chromium.support_lib_boundary itself,
+# any sub-packages of that package can still be obfuscated.
+-keep public class org.chromium.support_lib_boundary.* { public *; }
diff --git a/src/org/chromium/support_lib_boundary/BoundaryInterfaceReflectionUtil.java b/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
similarity index 98%
rename from src/org/chromium/support_lib_boundary/BoundaryInterfaceReflectionUtil.java
rename to src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
index caf7277..5a772c5 100644
--- a/src/org/chromium/support_lib_boundary/BoundaryInterfaceReflectionUtil.java
+++ b/src/org/chromium/support_lib_boundary/util/BoundaryInterfaceReflectionUtil.java
@@ -1,7 +1,7 @@
 // Copyright 2018 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-package org.chromium.support_lib_boundary;
+package org.chromium.support_lib_boundary.util;
 
 import android.annotation.TargetApi;
 import android.os.Build;