Use different exceptions for different crash reasons

Always throwing RemoteServiceException would make it impossible to
tell the cause of a crash without the string message.

Let's use a different exception type so developers can cluster crashes
without the exception message.

Bug: 124137635
Test: Treehugger
Change-Id: Ibae57bdb1b8965241c41249a89c728d224e4e995
This commit is contained in:
Makoto Onuki
2021-11-16 11:48:13 -08:00
parent c0cca5c474
commit baacfd7985
3 changed files with 11 additions and 5 deletions

View File

@@ -79,18 +79,20 @@ public final class PasswordUtils extends com.android.settingslib.Utils {
} }
/** Crashes the calling application and provides it with {@code message}. */ /** Crashes the calling application and provides it with {@code message}. */
public static void crashCallingApplication(IBinder activityToken, String message) { public static void crashCallingApplication(IBinder activityToken, String message,
int exceptionTypeId) {
IActivityManager am = ActivityManager.getService(); IActivityManager am = ActivityManager.getService();
try { try {
int uid = am.getLaunchedFromUid(activityToken); int uid = am.getLaunchedFromUid(activityToken);
int userId = UserHandle.getUserId(uid); int userId = UserHandle.getUserId(uid);
am.crashApplication( am.crashApplicationWithType(
uid, uid,
/* initialPid= */ -1, /* initialPid= */ -1,
getCallingAppPackageName(activityToken), getCallingAppPackageName(activityToken),
userId, userId,
message, message,
false); false,
exceptionTypeId);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.v(TAG, "Could not talk to activity manager.", e); Log.v(TAG, "Could not talk to activity manager.", e);
} }

View File

@@ -29,6 +29,7 @@ import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_I
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
import android.app.Activity; import android.app.Activity;
import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
import android.app.admin.DevicePolicyManager; import android.app.admin.DevicePolicyManager;
import android.app.admin.DevicePolicyManager.PasswordComplexity; import android.app.admin.DevicePolicyManager.PasswordComplexity;
import android.app.admin.PasswordMetrics; import android.app.admin.PasswordMetrics;
@@ -101,7 +102,8 @@ public class SetNewPasswordActivity extends Activity implements SetNewPasswordCo
PasswordUtils.crashCallingApplication(activityToken, PasswordUtils.crashCallingApplication(activityToken,
"Must have permission " "Must have permission "
+ REQUEST_PASSWORD_COMPLEXITY + " to use extra " + REQUEST_PASSWORD_COMPLEXITY + " to use extra "
+ EXTRA_PASSWORD_COMPLEXITY); + EXTRA_PASSWORD_COMPLEXITY,
MissingRequestPasswordComplexityPermissionException.TYPE_ID);
finish(); finish();
return; return;
} }

View File

@@ -21,6 +21,7 @@ import static android.app.admin.DevicePolicyManager.EXTRA_PASSWORD_COMPLEXITY;
import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY; import static com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_REQUESTED_MIN_COMPLEXITY;
import android.app.RemoteServiceException.MissingRequestPasswordComplexityPermissionException;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@@ -79,7 +80,8 @@ public class SetupChooseLockGeneric extends ChooseLockGeneric {
if (!hasPermission) { if (!hasPermission) {
PasswordUtils.crashCallingApplication(activityToken, PasswordUtils.crashCallingApplication(activityToken,
"Must have permission " + REQUEST_PASSWORD_COMPLEXITY "Must have permission " + REQUEST_PASSWORD_COMPLEXITY
+ " to use extra " + EXTRA_PASSWORD_COMPLEXITY); + " to use extra " + EXTRA_PASSWORD_COMPLEXITY,
MissingRequestPasswordComplexityPermissionException.TYPE_ID);
finish(); finish();
return; return;
} }