diff --git a/core/java/android/os/image/DynamicSystemManager.java b/core/java/android/os/image/DynamicSystemManager.java index 7f01cad940ece..e8e47857ecba3 100644 --- a/core/java/android/os/image/DynamicSystemManager.java +++ b/core/java/android/os/image/DynamicSystemManager.java @@ -269,4 +269,16 @@ public class DynamicSystemManager { throw new RuntimeException(e.toString()); } } + + /** + * Returns the suggested scratch partition size for overlayFS. + */ + @RequiresPermission(android.Manifest.permission.MANAGE_DYNAMIC_SYSTEM) + public long suggestScratchSize() { + try { + return mService.suggestScratchSize(); + } catch (RemoteException e) { + throw new RuntimeException(e.toString()); + } + } } diff --git a/core/java/android/os/image/IDynamicSystemService.aidl b/core/java/android/os/image/IDynamicSystemService.aidl index df0a69b472251..a5a40ad55853f 100644 --- a/core/java/android/os/image/IDynamicSystemService.aidl +++ b/core/java/android/os/image/IDynamicSystemService.aidl @@ -125,4 +125,9 @@ interface IDynamicSystemService * valid VBMeta block to retrieve the AVB key from. */ boolean getAvbPublicKey(out AvbPublicKey dst); + + /** + * Returns the suggested scratch partition size for overlayFS. + */ + long suggestScratchSize(); } diff --git a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/InstallationAsyncTask.java b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/InstallationAsyncTask.java index ac73f35517d63..4ef5e2b4f0900 100644 --- a/packages/DynamicSystemInstallationService/src/com/android/dynsystem/InstallationAsyncTask.java +++ b/packages/DynamicSystemInstallationService/src/com/android/dynsystem/InstallationAsyncTask.java @@ -20,6 +20,7 @@ import android.content.Context; import android.gsi.AvbPublicKey; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.MemoryFile; import android.os.ParcelFileDescriptor; import android.os.image.DynamicSystemManager; @@ -51,7 +52,8 @@ class InstallationAsyncTask extends AsyncTask UNSUPPORTED_PARTITIONS = - Arrays.asList("vbmeta", "boot", "userdata", "dtbo", "super_empty", "system_other"); + Arrays.asList( + "vbmeta", "boot", "userdata", "dtbo", "super_empty", "system_other", "scratch"); private class UnsupportedUrlException extends Exception { private UnsupportedUrlException(String message) { @@ -196,6 +198,22 @@ class InstallationAsyncTask extends AsyncTask progress.installedSize + MIN_PROGRESS_TO_PUBLISH) { + progress.installedSize = installedSize; + publishProgress(progress); + } + + Thread.sleep(100); + } + + if (mInstallationSession == null) { + throw new IOException( + "Failed to start installation with requested size: " + scratchSize); + } + // Reset installation session and verify that installation completes successfully. + mInstallationSession = null; + if (!mDynSystem.closePartition()) { + throw new IOException("Failed to complete partition installation: scratch"); + } + } + + private void installUserdata() throws IOException, InterruptedException { Thread thread = new Thread(() -> { mInstallationSession = mDynSystem.createPartition("userdata", mUserdataSize, false); }); - Log.d(TAG, "Creating partition: userdata"); + Log.d(TAG, "Creating partition: userdata, size = " + mUserdataSize); thread.start(); Progress progress = new Progress("userdata", mUserdataSize, mNumInstalledPartitions++); @@ -324,7 +383,7 @@ class InstallationAsyncTask extends AsyncTask