summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2025-02-06 17:13:56 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2025-02-06 17:13:56 -0800
commit5e52167ba4b5314cfbc7c47f820b5b109a8a7a04 (patch)
treee58180bae370d9be7130371c1ea23a2905618423
parent6f4e842af91c5b0cd956f26d6ac6484d3444e674 (diff)
parentb29051d45ca53c89a54395d58c02f92e6cc45dd4 (diff)
Merge "Use IoThread handler for AppOpsService background/IO work" into main
-rw-r--r--core/java/android/permission/flags.aconfig8
-rw-r--r--services/core/java/com/android/server/appop/AppOpsService.java29
2 files changed, 29 insertions, 8 deletions
diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig
index a480a3b013bb..daa5584462ba 100644
--- a/core/java/android/permission/flags.aconfig
+++ b/core/java/android/permission/flags.aconfig
@@ -499,3 +499,11 @@ flag {
description: "Collect sqlite performance metrics for discrete ops."
bug: "377584611"
}
+
+flag {
+ name: "app_ops_service_handler_fix"
+ is_fixed_read_only: true
+ namespace: "permissions"
+ description: "Use IoThread handler for AppOpsService background/IO work."
+ bug: "394380603"
+}
diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java
index 32c4e9b1727e..2a9762caaf79 100644
--- a/services/core/java/com/android/server/appop/AppOpsService.java
+++ b/services/core/java/com/android/server/appop/AppOpsService.java
@@ -72,6 +72,7 @@ import static android.content.Intent.EXTRA_REPLACING;
import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS;
import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP;
import static android.os.Flags.binderFrozenStateChangeCallback;
+import static android.permission.flags.Flags.appOpsServiceHandlerFix;
import static android.permission.flags.Flags.checkOpValidatePackage;
import static android.permission.flags.Flags.deviceAwareAppOpNewSchemaEnabled;
import static android.permission.flags.Flags.useFrozenAwareRemoteCallbackList;
@@ -174,6 +175,7 @@ import com.android.internal.util.XmlUtils;
import com.android.internal.util.function.pooled.PooledLambda;
import com.android.modules.utils.TypedXmlPullParser;
import com.android.modules.utils.TypedXmlSerializer;
+import com.android.server.IoThread;
import com.android.server.LocalManagerRegistry;
import com.android.server.LocalServices;
import com.android.server.LockGuard;
@@ -277,6 +279,7 @@ public class AppOpsService extends IAppOpsService.Stub {
final AtomicFile mStorageFile;
final AtomicFile mRecentAccessesFile;
private final @Nullable File mNoteOpCallerStacktracesFile;
+ /* AMS handler, this shouldn't be used for IO */
final Handler mHandler;
private final AppOpsRecentAccessPersistence mRecentAccessPersistence;
@@ -1411,7 +1414,7 @@ public class AppOpsService extends IAppOpsService.Stub {
@GuardedBy("this")
private void packageRemovedLocked(int uid, String packageName) {
- mHandler.post(PooledLambda.obtainRunnable(HistoricalRegistry::clearHistory,
+ getIoHandler().post(PooledLambda.obtainRunnable(HistoricalRegistry::clearHistory,
mHistoricalRegistry, uid, packageName));
UidState uidState = mUidStates.get(uid);
@@ -1693,7 +1696,7 @@ public class AppOpsService extends IAppOpsService.Stub {
if (mWriteScheduled) {
mWriteScheduled = false;
mFastWriteScheduled = false;
- mHandler.removeCallbacks(mWriteRunner);
+ getIoHandler().removeCallbacks(mWriteRunner);
doWrite = true;
}
}
@@ -1979,7 +1982,7 @@ public class AppOpsService extends IAppOpsService.Stub {
new String[attributionChainExemptPackages.size()]) : null;
// Must not hold the appops lock
- mHandler.post(PooledLambda.obtainRunnable(HistoricalRegistry::getHistoricalOps,
+ getIoHandler().post(PooledLambda.obtainRunnable(HistoricalRegistry::getHistoricalOps,
mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray, dataType,
filter, beginTimeMillis, endTimeMillis, flags, chainExemptPkgArray,
callback).recycleOnUse());
@@ -2010,7 +2013,8 @@ public class AppOpsService extends IAppOpsService.Stub {
new String[attributionChainExemptPackages.size()]) : null;
// Must not hold the appops lock
- mHandler.post(PooledLambda.obtainRunnable(HistoricalRegistry::getHistoricalOpsFromDiskRaw,
+ getIoHandler().post(PooledLambda.obtainRunnable(
+ HistoricalRegistry::getHistoricalOpsFromDiskRaw,
mHistoricalRegistry, uid, packageName, attributionTag, opNamesArray, dataType,
filter, beginTimeMillis, endTimeMillis, flags, chainExemptPkgArray,
callback).recycleOnUse());
@@ -5074,7 +5078,7 @@ public class AppOpsService extends IAppOpsService.Stub {
private void scheduleWriteLocked() {
if (!mWriteScheduled) {
mWriteScheduled = true;
- mHandler.postDelayed(mWriteRunner, WRITE_DELAY);
+ getIoHandler().postDelayed(mWriteRunner, WRITE_DELAY);
}
}
@@ -5082,8 +5086,8 @@ public class AppOpsService extends IAppOpsService.Stub {
if (!mFastWriteScheduled) {
mWriteScheduled = true;
mFastWriteScheduled = true;
- mHandler.removeCallbacks(mWriteRunner);
- mHandler.postDelayed(mWriteRunner, 10*1000);
+ getIoHandler().removeCallbacks(mWriteRunner);
+ getIoHandler().postDelayed(mWriteRunner, 10 * 1000);
}
}
@@ -5957,7 +5961,8 @@ public class AppOpsService extends IAppOpsService.Stub {
final long token = Binder.clearCallingIdentity();
try {
synchronized (shell.mInternal) {
- shell.mInternal.mHandler.removeCallbacks(shell.mInternal.mWriteRunner);
+ shell.mInternal.getIoHandler().removeCallbacks(
+ shell.mInternal.mWriteRunner);
}
shell.mInternal.writeRecentAccesses();
shell.mInternal.mAppOpsCheckingService.writeState();
@@ -7884,4 +7889,12 @@ public class AppOpsService extends IAppOpsService.Stub {
return null;
}
}
+
+ private Handler getIoHandler() {
+ if (appOpsServiceHandlerFix()) {
+ return IoThread.getHandler();
+ } else {
+ return mHandler;
+ }
+ }
}