diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index ef7c93d6502fd..361629b0a629e 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -178,6 +178,7 @@ import com.android.server.SystemServiceManager; import com.android.server.pm.PackageList; import com.android.server.pm.parsing.pkg.AndroidPackage; import com.android.server.pm.pkg.component.ParsedAttribution; +import com.android.server.policy.AppOpsPolicy; import dalvik.annotation.optimization.NeverCompile; @@ -6231,8 +6232,8 @@ public class AppOpsService extends IAppOpsService.Stub { } } if (mAudioRestrictionManager.hasActiveRestrictions() && dumpOp < 0 - && dumpPackage != null && dumpMode < 0 && !dumpWatchers && !dumpWatchers) { - needSep = mAudioRestrictionManager.dump(pw) | needSep ; + && dumpPackage != null && dumpMode < 0 && !dumpWatchers) { + needSep = mAudioRestrictionManager.dump(pw) || needSep; } if (needSep) { pw.println(); @@ -6508,6 +6509,17 @@ public class AppOpsService extends IAppOpsService.Stub { ipw.decreaseIndent(); } } + + if (!dumpHistory && !dumpWatchers) { + pw.println(); + if (mCheckOpsDelegateDispatcher.mPolicy != null + && mCheckOpsDelegateDispatcher.mPolicy instanceof AppOpsPolicy) { + AppOpsPolicy policy = (AppOpsPolicy) mCheckOpsDelegateDispatcher.mPolicy; + policy.dumpTags(pw); + } else { + pw.println(" AppOps policy not set."); + } + } } // Must not hold the appops lock diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index 4ad6ed1f45e27..70d69c6635721 100644 --- a/services/core/java/com/android/server/policy/AppOpsPolicy.java +++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java @@ -55,6 +55,7 @@ import com.android.internal.util.function.TriFunction; import com.android.internal.util.function.UndecFunction; import com.android.server.LocalServices; +import java.io.PrintWriter; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -283,6 +284,33 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat attributionSource, skipProxyOperation); } + /** + * Write location and activity recognition tags to console. + * See also {@code adb shell dumpsys appops}. + */ + public void dumpTags(PrintWriter writer) { + if (!mLocationTags.isEmpty()) { + writer.println(" AppOps policy location tags:"); + writeTags(mLocationTags, writer); + writer.println(); + } + if (!mActivityRecognitionTags.isEmpty()) { + writer.println(" AppOps policy activity recognition tags:"); + writeTags(mActivityRecognitionTags, writer); + writer.println(); + } + } + + private void writeTags(Map tags, PrintWriter writer) { + int counter = 0; + for (Map.Entry tagEntry : tags.entrySet()) { + writer.print(" #"); writer.print(counter++); writer.print(": "); + writer.print(tagEntry.getKey().toString()); writer.print("="); + tagEntry.getValue().dump(writer); + } + } + + private int resolveDatasourceOp(int code, int uid, @NonNull String packageName, @Nullable String attributionTag) { code = resolveRecordAudioOp(code, uid);