[Android] Enable multidex for debug builds of ChromePublic.

This is a non-incremental implementation. It adds @MainDex to classes used by
the renderer to keep them in the main dex, as it can't load secondary dexes
when using the multidex support library (i.e., on K and below).

BUG=272790
TBR=newt@chromium.org,sky@chromium.org

Review URL: https://codereview.chromium.org/1408163009

Cr-Commit-Position: refs/heads/master@{#359453}


CrOS-Libchrome-Original-Commit: f667d3b3a1b953800bb5325c7b8d62775a1c5aeb
diff --git a/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java b/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java
index ad5cdd8..1cd2acf 100644
--- a/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java
+++ b/base/android/java/src/org/chromium/base/AnimationFrameTimeHistogram.java
@@ -11,10 +11,13 @@
 import android.animation.TimeAnimator.TimeListener;
 import android.util.Log;
 
+import org.chromium.base.annotations.MainDex;
+
 /**
  * Record Android animation frame rate and save it to UMA histogram. This is mainly for monitoring
  * any jankiness of short Chrome Android animations. It is limited to few seconds of recording.
  */
+@MainDex
 public class AnimationFrameTimeHistogram {
     private static final String TAG = "AnimationFrameTimeHistogram";
     private static final int MAX_FRAME_TIME_NUM = 600; // 10 sec on 60 fps.
diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java
index 5035b9c..9f77595 100644
--- a/base/android/java/src/org/chromium/base/ApplicationStatus.java
+++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java
@@ -12,6 +12,7 @@
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.MainDex;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -24,6 +25,7 @@
  * to register / unregister listeners for state changes.
  */
 @JNINamespace("base::android")
+@MainDex
 public class ApplicationStatus {
     private static class ActivityInfo {
         private int mStatus = ActivityState.DESTROYED;
diff --git a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java
index 1c1f826..e4e6e20 100644
--- a/base/android/java/src/org/chromium/base/BaseChromiumApplication.java
+++ b/base/android/java/src/org/chromium/base/BaseChromiumApplication.java
@@ -10,6 +10,8 @@
 import android.os.Bundle;
 import android.view.Window;
 
+import org.chromium.base.multidex.ChromiumMultiDex;
+
 /**
  * Basic application functionality that should be shared among all browser applications.
  */
@@ -26,6 +28,12 @@
         mShouldInitializeApplicationStatusTracking = shouldInitializeApplicationStatusTracking;
     }
 
+    @Override
+    protected void attachBaseContext(Context base) {
+        super.attachBaseContext(base);
+        ChromiumMultiDex.install(this);
+    }
+
     /**
      * Interface to be implemented by listeners for window focus events.
      */
diff --git a/base/android/java/src/org/chromium/base/CommandLine.java b/base/android/java/src/org/chromium/base/CommandLine.java
index bb227f1..efef22a 100644
--- a/base/android/java/src/org/chromium/base/CommandLine.java
+++ b/base/android/java/src/org/chromium/base/CommandLine.java
@@ -7,6 +7,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import org.chromium.base.annotations.MainDex;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -25,6 +27,7 @@
  * file at a specific location early during startup. Applications each define their own files, e.g.,
  * ContentShellApplication.COMMAND_LINE_FILE.
 **/
+@MainDex
 public abstract class CommandLine {
     /**
      * Allows classes who cache command line flags to be notified when those arguments are updated
diff --git a/base/android/java/src/org/chromium/base/FieldTrialList.java b/base/android/java/src/org/chromium/base/FieldTrialList.java
index 5fc9a1f..cfd7d5c 100644
--- a/base/android/java/src/org/chromium/base/FieldTrialList.java
+++ b/base/android/java/src/org/chromium/base/FieldTrialList.java
@@ -4,9 +4,12 @@
 
 package org.chromium.base;
 
+import org.chromium.base.annotations.MainDex;
+
 /**
  * Helper to get field trial information.
  */
+@MainDex
 public class FieldTrialList {
 
     private FieldTrialList() {}
diff --git a/base/android/java/src/org/chromium/base/JNIUtils.java b/base/android/java/src/org/chromium/base/JNIUtils.java
index adbd36c..f971b5e 100644
--- a/base/android/java/src/org/chromium/base/JNIUtils.java
+++ b/base/android/java/src/org/chromium/base/JNIUtils.java
@@ -5,10 +5,12 @@
 package org.chromium.base;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.MainDex;
 
 /**
  * This class provides JNI-related methods to the native library.
  */
+@MainDex
 public class JNIUtils {
     /**
      * This returns a ClassLoader that is capable of loading Chromium Java code. Such a ClassLoader
diff --git a/base/android/java/src/org/chromium/base/MemoryPressureListener.java b/base/android/java/src/org/chromium/base/MemoryPressureListener.java
index c1109ef..d61a006 100644
--- a/base/android/java/src/org/chromium/base/MemoryPressureListener.java
+++ b/base/android/java/src/org/chromium/base/MemoryPressureListener.java
@@ -10,6 +10,7 @@
 import android.content.res.Configuration;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.MainDex;
 
 
 /**
@@ -17,6 +18,7 @@
  * It registers a ComponentCallbacks2 with the system, and dispatches into
  * native for levels that are considered actionable.
  */
+@MainDex
 public class MemoryPressureListener {
     /**
      * Sending an intent with this action to Chrome will cause it to issue a call to onLowMemory
diff --git a/base/android/java/src/org/chromium/base/PathUtils.java b/base/android/java/src/org/chromium/base/PathUtils.java
index 01b036b..81c74f4 100644
--- a/base/android/java/src/org/chromium/base/PathUtils.java
+++ b/base/android/java/src/org/chromium/base/PathUtils.java
@@ -11,6 +11,7 @@
 import android.os.StrictMode;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.MainDex;
 
 import java.io.File;
 import java.util.concurrent.ExecutionException;
@@ -18,6 +19,7 @@
 /**
  * This class provides the path related methods for the native library.
  */
+@MainDex
 public abstract class PathUtils {
     private static final String THUMBNAIL_DIRECTORY = "textures";
 
diff --git a/base/android/java/src/org/chromium/base/SystemMessageHandler.java b/base/android/java/src/org/chromium/base/SystemMessageHandler.java
index 37d5ef0..ebcc0d9 100644
--- a/base/android/java/src/org/chromium/base/SystemMessageHandler.java
+++ b/base/android/java/src/org/chromium/base/SystemMessageHandler.java
@@ -10,10 +10,12 @@
 import android.os.Message;
 
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.MainDex;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+@MainDex
 class SystemMessageHandler extends Handler {
 
     private static final String TAG = "cr.SysMessageHandler";
diff --git a/base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java b/base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java
index 581c661..d0ab312 100644
--- a/base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java
+++ b/base/android/java/src/org/chromium/base/library_loader/LegacyLinker.java
@@ -11,6 +11,7 @@
 import org.chromium.base.SysUtils;
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.MainDex;
 
 import java.util.HashMap;
 import java.util.Locale;
@@ -31,6 +32,7 @@
  *
  * For more on the operations performed by the Linker, see {@link Linker}.
  */
+@MainDex
 class LegacyLinker extends Linker {
     // Log tag for this class.
     private static final String TAG = "LibraryLoader";
diff --git a/base/android/java/src/org/chromium/base/multidex/ChromiumMultiDex.java b/base/android/java/templates/ChromiumMultiDex.template
similarity index 94%
rename from base/android/java/src/org/chromium/base/multidex/ChromiumMultiDex.java
rename to base/android/java/templates/ChromiumMultiDex.template
index 7696a14..18b3c77 100644
--- a/base/android/java/src/org/chromium/base/multidex/ChromiumMultiDex.java
+++ b/base/android/java/templates/ChromiumMultiDex.template
@@ -30,6 +30,7 @@
      *  @param context The application context.
      */
     @VisibleForTesting
+#if defined(CONFIGURATION_NAME_Debug)
     public static void install(Context context) {
         try {
             // TODO(jbudorick): Back out this version check once support for K & below works.
@@ -54,5 +55,9 @@
             throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
         return (boolean) Process.class.getMethod("isIsolated").invoke(null);
     }
+#else
+    public static void install(Context context) {
+    }
+#endif
 
 }