summaryrefslogtreecommitdiff
path: root/base/android/java/src/org/chromium/base/CommandLineInitUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'base/android/java/src/org/chromium/base/CommandLineInitUtil.java')
-rw-r--r--base/android/java/src/org/chromium/base/CommandLineInitUtil.java103
1 files changed, 103 insertions, 0 deletions
diff --git a/base/android/java/src/org/chromium/base/CommandLineInitUtil.java b/base/android/java/src/org/chromium/base/CommandLineInitUtil.java
new file mode 100644
index 0000000000..e51b95d6b5
--- /dev/null
+++ b/base/android/java/src/org/chromium/base/CommandLineInitUtil.java
@@ -0,0 +1,103 @@
+// Copyright 2015 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.base;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.os.Build;
+import android.provider.Settings;
+import android.support.annotation.Nullable;
+
+import java.io.File;
+
+/**
+ * Provides implementation of command line initialization for Android.
+ */
+public final class CommandLineInitUtil {
+ /**
+ * The location of the command line file needs to be in a protected
+ * directory so requires root access to be tweaked, i.e., no other app in a
+ * regular (non-rooted) device can change this file's contents.
+ * See below for debugging on a regular (non-rooted) device.
+ */
+ private static final String COMMAND_LINE_FILE_PATH = "/data/local";
+
+ /**
+ * This path (writable by the shell in regular non-rooted "user" builds) is used when:
+ * 1) The "debug app" is set to the application calling this.
+ * and
+ * 2) ADB is enabled.
+ * 3) Force enabled by the embedder.
+ */
+ private static final String COMMAND_LINE_FILE_PATH_DEBUG_APP = "/data/local/tmp";
+
+ private CommandLineInitUtil() {
+ }
+
+ /**
+ * Initializes the CommandLine class, pulling command line arguments from {@code fileName}.
+ * @param fileName The name of the command line file to pull arguments from.
+ */
+ public static void initCommandLine(String fileName) {
+ initCommandLine(fileName, null);
+ }
+
+ /**
+ * Initializes the CommandLine class, pulling command line arguments from {@code fileName}.
+ * @param fileName The name of the command line file to pull arguments from.
+ * @param shouldUseDebugFlags If non-null, returns whether debug flags are allowed to be used.
+ */
+ public static void initCommandLine(
+ String fileName, @Nullable Supplier<Boolean> shouldUseDebugFlags) {
+ assert !CommandLine.isInitialized();
+ File commandLineFile = new File(COMMAND_LINE_FILE_PATH_DEBUG_APP, fileName);
+ // shouldUseDebugCommandLine() uses IPC, so don't bother calling it if no flags file exists.
+ boolean debugFlagsExist = commandLineFile.exists();
+ if (!debugFlagsExist || !shouldUseDebugCommandLine(shouldUseDebugFlags)) {
+ commandLineFile = new File(COMMAND_LINE_FILE_PATH, fileName);
+ }
+ CommandLine.initFromFile(commandLineFile.getPath());
+ }
+
+ /**
+ * Use an alternative path if:
+ * - The current build is "eng" or "userdebug", OR
+ * - adb is enabled and this is the debug app, OR
+ * - Force enabled by the embedder.
+ * @param shouldUseDebugFlags If non-null, returns whether debug flags are allowed to be used.
+ */
+ private static boolean shouldUseDebugCommandLine(
+ @Nullable Supplier<Boolean> shouldUseDebugFlags) {
+ if (shouldUseDebugFlags != null && shouldUseDebugFlags.get()) return true;
+ Context context = ContextUtils.getApplicationContext();
+ String debugApp = Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1
+ ? getDebugAppPreJBMR1(context)
+ : getDebugAppJBMR1(context);
+ // Check isDebugAndroid() last to get full code coverage when using userdebug devices.
+ return context.getPackageName().equals(debugApp) || BuildInfo.isDebugAndroid();
+ }
+
+ @SuppressLint("NewApi")
+ private static String getDebugAppJBMR1(Context context) {
+ boolean adbEnabled = Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.ADB_ENABLED, 0) == 1;
+ if (adbEnabled) {
+ return Settings.Global.getString(context.getContentResolver(),
+ Settings.Global.DEBUG_APP);
+ }
+ return null;
+ }
+
+ @SuppressWarnings("deprecation")
+ private static String getDebugAppPreJBMR1(Context context) {
+ boolean adbEnabled = Settings.System.getInt(context.getContentResolver(),
+ Settings.System.ADB_ENABLED, 0) == 1;
+ if (adbEnabled) {
+ return Settings.System.getString(context.getContentResolver(),
+ Settings.System.DEBUG_APP);
+ }
+ return null;
+ }
+}