From a06573a8845bd258decc762ace807e0eaa58f342 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Wed, 24 Feb 2021 19:35:06 +0800 Subject: [PATCH] Move dump shared libraries into the ComputerEngine Reduce package manager lock contention in the dump function by moving the dumps to the ComputerEngine. Test: adb bugreport Bug: 178304105 Change-Id: Ief726e2e0c2aae54d5594d79a3e6e7e2cb46b0b5 --- .../java/com/android/server/pm/DumpState.java | 9 ++ .../server/pm/PackageManagerService.java | 109 +++++++++--------- 2 files changed, 63 insertions(+), 55 deletions(-) diff --git a/services/core/java/com/android/server/pm/DumpState.java b/services/core/java/com/android/server/pm/DumpState.java index 380cdb10569bc..6875b8a5abeb4 100644 --- a/services/core/java/com/android/server/pm/DumpState.java +++ b/services/core/java/com/android/server/pm/DumpState.java @@ -56,6 +56,7 @@ public final class DumpState { private boolean mTitlePrinted; private boolean mFullPreferred; + private boolean mCheckIn; private String mTargetPackageName; @@ -118,4 +119,12 @@ public final class DumpState { public void setFullPreferred(boolean fullPreferred) { mFullPreferred = fullPreferred; } + + public boolean isCheckIn() { + return mCheckIn; + } + + public void setCheckIn(boolean checkIn) { + mCheckIn = checkIn; + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 16966d4de4e62..892e2e566731a 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4403,6 +4403,7 @@ public class PackageManagerService extends IPackageManager.Stub public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) { final String packageName = dumpState.getTargetPackageName(); + final boolean checkin = dumpState.isCheckIn(); switch (type) { case DumpState.DUMP_VERSION: @@ -4415,6 +4416,56 @@ public class PackageManagerService extends IPackageManager.Stub break; } + case DumpState.DUMP_LIBS: + { + boolean printedHeader = false; + final int numSharedLibraries = mSharedLibraries.size(); + for (int index = 0; index < numSharedLibraries; index++) { + final String libName = mSharedLibraries.keyAt(index); + final WatchedLongSparseArray versionedLib = + mSharedLibraries.get(libName); + if (versionedLib == null) { + continue; + } + final int versionCount = versionedLib.size(); + for (int i = 0; i < versionCount; i++) { + SharedLibraryInfo libraryInfo = versionedLib.valueAt(i); + if (!checkin) { + if (!printedHeader) { + if (dumpState.onTitlePrinted()) { + pw.println(); + } + pw.println("Libraries:"); + printedHeader = true; + } + pw.print(" "); + } else { + pw.print("lib,"); + } + pw.print(libraryInfo.getName()); + if (libraryInfo.isStatic()) { + pw.print(" version=" + libraryInfo.getLongVersion()); + } + if (!checkin) { + pw.print(" -> "); + } + if (libraryInfo.getPath() != null) { + if (libraryInfo.isNative()) { + pw.print(" (so) "); + } else { + pw.print(" (jar) "); + } + pw.print(libraryInfo.getPath()); + } else { + pw.print(" (apk) "); + pw.print(libraryInfo.getPackageName()); + } + pw.println(); + } + } + break; + } + case DumpState.DUMP_PREFERRED_XML: { pw.flush(); @@ -23699,8 +23750,6 @@ public class PackageManagerService extends IPackageManager.Stub if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; DumpState dumpState = new DumpState(); - boolean checkin = false; - ArraySet permissionNames = null; int opti = 0; @@ -23750,7 +23799,7 @@ public class PackageManagerService extends IPackageManager.Stub pw.println(" : info about given package"); return; } else if ("--checkin".equals(opt)) { - checkin = true; + dumpState.setCheckIn(true); } else if ("--all-components".equals(opt)) { dumpState.setOptionEnabled(DumpState.OPTION_DUMP_ALL_COMPONENTS); } else if ("-f".equals(opt)) { @@ -23904,6 +23953,7 @@ public class PackageManagerService extends IPackageManager.Stub } final String packageName = dumpState.getTargetPackageName(); + final boolean checkin = dumpState.isCheckIn(); if (checkin) { pw.println("vers,1"); } @@ -23992,11 +24042,7 @@ public class PackageManagerService extends IPackageManager.Stub } if (dumpState.isDumping(DumpState.DUMP_LIBS) && packageName == null) { - // TODO: Move it to ComputerEngine once LongSparseArray is copied - // in snapshot. - synchronized (mLock) { - dumpSharedLibrariesLPr(pw, dumpState, checkin); - } + dump(DumpState.DUMP_LIBS, fd, pw, dumpState); } if (dumpState.isDumping(DumpState.DUMP_FEATURES) && packageName == null) { @@ -24337,53 +24383,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - private void dumpSharedLibrariesLPr(PrintWriter pw, DumpState dumpState, boolean checkin) { - boolean printedHeader = false; - final int numSharedLibraries = mSharedLibraries.size(); - for (int index = 0; index < numSharedLibraries; index++) { - final String libName = mSharedLibraries.keyAt(index); - WatchedLongSparseArray versionedLib = mSharedLibraries.get(libName); - if (versionedLib == null) { - continue; - } - final int versionCount = versionedLib.size(); - for (int i = 0; i < versionCount; i++) { - SharedLibraryInfo libraryInfo = versionedLib.valueAt(i); - if (!checkin) { - if (!printedHeader) { - if (dumpState.onTitlePrinted()) { - pw.println(); - } - pw.println("Libraries:"); - printedHeader = true; - } - pw.print(" "); - } else { - pw.print("lib,"); - } - pw.print(libraryInfo.getName()); - if (libraryInfo.isStatic()) { - pw.print(" version=" + libraryInfo.getLongVersion()); - } - if (!checkin) { - pw.print(" -> "); - } - if (libraryInfo.getPath() != null) { - if (libraryInfo.isNative()) { - pw.print(" (so) "); - } else { - pw.print(" (jar) "); - } - pw.print(libraryInfo.getPath()); - } else { - pw.print(" (apk) "); - pw.print(libraryInfo.getPackageName()); - } - pw.println(); - } - } - } - // ------- apps on sdcard specific code ------- static final boolean DEBUG_SD_INSTALL = false;