Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(170)

Side by Side Diff: android_webview/java/src/org/chromium/android_webview/AwBrowserProcess.java

Issue 2833893002: [Android WebView] Trigger minidump uploading on renderer crash. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.android_webview; 5 package org.chromium.android_webview;
6 6
7 import android.content.ComponentName; 7 import android.content.ComponentName;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.Intent; 9 import android.content.Intent;
10 import android.content.ServiceConnection; 10 import android.content.ServiceConnection;
11 import android.os.AsyncTask; 11 import android.os.AsyncTask;
12 import android.os.IBinder; 12 import android.os.IBinder;
13 import android.os.ParcelFileDescriptor; 13 import android.os.ParcelFileDescriptor;
14 import android.os.RemoteException; 14 import android.os.RemoteException;
15 import android.os.StrictMode; 15 import android.os.StrictMode;
16 import android.webkit.ValueCallback;
16 17
18 import org.chromium.android_webview.command_line.CommandLineUtil;
17 import org.chromium.android_webview.crash.CrashReceiverService; 19 import org.chromium.android_webview.crash.CrashReceiverService;
18 import org.chromium.android_webview.crash.ICrashReceiverService; 20 import org.chromium.android_webview.crash.ICrashReceiverService;
19 import org.chromium.android_webview.policy.AwPolicyProvider; 21 import org.chromium.android_webview.policy.AwPolicyProvider;
20 import org.chromium.base.CommandLine; 22 import org.chromium.base.CommandLine;
21 import org.chromium.base.ContextUtils; 23 import org.chromium.base.ContextUtils;
22 import org.chromium.base.Log; 24 import org.chromium.base.Log;
23 import org.chromium.base.PathUtils; 25 import org.chromium.base.PathUtils;
24 import org.chromium.base.ThreadUtils; 26 import org.chromium.base.ThreadUtils;
27 import org.chromium.base.annotations.CalledByNative;
28 import org.chromium.base.annotations.JNINamespace;
25 import org.chromium.base.library_loader.LibraryLoader; 29 import org.chromium.base.library_loader.LibraryLoader;
26 import org.chromium.base.library_loader.LibraryProcessType; 30 import org.chromium.base.library_loader.LibraryProcessType;
27 import org.chromium.base.library_loader.ProcessInitException; 31 import org.chromium.base.library_loader.ProcessInitException;
28 import org.chromium.base.process_launcher.ChildProcessCreationParams; 32 import org.chromium.base.process_launcher.ChildProcessCreationParams;
29 import org.chromium.components.minidump_uploader.CrashFileManager; 33 import org.chromium.components.minidump_uploader.CrashFileManager;
30 import org.chromium.content.browser.BrowserStartupController; 34 import org.chromium.content.browser.BrowserStartupController;
31 import org.chromium.content.browser.ChildProcessLauncher; 35 import org.chromium.content.browser.ChildProcessLauncher;
32 import org.chromium.policy.CombinedPolicyProvider; 36 import org.chromium.policy.CombinedPolicyProvider;
33 37
34 import java.io.File; 38 import java.io.File;
35 import java.io.FileNotFoundException; 39 import java.io.FileNotFoundException;
36 import java.io.IOException; 40 import java.io.IOException;
37 import java.io.RandomAccessFile; 41 import java.io.RandomAccessFile;
38 import java.nio.channels.FileLock; 42 import java.nio.channels.FileLock;
39 43
40 /** 44 /**
41 * Wrapper for the steps needed to initialize the java and native sides of webvi ew chromium. 45 * Wrapper for the steps needed to initialize the java and native sides of webvi ew chromium.
42 */ 46 */
47 @JNINamespace("android_webview")
43 public abstract class AwBrowserProcess { 48 public abstract class AwBrowserProcess {
44 public static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "webview"; 49 public static final String PRIVATE_DATA_DIRECTORY_SUFFIX = "webview";
45 50
46 private static final String TAG = "AwBrowserProcess"; 51 private static final String TAG = "AwBrowserProcess";
47 private static final String EXCLUSIVE_LOCK_FILE = "webview_data.lock"; 52 private static final String EXCLUSIVE_LOCK_FILE = "webview_data.lock";
48 private static RandomAccessFile sLockFile; 53 private static RandomAccessFile sLockFile;
49 private static FileLock sExclusiveFileLock; 54 private static FileLock sExclusiveFileLock;
55 private static String sWebViewPackageName;
50 56
51 private static final int MAX_MINIDUMP_UPLOAD_TRIES = 3; 57 private static final int MAX_MINIDUMP_UPLOAD_TRIES = 3;
52 58
53 /** 59 /**
54 * Loads the native library, and performs basic static construction of objec ts needed 60 * Loads the native library, and performs basic static construction of objec ts needed
55 * to run webview in this process. Does not create threads; safe to call fro m zygote. 61 * to run webview in this process. Does not create threads; safe to call fro m zygote.
56 * Note: it is up to the caller to ensure this is only called once. 62 * Note: it is up to the caller to ensure this is only called once.
57 */ 63 */
58 public static void loadLibrary() { 64 public static void loadLibrary() {
59 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX); 65 PathUtils.setPrivateDataDirectorySuffix(PRIVATE_DATA_DIRECTORY_SUFFIX);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 throw new RuntimeException(error); 148 throw new RuntimeException(error);
143 } else { 149 } else {
144 Log.w(TAG, error); 150 Log.w(TAG, error);
145 } 151 }
146 } 152 }
147 } finally { 153 } finally {
148 StrictMode.setThreadPolicy(oldPolicy); 154 StrictMode.setThreadPolicy(oldPolicy);
149 } 155 }
150 } 156 }
151 157
158 public static void setWebViewPackageName(String webViewPackageName) {
gsennton 2017/04/20 20:32:46 Having this is a bit ugly... but we fetch the WebV
paulmiller 2017/04/20 23:38:51 I was going to do something like this anyway. The
gsennton 2017/04/21 15:46:33 Haha, damn ;)
159 assert sWebViewPackageName == null || sWebViewPackageName.equals(webView PackageName);
160 sWebViewPackageName = webViewPackageName;
161 }
162
163 /**
164 * Trigger minidump copying, which in turn triggers minidump uploading.
165 */
166 @CalledByNative
167 private static void triggerMinidumpUploading() {
168 handleMinidumpsAndSetMetricsConsent(sWebViewPackageName, false /* update MetricsConsent */);
Tobias Sargeant 2017/04/21 16:18:04 I think now we could get into a situation where we
gsennton 2017/04/24 08:27:16 Right, that might be undesirable ;) I think any al
gsennton 2017/04/24 12:39:54 As Toby pointed out offline, if we just post these
169 }
170
171 /**
172 * Trigger minidump uploading, and optionaly also update the metrics-consent value depending on
173 * whether the Android Checkbox is toggled on.
174 * @param updateMetricsConsent whether to update the metrics-consent value t o represent the
paulmiller 2017/04/20 23:38:51 This flag feels hacky. Why not have 2 queryMetrics
gsennton 2017/04/21 15:46:33 We could do that, I just don't like duplicating th
paulmiller 2017/04/21 17:50:01 I don't think that calling queryMetricsSetting twi
gsennton 2017/04/24 08:27:16 I'm more concerned about the whole enableMinidumpU
175 * Android Checkbox toggle.
176 */
177 public static void handleMinidumpsAndSetMetricsConsent(
178 final String webViewPackageName, final boolean updateMetricsConsent) {
179 final boolean enableMinidumpUploadingForTesting = CommandLine.getInstanc e().hasSwitch(
180 CommandLineUtil.CRASH_UPLOADS_ENABLED_FOR_TESTING_SWITCH);
181 if (enableMinidumpUploadingForTesting) {
182 AwBrowserProcess.handleMinidumps(webViewPackageName, true /* enabled */);
183 }
184
185 PlatformServiceBridge.getInstance().queryMetricsSetting(new ValueCallbac k<Boolean>() {
186 // Actions conditioned on whether the Android Checkbox is toggled on
187 public void onReceiveValue(Boolean enabled) {
188 ThreadUtils.assertOnUiThread();
189 if (updateMetricsConsent) {
190 AwMetricsServiceClient.setConsentSetting(
191 ContextUtils.getApplicationContext(), enabled);
192 }
193
194 if (!enableMinidumpUploadingForTesting) {
195 AwBrowserProcess.handleMinidumps(webViewPackageName, enabled );
196 }
197 }
198 });
199 }
200
152 /** 201 /**
153 * Pass Minidumps to a separate Service declared in the WebView provider pac kage. 202 * Pass Minidumps to a separate Service declared in the WebView provider pac kage.
154 * That Service will copy the Minidumps to its own data directory - at which point we can delete 203 * That Service will copy the Minidumps to its own data directory - at which point we can delete
155 * our copies in the app directory. 204 * our copies in the app directory.
156 * @param userApproved whether we have user consent to upload crash data - i f we do, copy the 205 * @param userApproved whether we have user consent to upload crash data - i f we do, copy the
157 * minidumps, if we don't, delete them. 206 * minidumps, if we don't, delete them.
158 */ 207 */
159 public static void handleMinidumps( 208 public static void handleMinidumps(
160 final String webViewPackageName, final boolean userApproved) { 209 final String webViewPackageName, final boolean userApproved) {
161 new AsyncTask<Void, Void, Void>() { 210 new AsyncTask<Void, Void, Void>() {
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 public void onServiceDisconnected(ComponentName className) { } 279 public void onServiceDisconnected(ComponentName className) { }
231 }; 280 };
232 if (!appContext.bindService(intent, connection, Context.BIND_AUT O_CREATE)) { 281 if (!appContext.bindService(intent, connection, Context.BIND_AUT O_CREATE)) {
233 Log.w(TAG, "Could not bind to Minidump-copying Service " + i ntent); 282 Log.w(TAG, "Could not bind to Minidump-copying Service " + i ntent);
234 } 283 }
235 return null; 284 return null;
236 } 285 }
237 }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 286 }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
238 } 287 }
239 } 288 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698