From 2b6fc4c92deac1572b68f3cfc326da0a230055a7 Mon Sep 17 00:00:00 2001 From: Alex Light Date: Wed, 22 Jun 2016 17:56:37 -0700 Subject: [PATCH] cp preopted files from B partition during PM init. This allows us to save space on the system partition while still having access to the preopted files. We do this on first boot when the "ro.cp_system_other_odex" property is set to 1. We do this during package manager initialization before scanning the system to see which apks need to be optimized again. Note that a separate script, run by init, is actually responsible for finding and copying the files. We simply request that it runs. Bug: 29278988 Change-Id: I8d7c790ad35b32a0ce1d87939f043419bae4d88a (cherry picked from commit 3dafee6c1820bf0946bab04b290c5a757112d3e7) --- .../android/server/pm/PackageManagerService.java | 40 +++++++++++++++++++--- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 00199730b0b7..7124135030f1 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -624,7 +624,7 @@ public class PackageManagerService extends IPackageManager.Stub { final ProtectedPackages mProtectedPackages = new ProtectedPackages(); - boolean mRestoredSettings; + boolean mFirstBoot; // System configuration read by SystemConfig. final int[] mGlobalGids; @@ -2217,6 +2217,34 @@ public class PackageManagerService extends IPackageManager.Stub { displayManager.getDisplay(Display.DEFAULT_DISPLAY).getMetrics(metrics); } + /** + * Requests that files preopted on a secondary system partition be copied to the data partition + * if possible. Note that the actual copying of the files is accomplished by init for security + * reasons. This simply requests that the copy takes place and awaits confirmation of its + * completion. See platform/system/extras/cppreopt/ for the implementation of the actual copy. + */ + private static void requestCopyPreoptedFiles() { + final int WAIT_TIME_MS = 100; + final String CP_PREOPT_PROPERTY = "sys.cppreopt"; + if (SystemProperties.getInt("ro.cp_system_other_odex", 0) == 1) { + SystemProperties.set(CP_PREOPT_PROPERTY, "requested"); + // We will wait for up to 100 seconds. + final long timeEnd = SystemClock.uptimeMillis() + 100 * 1000; + while (!SystemProperties.get(CP_PREOPT_PROPERTY).equals("finished")) { + try { + Thread.sleep(WAIT_TIME_MS); + } catch (InterruptedException e) { + // Do nothing + } + if (SystemClock.uptimeMillis() > timeEnd) { + SystemProperties.set(CP_PREOPT_PROPERTY, "timed-out"); + Slog.wtf(TAG, "cppreopt did not finish!"); + break; + } + } + } + } + public PackageManagerService(Context context, Installer installer, boolean factoryTest, boolean onlyCore) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_START, @@ -2318,7 +2346,11 @@ public class PackageManagerService extends IPackageManager.Stub { mFoundPolicyFile = SELinuxMMAC.readInstallPolicy(); - mRestoredSettings = mSettings.readLPw(sUserManager.getUsers(false)); + mFirstBoot = !mSettings.readLPw(sUserManager.getUsers(false)); + + if (mFirstBoot) { + requestCopyPreoptedFiles(); + } String customResolverActivity = Resources.getSystem().getString( R.string.config_customResolverActivity); @@ -2695,7 +2727,7 @@ public class PackageManagerService extends IPackageManager.Stub { // If this is the first boot or an update from pre-M, and it is a normal // boot, then we need to initialize the default preferred apps across // all defined users. - if (!onlyCore && (mPromoteSystemApps || !mRestoredSettings)) { + if (!onlyCore && (mPromoteSystemApps || mFirstBoot)) { for (UserInfo user : sUserManager.getUsers(true)) { mSettings.applyDefaultPreferredAppsLPw(this, user.id); applyFactoryDefaultBrowserLPw(user.id); @@ -2853,7 +2885,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean isFirstBoot() { - return !mRestoredSettings; + return mFirstBoot; } @Override -- 2.11.0