Add tracing dectorator for PermissionManagerService

Add tracing dectorator for PermissionManagerService to monitor
performance regressions and debugging performance issues

Bug: 284205103
Test: Presubmit
Change-Id: Ia4032728121afb031b8dd8db8916809b6264c0fa
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceTracingDecorator.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceTracingDecorator.java
new file mode 100644
index 0000000..4e72fae
--- /dev/null
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceTracingDecorator.java
@@ -0,0 +1,659 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm.permission;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.permission.SplitPermissionInfoParcelable;
+import android.os.Trace;
+import android.permission.IOnPermissionsChangeListener;
+
+import com.android.server.pm.pkg.AndroidPackage;
+import com.android.server.pm.pkg.PackageState;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Surrounds all PermissionManagerServiceInterface method calls with Trace.traceBegin and
+ * Trace.traceEnd. These traces are used for identifying permission issues and testing.
+ */
+public class PermissionManagerServiceTracingDecorator implements PermissionManagerServiceInterface {
+    private static final long TRACE_TAG = Trace.TRACE_TAG_PACKAGE_MANAGER;
+
+    @NonNull
+    private final PermissionManagerServiceInterface mService;
+
+    public PermissionManagerServiceTracingDecorator(
+            @NonNull PermissionManagerServiceInterface service
+    ) {
+        mService = service;
+    }
+
+    @Nullable
+    @Override
+    public byte[] backupRuntimePermissions(int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#backupRuntimePermissions");
+        try {
+            return mService.backupRuntimePermissions(userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void restoreRuntimePermissions(@NonNull byte[] backup, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#restoreRuntimePermissions");
+        try {
+            mService.restoreRuntimePermissions(backup, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void restoreDelayedRuntimePermissions(@NonNull String packageName, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#restoreDelayedRuntimePermissions");
+        try {
+            mService.restoreDelayedRuntimePermissions(packageName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#dump");
+        try {
+            mService.dump(fd, pw, args);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public List<PermissionGroupInfo> getAllPermissionGroups(int flags) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAllPermissionGroups");
+        try {
+            return mService.getAllPermissionGroups(flags);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getPermissionGroupInfo");
+        try {
+            return mService.getPermissionGroupInfo(groupName, flags);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public PermissionInfo getPermissionInfo(@NonNull String permName, int flags,
+            @NonNull String opPackageName) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#getPermissionInfo");
+        try {
+            return mService.getPermissionInfo(permName, flags, opPackageName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public List<PermissionInfo> queryPermissionsByGroup(String groupName, int flags) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#queryPermissionsByGroup");
+        try {
+            return mService.queryPermissionsByGroup(groupName, flags);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean addPermission(PermissionInfo info, boolean async) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#addPermission");
+        try {
+            return mService.addPermission(info, async);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void removePermission(String permName) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#removePermission");
+        try {
+            mService.removePermission(permName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public int getPermissionFlags(String packageName, String permName, int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#getPermissionFlags");
+        try {
+            return mService.getPermissionFlags(packageName, permName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void updatePermissionFlags(String packageName, String permName, int flagMask,
+            int flagValues, boolean checkAdjustPolicyFlagPermission, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#updatePermissionFlags");
+        try {
+            mService.updatePermissionFlags(packageName, permName, flagMask, flagValues,
+                    checkAdjustPolicyFlagPermission, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void updatePermissionFlagsForAllApps(int flagMask, int flagValues, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#updatePermissionFlagsForAllApps");
+        try {
+            mService.updatePermissionFlagsForAllApps(flagMask, flagValues, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#addOnPermissionsChangeListener");
+        try {
+            mService.addOnPermissionsChangeListener(listener);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void removeOnPermissionsChangeListener(
+            IOnPermissionsChangeListener listener) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#removeOnPermissionsChangeListener");
+        try {
+            mService.removeOnPermissionsChangeListener(listener);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean addAllowlistedRestrictedPermission(@NonNull String packageName,
+            @NonNull String permName, int flags, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#addAllowlistedRestrictedPermission");
+        try {
+            return mService.addAllowlistedRestrictedPermission(packageName, permName, flags,
+                    userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public List<String> getAllowlistedRestrictedPermissions(@NonNull String packageName, int flags,
+            int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAllowlistedRestrictedPermissions");
+        try {
+            return mService.getAllowlistedRestrictedPermissions(packageName, flags, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean removeAllowlistedRestrictedPermission(@NonNull String packageName,
+            @NonNull String permName, int flags, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#removeAllowlistedRestrictedPermission");
+        try {
+            return mService.removeAllowlistedRestrictedPermission(packageName, permName, flags,
+                    userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void grantRuntimePermission(String packageName, String permName, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#grantRuntimePermission");
+        try {
+            mService.grantRuntimePermission(packageName, permName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void revokeRuntimePermission(String packageName, String permName, int userId,
+            String reason) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#revokeRuntimePermission");
+        try {
+            mService.revokeRuntimePermission(packageName, permName, userId, reason);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl"
+                + "#revokePostNotificationPermissionWithoutKillForTest");
+        try {
+            mService.revokePostNotificationPermissionWithoutKillForTest(packageName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean shouldShowRequestPermissionRationale(String packageName, String permName,
+            int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#shouldShowRequestPermissionRationale");
+        try {
+            return mService.shouldShowRequestPermissionRationale(packageName, permName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean isPermissionRevokedByPolicy(String packageName, String permName, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#isPermissionRevokedByPolicy");
+        try {
+            return mService.isPermissionRevokedByPolicy(packageName, permName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public List<SplitPermissionInfoParcelable> getSplitPermissions() {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getSplitPermissions");
+        try {
+            return mService.getSplitPermissions();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public int checkPermission(String pkgName, String permName, int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#checkPermission");
+        try {
+            return mService.checkPermission(pkgName, permName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public int checkUidPermission(int uid, String permName) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#checkUidPermission");
+        try {
+            return mService.checkUidPermission(uid, permName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public Map<String, Set<String>> getAllAppOpPermissionPackages() {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAllAppOpPermissionPackages");
+        try {
+            return mService.getAllAppOpPermissionPackages();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public boolean isPermissionsReviewRequired(@NonNull String packageName, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#isPermissionsReviewRequired");
+        try {
+            return mService.isPermissionsReviewRequired(packageName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void resetRuntimePermissions(@NonNull AndroidPackage pkg, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#resetRuntimePermissions");
+        try {
+            mService.resetRuntimePermissions(pkg, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void resetRuntimePermissionsForUser(int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#resetRuntimePermissionsForUser");
+        try {
+            mService.resetRuntimePermissionsForUser(userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void readLegacyPermissionStateTEMP() {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#readLegacyPermissionStateTEMP");
+        try {
+            mService.readLegacyPermissionStateTEMP();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void writeLegacyPermissionStateTEMP() {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#writeLegacyPermissionStateTEMP");
+        try {
+            mService.writeLegacyPermissionStateTEMP();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public Set<String> getInstalledPermissions(@NonNull String packageName) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getInstalledPermissions");
+        try {
+            return mService.getInstalledPermissions(packageName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public Set<String> getGrantedPermissions(@NonNull String packageName, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getGrantedPermissions");
+        try {
+            return mService.getGrantedPermissions(packageName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public int[] getPermissionGids(@NonNull String permissionName, int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#getPermissionGids");
+        try {
+            return mService.getPermissionGids(permissionName, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAppOpPermissionPackages");
+        try {
+            return mService.getAppOpPermissionPackages(permissionName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Nullable
+    @Override
+    public Permission getPermissionTEMP(@NonNull String permName) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#getPermissionTEMP");
+        try {
+            return mService.getPermissionTEMP(permName);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public List<PermissionInfo> getAllPermissionsWithProtection(int protection) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAllPermissionsWithProtection");
+        try {
+            return mService.getAllPermissionsWithProtection(protection);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public List<PermissionInfo> getAllPermissionsWithProtectionFlags(int protectionFlags) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getAllPermissionsWithProtectionFlags");
+        try {
+            return mService.getAllPermissionsWithProtectionFlags(protectionFlags);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public List<LegacyPermission> getLegacyPermissions() {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getLegacyPermissions");
+        try {
+            return mService.getLegacyPermissions();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public LegacyPermissionState getLegacyPermissionState(int appId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getLegacyPermissionState");
+        try {
+            return mService.getLegacyPermissionState(appId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void readLegacyPermissionsTEMP(
+            @NonNull LegacyPermissionSettings legacyPermissionSettings) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#readLegacyPermissionsTEMP");
+        try {
+            mService.readLegacyPermissionsTEMP(legacyPermissionSettings);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void writeLegacyPermissionsTEMP(
+            @NonNull LegacyPermissionSettings legacyPermissionSettings) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#writeLegacyPermissionsTEMP");
+        try {
+            mService.writeLegacyPermissionsTEMP(legacyPermissionSettings);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Nullable
+    @Override
+    public String getDefaultPermissionGrantFingerprint(int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#getDefaultPermissionGrantFingerprint");
+        try {
+            return mService.getDefaultPermissionGrantFingerprint(userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void setDefaultPermissionGrantFingerprint(@NonNull String fingerprint, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#setDefaultPermissionGrantFingerprint");
+        try {
+            mService.setDefaultPermissionGrantFingerprint(fingerprint, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onSystemReady() {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onSystemReady");
+        try {
+            mService.onSystemReady();
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onStorageVolumeMounted(@NonNull String volumeUuid, boolean fingerprintChanged) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#onStorageVolumeMounted");
+        try {
+            mService.onStorageVolumeMounted(volumeUuid, fingerprintChanged);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @NonNull
+    @Override
+    public int[] getGidsForUid(int uid) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#getGidsForUid");
+        try {
+            return mService.getGidsForUid(uid);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onUserCreated(int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onUserCreated");
+        try {
+            mService.onUserCreated(userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onUserRemoved(int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onUserRemoved");
+        try {
+            mService.onUserRemoved(userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onPackageAdded(@NonNull PackageState packageState, boolean isInstantApp,
+            @Nullable AndroidPackage oldPkg) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onPackageAdded");
+        try {
+            mService.onPackageAdded(packageState, isInstantApp, oldPkg);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onPackageInstalled(@NonNull AndroidPackage pkg, int previousAppId,
+            @NonNull PermissionManagerServiceInternal.PackageInstalledParams params, int userId) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onPackageInstalled");
+        try {
+            mService.onPackageInstalled(pkg, previousAppId, params, userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onPackageRemoved(@NonNull AndroidPackage pkg) {
+        Trace.traceBegin(TRACE_TAG, "TaggedTracingPermissionManagerServiceImpl#onPackageRemoved");
+        try {
+            mService.onPackageRemoved(pkg);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+
+    @Override
+    public void onPackageUninstalled(@NonNull String packageName, int appId,
+            @NonNull PackageState packageState, @Nullable AndroidPackage pkg,
+            @NonNull List<AndroidPackage> sharedUserPkgs, int userId) {
+        Trace.traceBegin(TRACE_TAG,
+                "TaggedTracingPermissionManagerServiceImpl#onPackageUninstalled");
+        try {
+            mService.onPackageUninstalled(packageName, appId, packageState, pkg, sharedUserPkgs,
+                    userId);
+        } finally {
+            Trace.traceEnd(TRACE_TAG);
+        }
+    }
+}