summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author atrost <atrost@google.com> 2019-09-26 10:45:54 -0700
committer android-build-merger <android-build-merger@google.com> 2019-09-26 10:45:54 -0700
commit604f8002d89303f31b6554d2bc3b8cc10ca86a05 (patch)
tree30a4e7712027d03d57f05cf09e871b9b1e0b7bac
parentfc997d2d3a50b6cf970ad5dfe5de0a115b86c1fc (diff)
parent76191fa6b024aa9d53fa627eb0be65b8ace2afe2 (diff)
Merge "Refactor ChangeReporter and rate limit stats logging." am: 9a253e12cc
am: 76191fa6b0 Change-Id: I8c853fb3e09a83ad877f02132608884cfaba966f
-rw-r--r--core/java/android/app/AppCompatCallbacks.java11
-rw-r--r--core/java/com/android/internal/compat/ChangeReporter.java102
-rw-r--r--services/core/java/com/android/server/compat/PlatformCompat.java9
3 files changed, 81 insertions, 41 deletions
diff --git a/core/java/android/app/AppCompatCallbacks.java b/core/java/android/app/AppCompatCallbacks.java
index 08c97eb284e3..19d158dedd06 100644
--- a/core/java/android/app/AppCompatCallbacks.java
+++ b/core/java/android/app/AppCompatCallbacks.java
@@ -18,7 +18,6 @@ package android.app;
import android.compat.Compatibility;
import android.os.Process;
-import android.util.Log;
import android.util.StatsLog;
import com.android.internal.compat.ChangeReporter;
@@ -31,8 +30,6 @@ import java.util.Arrays;
* @hide
*/
public final class AppCompatCallbacks extends Compatibility.Callbacks {
- private static final String TAG = "Compatibility";
-
private final long[] mDisabledChanges;
private final ChangeReporter mChangeReporter;
@@ -48,7 +45,8 @@ public final class AppCompatCallbacks extends Compatibility.Callbacks {
private AppCompatCallbacks(long[] disabledChanges) {
mDisabledChanges = Arrays.copyOf(disabledChanges, disabledChanges.length);
Arrays.sort(mDisabledChanges);
- mChangeReporter = new ChangeReporter();
+ mChangeReporter = new ChangeReporter(
+ StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__SOURCE__APP_PROCESS);
}
protected void reportChange(long changeId) {
@@ -67,10 +65,7 @@ public final class AppCompatCallbacks extends Compatibility.Callbacks {
private void reportChange(long changeId, int state) {
int uid = Process.myUid();
- //TODO(b/138374585): Implement rate limiting for the logs.
- Log.d(TAG, ChangeReporter.createLogString(uid, changeId, state));
- mChangeReporter.reportChange(uid, changeId,
- state, /* source */StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__SOURCE__APP_PROCESS);
+ mChangeReporter.reportChange(uid, changeId, state);
}
}
diff --git a/core/java/com/android/internal/compat/ChangeReporter.java b/core/java/com/android/internal/compat/ChangeReporter.java
index 1ce071bd005a..5ea970d4c746 100644
--- a/core/java/com/android/internal/compat/ChangeReporter.java
+++ b/core/java/com/android/internal/compat/ChangeReporter.java
@@ -16,14 +16,89 @@
package com.android.internal.compat;
+import android.util.Log;
+import android.util.Slog;
import android.util.StatsLog;
+import com.android.internal.annotations.GuardedBy;
+
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Set;
+
/**
* A helper class to report changes to stats log.
*
* @hide
*/
public final class ChangeReporter {
+ private static final String TAG = "CompatibilityChangeReporter";
+ private int mSource;
+
+ private final class ChangeReport {
+ int mUid;
+ long mChangeId;
+ int mState;
+
+ ChangeReport(int uid, long changeId, int state) {
+ mUid = uid;
+ mChangeId = changeId;
+ mState = state;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ChangeReport that = (ChangeReport) o;
+ return mUid == that.mUid
+ && mChangeId == that.mChangeId
+ && mState == that.mState;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mUid, mChangeId, mState);
+ }
+ }
+
+ @GuardedBy("mReportedChanges")
+ private Set<ChangeReport> mReportedChanges = new HashSet<>();
+
+ public ChangeReporter(int source) {
+ mSource = source;
+ }
+
+ /**
+ * Report the change to stats log.
+ *
+ * @param uid affected by the change
+ * @param changeId the reported change id
+ * @param state of the reported change - enabled/disabled/only logged
+ */
+ public void reportChange(int uid, long changeId, int state) {
+ debugLog(uid, changeId, state);
+ ChangeReport report = new ChangeReport(uid, changeId, state);
+ synchronized (mReportedChanges) {
+ if (!mReportedChanges.contains(report)) {
+ StatsLog.write(StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED, uid, changeId,
+ state, mSource);
+ mReportedChanges.add(report);
+ }
+ }
+ }
+
+ private void debugLog(int uid, long changeId, int state) {
+ //TODO(b/138374585): Implement rate limiting for the logs.
+ String message = String.format("Compat change id reported: %d; UID %d; state: %s", changeId,
+ uid, stateToString(state));
+ if (mSource == StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__SOURCE__SYSTEM_SERVER) {
+ Slog.d(TAG, message);
+ } else {
+ Log.d(TAG, message);
+ }
+
+ }
/**
* Transforms StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__STATE enum to a string.
@@ -43,31 +118,4 @@ public final class ChangeReporter {
return "UNKNOWN";
}
}
-
- /**
- * Constructs and returns a string to be logged to logcat when a change is reported.
- *
- * @param uid affected by the change
- * @param changeId the reported change id
- * @param state of the reported change - enabled/disabled/only logged
- * @return string to log
- */
- public static String createLogString(int uid, long changeId, int state) {
- return String.format("Compat change id reported: %d; UID %d; state: %s", changeId, uid,
- stateToString(state));
- }
-
- /**
- * Report the change to stats log.
- *
- * @param uid affected by the change
- * @param changeId the reported change id
- * @param state of the reported change - enabled/disabled/only logged
- * @param source of the logging - app process or system server
- */
- public void reportChange(int uid, long changeId, int state, int source) {
- //TODO(b/138374585): Implement rate limiting for stats log.
- StatsLog.write(StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED, uid, changeId,
- state, source);
- }
}
diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java
index 33d8dec8b043..8e09d0e5958e 100644
--- a/services/core/java/com/android/server/compat/PlatformCompat.java
+++ b/services/core/java/com/android/server/compat/PlatformCompat.java
@@ -41,7 +41,8 @@ public class PlatformCompat extends IPlatformCompat.Stub {
public PlatformCompat(Context context) {
mContext = context;
- mChangeReporter = new ChangeReporter();
+ mChangeReporter = new ChangeReporter(
+ StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__SOURCE__SYSTEM_SERVER);
}
@Override
@@ -96,10 +97,6 @@ public class PlatformCompat extends IPlatformCompat.Stub {
private void reportChange(long changeId, ApplicationInfo appInfo, int state) {
int uid = appInfo.uid;
- //TODO(b/138374585): Implement rate limiting for the logs.
- Slog.d(TAG, ChangeReporter.createLogString(uid, changeId, state));
- mChangeReporter.reportChange(uid, changeId,
- state, /* source */
- StatsLog.APP_COMPATIBILITY_CHANGE_REPORTED__SOURCE__SYSTEM_SERVER);
+ mChangeReporter.reportChange(uid, changeId, state);
}
}