summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Kurt Nelson <kurtn@google.com> 2017-09-18 21:40:33 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-09-18 21:40:33 +0000
commit5fe738da3be7a4e91bad950c9719937df925d9a9 (patch)
treeb3b41485c664175d22c923161e285771c248e8e0
parentf1d1ab002871eb8caf99885d999e19bdf9ad303c (diff)
parent7d5c07a5615d4e75f60bd314c2aa1503ba0ed5ae (diff)
Merge "Improve StrictMode CTS Testing"
-rw-r--r--api/test-current.txt28
-rw-r--r--config/preloaded-classes2
-rw-r--r--core/java/android/os/StrictMode.java58
3 files changed, 61 insertions, 27 deletions
diff --git a/api/test-current.txt b/api/test-current.txt
index 7256e5cf1cf9..e81b2772216e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -31816,7 +31816,7 @@ package android.os {
method public static android.os.StrictMode.VmPolicy getVmPolicy();
method public static void noteSlowCall(java.lang.String);
method public static void setThreadPolicy(android.os.StrictMode.ThreadPolicy);
- method public static void setViolationListener(android.os.StrictMode.ViolationListener);
+ method public static void setViolationLogger(android.os.StrictMode.ViolationLogger);
method public static void setVmPolicy(android.os.StrictMode.VmPolicy);
}
@@ -31850,8 +31850,30 @@ package android.os {
method public android.os.StrictMode.ThreadPolicy.Builder permitUnbufferedIo();
}
- public static abstract interface StrictMode.ViolationListener {
- method public abstract void onViolation(java.lang.String);
+ public static final class StrictMode.ViolationInfo implements android.os.Parcelable {
+ ctor public StrictMode.ViolationInfo();
+ ctor public StrictMode.ViolationInfo(java.lang.Throwable, int);
+ ctor public StrictMode.ViolationInfo(java.lang.String, java.lang.Throwable, int);
+ ctor public StrictMode.ViolationInfo(android.os.Parcel);
+ ctor public StrictMode.ViolationInfo(android.os.Parcel, boolean);
+ method public int describeContents();
+ method public void dump(android.util.Printer, java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.os.StrictMode.ViolationInfo> CREATOR;
+ field public java.lang.String broadcastIntentAction;
+ field public final android.app.ApplicationErrorReport.CrashInfo crashInfo;
+ field public int durationMillis;
+ field public final java.lang.String message;
+ field public int numAnimationsRunning;
+ field public long numInstances;
+ field public final int policy;
+ field public java.lang.String[] tags;
+ field public int violationNumThisLoop;
+ field public long violationUptimeMillis;
+ }
+
+ public static abstract interface StrictMode.ViolationLogger {
+ method public abstract void log(android.os.StrictMode.ViolationInfo);
}
public static final class StrictMode.VmPolicy {
diff --git a/config/preloaded-classes b/config/preloaded-classes
index cd2965392c44..cb3cbe196230 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -1848,6 +1848,7 @@ android.os.SharedMemory
android.os.ShellCallback
android.os.StatFs
android.os.StrictMode
+android.os.StrictMode$$Lambda$0
android.os.StrictMode$1
android.os.StrictMode$2
android.os.StrictMode$3
@@ -1872,6 +1873,7 @@ android.os.StrictMode$ThreadPolicy$Builder
android.os.StrictMode$ThreadSpanState
android.os.StrictMode$ViolationInfo
android.os.StrictMode$ViolationInfo$1
+android.os.StrictMode$ViolationLogger
android.os.StrictMode$VmPolicy
android.os.StrictMode$VmPolicy$Builder
android.os.SystemClock
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index f02631c7fe61..2528439a5e1f 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -16,6 +16,7 @@
package android.os;
import android.animation.ValueAnimator;
+import android.annotation.Nullable;
import android.annotation.TestApi;
import android.app.ActivityManager;
import android.app.ActivityThread;
@@ -322,16 +323,36 @@ public final class StrictMode {
/** {@hide} */
@TestApi
- public interface ViolationListener {
- public void onViolation(String message);
+ public interface ViolationLogger {
+
+ /** Called when penaltyLog is enabled and a violation needs logging. */
+ void log(ViolationInfo info);
}
- private static volatile ViolationListener sListener;
+ private static final ViolationLogger LOGCAT_LOGGER =
+ info -> {
+ String msg;
+ if (info.durationMillis != -1) {
+ msg = "StrictMode policy violation; ~duration=" + info.durationMillis + " ms:";
+ } else {
+ msg = "StrictMode policy violation:";
+ }
+ if (info.crashInfo != null) {
+ Log.d(TAG, msg + " " + info.crashInfo.stackTrace);
+ } else {
+ Log.d(TAG, msg + " missing stack trace!");
+ }
+ };
+
+ private static volatile ViolationLogger sLogger = LOGCAT_LOGGER;
/** {@hide} */
@TestApi
- public static void setViolationListener(ViolationListener listener) {
- sListener = listener;
+ public static void setViolationLogger(ViolationLogger listener) {
+ if (listener == null) {
+ listener = LOGCAT_LOGGER;
+ }
+ sLogger = listener;
}
/**
@@ -1512,28 +1533,16 @@ public final class StrictMode {
lastViolationTime = vtime;
}
} else {
- mLastViolationTime = new ArrayMap<Integer, Long>(1);
+ mLastViolationTime = new ArrayMap<>(1);
}
long now = SystemClock.uptimeMillis();
mLastViolationTime.put(crashFingerprint, now);
long timeSinceLastViolationMillis =
lastViolationTime == 0 ? Long.MAX_VALUE : (now - lastViolationTime);
- if ((info.policy & PENALTY_LOG) != 0 && sListener != null) {
- sListener.onViolation(info.crashInfo.stackTrace);
- }
if ((info.policy & PENALTY_LOG) != 0
&& timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
- if (info.durationMillis != -1) {
- Log.d(
- TAG,
- "StrictMode policy violation; ~duration="
- + info.durationMillis
- + " ms: "
- + info.crashInfo.stackTrace);
- } else {
- Log.d(TAG, "StrictMode policy violation: " + info.crashInfo.stackTrace);
- }
+ sLogger.log(info);
}
// The violationMaskSubset, passed to ActivityManager, is a
@@ -1925,11 +1934,11 @@ public final class StrictMode {
}
}
- if (penaltyLog && sListener != null) {
- sListener.onViolation(originStack.toString());
+ if (penaltyLog && sLogger != null) {
+ sLogger.log(info);
}
if (penaltyLog && timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
- Log.e(TAG, message, originStack);
+ sLogger.log(info);
}
int violationMaskSubset = PENALTY_DROPBOX | (ALL_VM_DETECT_BITS & sVmPolicy.mask);
@@ -2339,11 +2348,12 @@ public final class StrictMode {
*
* @hide
*/
- public static class ViolationInfo implements Parcelable {
+ @TestApi
+ public static final class ViolationInfo implements Parcelable {
public final String message;
/** Stack and other stuff info. */
- public final ApplicationErrorReport.CrashInfo crashInfo;
+ @Nullable public final ApplicationErrorReport.CrashInfo crashInfo;
/** The strict mode policy mask at the time of violation. */
public final int policy;