Commit 3c8efa49 authored by David Trainor's avatar David Trainor Committed by Commit Bot

Add process ids to submitted feedback

Expose the various process ids in chrome to the feedback collection
system.

BUG=773408, 773409

Change-Id: I352645c5e76213150cf2a46f58c2db5ca7523866
Reviewed-on: https://chromium-review.googlesource.com/832508
Commit-Queue: David Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarTommy Nyquist <nyquist@chromium.org>
Reviewed-by: default avatarJay Civelli <jcivelli@chromium.org>
Cr-Commit-Position: refs/heads/master@{#537321}
parent 5c8ad416
...@@ -85,6 +85,11 @@ public class FeedbackCollector implements Runnable { ...@@ -85,6 +85,11 @@ public class FeedbackCollector implements Runnable {
sources.add(new IMEFeedbackSource()); sources.add(new IMEFeedbackSource());
sources.add(new PermissionFeedbackSource()); sources.add(new PermissionFeedbackSource());
// Sanity check in case a source is added to the wrong list.
for (FeedbackSource source : sources) {
assert !(source instanceof AsyncFeedbackSource);
}
return sources; return sources;
} }
...@@ -97,6 +102,7 @@ public class FeedbackCollector implements Runnable { ...@@ -97,6 +102,7 @@ public class FeedbackCollector implements Runnable {
sources.addAll(AppHooks.get().getAdditionalFeedbackSources().getAsynchronousSources()); sources.addAll(AppHooks.get().getAdditionalFeedbackSources().getAsynchronousSources());
sources.add(new ConnectivityFeedbackSource(profile)); sources.add(new ConnectivityFeedbackSource(profile));
sources.add(new SystemInfoFeedbackSource()); sources.add(new SystemInfoFeedbackSource());
sources.add(new ProcessIdFeedbackSource());
return sources; return sources;
} }
......
// 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.chrome.browser.feedback;
import android.os.Handler;
import org.chromium.base.CollectionUtil;
import org.chromium.base.annotations.JNINamespace;
import org.chromium.content_public.browser.ChildProcessUtils;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** Grabs feedback about the current system. */
@JNINamespace("chrome::android")
public class ProcessIdFeedbackSource implements AsyncFeedbackSource {
private boolean mComplete;
/**
* A map of process type -> list of PIDs for that type. See
* {@link ChildProcessUtils#getProcessIdsByType(org.chromium.base.Callback)} for more details.
*/
private Map<String, List<Integer>> mProcessMap;
ProcessIdFeedbackSource() {}
private static final String processTypeToFeedbackKey(String type) {
return "Process IDs (" + type + ")";
}
// AsyncFeedbackSource implementation.
@Override
public void start(final Runnable callback) {
ChildProcessUtils.getProcessIdsByType(results -> {
mProcessMap = results;
mComplete = true;
new Handler().post(callback);
});
}
@Override
public boolean isReady() {
return mComplete;
}
@Override
public Map<String, String> getFeedback() {
Map<String, String> feedback = new HashMap<>();
if (mProcessMap != null) {
CollectionUtil.forEach(mProcessMap, entry -> {
String key = processTypeToFeedbackKey(entry.getKey());
StringBuilder pids = new StringBuilder();
for (Integer pid : entry.getValue()) {
if (pids.length() > 0) pids.append(", ");
pids.append(pid.toString());
}
feedback.put(key, pids.toString());
});
}
feedback.put(processTypeToFeedbackKey("browser"), Long.toString(nativeGetCurrentPid()));
return feedback;
}
private static native long nativeGetCurrentPid();
}
\ No newline at end of file
...@@ -420,6 +420,7 @@ chrome_java_sources = [ ...@@ -420,6 +420,7 @@ chrome_java_sources = [
"java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java", "java/src/org/chromium/chrome/browser/feedback/IMEFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java", "java/src/org/chromium/chrome/browser/feedback/LowEndDeviceFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java", "java/src/org/chromium/chrome/browser/feedback/PermissionFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java",
"java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java", "java/src/org/chromium/chrome/browser/feedback/ScreenshotSource.java",
"java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java", "java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
"java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java", "java/src/org/chromium/chrome/browser/feedback/StaticScreenshotSource.java",
......
...@@ -2002,6 +2002,7 @@ jumbo_split_static_library("browser") { ...@@ -2002,6 +2002,7 @@ jumbo_split_static_library("browser") {
"android/feature_utilities.cc", "android/feature_utilities.cc",
"android/feature_utilities.h", "android/feature_utilities.h",
"android/feedback/connectivity_checker.cc", "android/feedback/connectivity_checker.cc",
"android/feedback/process_id_feedback_source.cc",
"android/feedback/screenshot_task.cc", "android/feedback/screenshot_task.cc",
"android/feedback/system_info_feedback_source.cc", "android/feedback/system_info_feedback_source.cc",
"android/find_in_page/find_in_page_bridge.cc", "android/find_in_page/find_in_page_bridge.cc",
...@@ -4272,6 +4273,7 @@ if (is_android) { ...@@ -4272,6 +4273,7 @@ if (is_android) {
"../android/java/src/org/chromium/chrome/browser/favicon/LargeIconBridge.java", "../android/java/src/org/chromium/chrome/browser/favicon/LargeIconBridge.java",
"../android/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java", "../android/java/src/org/chromium/chrome/browser/feature_engagement/TrackerFactory.java",
"../android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java", "../android/java/src/org/chromium/chrome/browser/feedback/ConnectivityChecker.java",
"../android/java/src/org/chromium/chrome/browser/feedback/ProcessIdFeedbackSource.java",
"../android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java", "../android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java",
"../android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java", "../android/java/src/org/chromium/chrome/browser/feedback/SystemInfoFeedbackSource.java",
"../android/java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java", "../android/java/src/org/chromium/chrome/browser/findinpage/FindInPageBridge.java",
......
// 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.
#include "base/android/jni_android.h"
#include "base/android/scoped_java_ref.h"
#include "base/process/process_handle.h"
#include "jni/ProcessIdFeedbackSource_jni.h"
namespace chrome {
namespace android {
int64_t JNI_ProcessIdFeedbackSource_GetCurrentPid(
JNIEnv* env,
const base::android::JavaParamRef<jclass>& clazz) {
return base::GetCurrentProcId();
}
} // namespace android
} // namespace chrome
...@@ -229,6 +229,7 @@ android_library("content_java") { ...@@ -229,6 +229,7 @@ android_library("content_java") {
"java/src/org/chromium/content_public/browser/AccessibilitySnapshotCallback.java", "java/src/org/chromium/content_public/browser/AccessibilitySnapshotCallback.java",
"java/src/org/chromium/content_public/browser/AccessibilitySnapshotNode.java", "java/src/org/chromium/content_public/browser/AccessibilitySnapshotNode.java",
"java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java", "java/src/org/chromium/content_public/browser/ActionModeCallbackHelper.java",
"java/src/org/chromium/content_public/browser/ChildProcessUtils.java",
"java/src/org/chromium/content_public/browser/ContentBitmapCallback.java", "java/src/org/chromium/content_public/browser/ContentBitmapCallback.java",
"java/src/org/chromium/content_public/browser/ContentViewCore.java", "java/src/org/chromium/content_public/browser/ContentViewCore.java",
"java/src/org/chromium/content_public/browser/GestureListenerManager.java", "java/src/org/chromium/content_public/browser/GestureListenerManager.java",
......
...@@ -6,11 +6,14 @@ package org.chromium.content.browser; ...@@ -6,11 +6,14 @@ package org.chromium.content.browser;
import android.content.Context; import android.content.Context;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.RemoteException; import android.os.RemoteException;
import android.text.TextUtils; import android.text.TextUtils;
import org.chromium.base.Callback;
import org.chromium.base.CollectionUtil;
import org.chromium.base.ContextUtils; import org.chromium.base.ContextUtils;
import org.chromium.base.CpuFeatures; import org.chromium.base.CpuFeatures;
import org.chromium.base.Log; import org.chromium.base.Log;
...@@ -30,8 +33,10 @@ import org.chromium.content.common.ContentSwitches; ...@@ -30,8 +33,10 @@ import org.chromium.content.common.ContentSwitches;
import org.chromium.content_public.browser.ChildProcessImportance; import org.chromium.content_public.browser.ChildProcessImportance;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
...@@ -82,6 +87,9 @@ public class ChildProcessLauncherHelper { ...@@ -82,6 +87,9 @@ public class ChildProcessLauncherHelper {
// Whether the created process should be sandboxed. // Whether the created process should be sandboxed.
private final boolean mSandboxed; private final boolean mSandboxed;
// The type of process as determined by the command line.
private final String mProcessType;
private final ChildProcessLauncher.Delegate mLauncherDelegate = private final ChildProcessLauncher.Delegate mLauncherDelegate =
new ChildProcessLauncher.Delegate() { new ChildProcessLauncher.Delegate() {
@Override @Override
...@@ -380,6 +388,16 @@ public class ChildProcessLauncherHelper { ...@@ -380,6 +388,16 @@ public class ChildProcessLauncherHelper {
mLauncher = new ChildProcessLauncher(LauncherThread.getHandler(), mLauncherDelegate, mLauncher = new ChildProcessLauncher(LauncherThread.getHandler(), mLauncherDelegate,
commandLine, filesToBeMapped, connectionAllocator, commandLine, filesToBeMapped, connectionAllocator,
binderCallback == null ? null : Arrays.asList(binderCallback)); binderCallback == null ? null : Arrays.asList(binderCallback));
mProcessType =
ContentSwitches.getSwitchValue(commandLine, ContentSwitches.SWITCH_PROCESS_TYPE);
}
/**
* @return The type of process as specified in the command line at
* {@link ContentSwitches#SWITCH_PROCESS_TYPE}.
*/
public String getProcessType() {
return TextUtils.isEmpty(mProcessType) ? "" : mProcessType;
} }
public int getPid() { public int getPid() {
...@@ -540,6 +558,31 @@ public class ChildProcessLauncherHelper { ...@@ -540,6 +558,31 @@ public class ChildProcessLauncherHelper {
return sLauncherByPid.get(pid); return sLauncherByPid.get(pid);
} }
/**
* Groups all currently tracked processes by type and returns a map of type -> list of PIDs.
*
* @param callback The callback to notify with the process information. {@code callback} will
* run on the same thread this method is called on. That thread must support a
* {@link android.os.Looper}.
*/
public static void getProcessIdsByType(Callback < Map < String, List<Integer>>> callback) {
final Handler responseHandler = new Handler();
LauncherThread.post(() -> {
Map<String, List<Integer>> map = new HashMap<>();
CollectionUtil.forEach(sLauncherByPid, entry -> {
String type = entry.getValue().getProcessType();
List<Integer> pids = map.get(type);
if (pids == null) {
pids = new ArrayList<>();
map.put(type, pids);
}
pids.add(entry.getKey());
});
responseHandler.post(() -> callback.onResult(map));
});
}
// Testing only related methods. // Testing only related methods.
@VisibleForTesting @VisibleForTesting
......
// 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.content_public.browser;
import org.chromium.base.Callback;
import org.chromium.content.browser.ChildProcessLauncherHelper;
import java.util.List;
import java.util.Map;
/** A helper class for querying Chromium process information. */
public final class ChildProcessUtils {
private ChildProcessUtils() {}
/**
* Groups all currently tracked processes by type and returns a map of type -> list of PIDs.
*
* @param callback The callback to notify with the process information. {@code callback} will
* run on the same thread this method is called on. That thread must support a
* {@link android.os.Looper}.
*/
public static void getProcessIdsByType(Callback < Map < String, List<Integer>>> callback) {
ChildProcessLauncherHelper.getProcessIdsByType(callback);
}
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment