diff options
author | Jeff Sharkey <jsharkey@android.com> | 2014-05-22 10:52:49 -0700 |
---|---|---|
committer | Jeff Sharkey <jsharkey@android.com> | 2014-05-22 15:54:16 -0700 |
commit | 78cc340c2de873d6995c283b777476f7237d690f (patch) | |
tree | 0caa23deae4f8e720a66430b2523168e8d8a1afe /core/java/android/content/pm | |
parent | 05ad48206a082057e17723d32493c153faa6881e (diff) | |
download | frameworks_base-78cc340c2de873d6995c283b777476f7237d690f.zip frameworks_base-78cc340c2de873d6995c283b777476f7237d690f.tar.gz frameworks_base-78cc340c2de873d6995c283b777476f7237d690f.tar.bz2 |
Offer to stream and fsync() install sessions.
Installers are interested in both streaming APK data and establishing
a happens-after relationship to support resuming downloads after a
process kill or battery pull.
This exposes a generic OutputStream for writing, and hooks up flush()
to be a blocking call which returns only when all outstanding write()
data has been fsync()'ed to disk.
Tests to verify behavior.
Bug: 14975160
Change-Id: I38289867c80ac659163bb0c2158ef12d99cc570d
Diffstat (limited to 'core/java/android/content/pm')
-rw-r--r-- | core/java/android/content/pm/PackageInstaller.java | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java index d7bd473..4672015 100644 --- a/core/java/android/content/pm/PackageInstaller.java +++ b/core/java/android/content/pm/PackageInstaller.java @@ -19,9 +19,12 @@ package android.content.pm; import android.app.PackageInstallObserver; import android.app.PackageUninstallObserver; import android.content.pm.PackageManager.NameNotFoundException; +import android.os.FileBridge; import android.os.ParcelFileDescriptor; import android.os.RemoteException; +import java.io.OutputStream; + /** {@hide} */ public class PackageInstaller { private final PackageManager mPm; @@ -127,10 +130,17 @@ public class PackageInstaller { } } - public ParcelFileDescriptor openWrite(String overlayName, long offsetBytes, - long lengthBytes) { + /** + * Open an APK file for writing, starting at the given offset. You can + * then stream data into the file, periodically calling + * {@link OutputStream#flush()} to ensure bytes have been written to + * disk. + */ + public OutputStream openWrite(String splitName, long offsetBytes, long lengthBytes) { try { - return mSession.openWrite(overlayName, offsetBytes, lengthBytes); + final ParcelFileDescriptor clientSocket = mSession.openWrite(splitName, + offsetBytes, lengthBytes); + return new FileBridge.FileBridgeOutputStream(clientSocket.getFileDescriptor()); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } |