From beaf4d8692f8ec6d52aa33629c0d60f69c9aa747 Mon Sep 17 00:00:00 2001 From: Samiul Islam Date: Mon, 21 Feb 2022 15:29:05 +0000 Subject: [PATCH] Create sdk directory for an app only if app consumes sdk Currently, we create sdk directories for all apps. This means during boot time, when we create app data directory for system apps, we are now creating twice the amount of directories as before. This has significant impact on boot time. In order to avoid the regression, we are now limiting the creation to only when app actually consumes an sdk and needs these directories. We have introduced a new installd flag: FLAG_STORAGE_SDK, which needs to be passed to installd when sdk directory should be created for the app. Bug: 220095381 Bug: 217543371 Test: atest SupplementalProcessStorageHostTest Change-Id: I72af7c9460892bf7ac6d908a6a7ca6912167b894 --- core/java/android/os/storage/StorageManager.java | 5 ++++- .../core/java/com/android/server/pm/AppDataHelper.java | 3 ++- services/core/java/com/android/server/pm/Installer.java | 7 ++++++- services/core/java/com/android/server/pm/Settings.java | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java index 48e2827f19e15..dbf042063364d 100644 --- a/core/java/android/os/storage/StorageManager.java +++ b/core/java/android/os/storage/StorageManager.java @@ -273,12 +273,15 @@ public class StorageManager { public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE; /** {@hide} */ public static final int FLAG_STORAGE_EXTERNAL = IInstalld.FLAG_STORAGE_EXTERNAL; + /** @hide */ + public static final int FLAG_STORAGE_SDK = IInstalld.FLAG_STORAGE_SDK; /** {@hide} */ @IntDef(prefix = "FLAG_STORAGE_", value = { FLAG_STORAGE_DE, FLAG_STORAGE_CE, - FLAG_STORAGE_EXTERNAL + FLAG_STORAGE_EXTERNAL, + FLAG_STORAGE_SDK, }) @Retention(RetentionPolicy.SOURCE) public @interface StorageFlags {} diff --git a/services/core/java/com/android/server/pm/AppDataHelper.java b/services/core/java/com/android/server/pm/AppDataHelper.java index 0b0d1458c8de7..c24bfec5fb43d 100644 --- a/services/core/java/com/android/server/pm/AppDataHelper.java +++ b/services/core/java/com/android/server/pm/AppDataHelper.java @@ -218,8 +218,9 @@ final class AppDataHelper { final String seInfo = pkgSeInfo + seInfoUser; final int targetSdkVersion = pkg.getTargetSdkVersion(); + final boolean usesSdk = !pkg.getUsesSdkLibraries().isEmpty(); final CreateAppDataArgs args = Installer.buildCreateAppDataArgs(volumeUuid, packageName, - userId, flags, appId, seInfo, targetSdkVersion); + userId, flags, appId, seInfo, targetSdkVersion, usesSdk); args.previousAppId = previousAppId; return batch.createAppData(args).whenComplete((ceDataInode, e) -> { diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java index 742cc0237ceca..36bad3e604d52 100644 --- a/services/core/java/com/android/server/pm/Installer.java +++ b/services/core/java/com/android/server/pm/Installer.java @@ -92,6 +92,7 @@ public class Installer extends SystemService { public static final int FLAG_STORAGE_DE = IInstalld.FLAG_STORAGE_DE; public static final int FLAG_STORAGE_CE = IInstalld.FLAG_STORAGE_CE; public static final int FLAG_STORAGE_EXTERNAL = IInstalld.FLAG_STORAGE_EXTERNAL; + public static final int FLAG_STORAGE_SDK = IInstalld.FLAG_STORAGE_SDK; public static final int FLAG_CLEAR_CACHE_ONLY = IInstalld.FLAG_CLEAR_CACHE_ONLY; public static final int FLAG_CLEAR_CODE_CACHE_ONLY = IInstalld.FLAG_CLEAR_CODE_CACHE_ONLY; @@ -190,12 +191,16 @@ public class Installer extends SystemService { // We explicitly do NOT set previousAppId because the default value should always be 0. // Manually override previousAppId after building CreateAppDataArgs for specific behaviors. static CreateAppDataArgs buildCreateAppDataArgs(String uuid, String packageName, - int userId, int flags, int appId, String seInfo, int targetSdkVersion) { + int userId, int flags, int appId, String seInfo, int targetSdkVersion, + boolean usesSdk) { final CreateAppDataArgs args = new CreateAppDataArgs(); args.uuid = uuid; args.packageName = packageName; args.userId = userId; args.flags = flags; + if (usesSdk) { + args.flags |= FLAG_STORAGE_SDK; + } args.appId = appId; args.seInfo = seInfo; args.targetSdkVersion = targetSdkVersion; diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index d3665749a7f88..86d7b517ea766 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4190,10 +4190,11 @@ public final class Settings implements Watchable, Snappable { // Accumulate all required args and call the installer after mPackages lock // has been released final String seInfo = AndroidPackageUtils.getSeInfo(ps.getPkg(), ps); + final boolean usesSdk = !ps.getPkg().getUsesSdkLibraries().isEmpty(); final CreateAppDataArgs args = Installer.buildCreateAppDataArgs( ps.getVolumeUuid(), ps.getPackageName(), userHandle, StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE, - ps.getAppId(), seInfo, ps.getPkg().getTargetSdkVersion()); + ps.getAppId(), seInfo, ps.getPkg().getTargetSdkVersion(), usesSdk); batch.createAppData(args); } else { // Make sure the app is excluded from storage mapping for this user