diff options
| author | Tim Murray <timmurray@google.com> | 2021-06-24 17:13:06 -0700 |
|---|---|---|
| committer | Tim Murray <timmurray@google.com> | 2021-06-25 11:14:53 -0700 |
| commit | 8c37737cbc5d5a11d78defd330e532a6c3dcdaeb (patch) | |
| tree | 193b68f279ae0e439e19c5bcfd6537c2318d0d4f /core/java/android/os | |
| parent | 9b03c1c496649c8fc7b6f994801b8c77dd6803af (diff) | |
FileBridge: use a ByteBuffer for the temp buffer
Using a direct ByteBuffer allows the buffer to be passed to/from JNI
without intermediate copies.
Test: FileBridgeTests, apps get installed without allocation churn
Bug: 192020559
Change-Id: Ic5965c94ba14de6599af67d2e3bba33cd9996046
Diffstat (limited to 'core/java/android/os')
| -rw-r--r-- | core/java/android/os/FileBridge.java | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java index 7b84575a8955..9dcdbf93f296 100644 --- a/core/java/android/os/FileBridge.java +++ b/core/java/android/os/FileBridge.java @@ -32,6 +32,7 @@ import libcore.io.Streams; import java.io.FileDescriptor; import java.io.IOException; import java.io.OutputStream; +import java.nio.ByteBuffer; import java.nio.ByteOrder; /** @@ -95,9 +96,11 @@ public class FileBridge extends Thread { @Override public void run() { - final byte[] temp = new byte[8192]; + final ByteBuffer tempBuffer = ByteBuffer.allocateDirect(8192); + final byte[] temp = tempBuffer.hasArray() ? tempBuffer.array() : new byte[8192]; try { - while (IoBridge.read(mServer.getFileDescriptor(), temp, 0, MSG_LENGTH) == MSG_LENGTH) { + while (IoBridge.read(mServer.getFileDescriptor(), temp, + 0, MSG_LENGTH) == MSG_LENGTH) { final int cmd = Memory.peekInt(temp, 0, ByteOrder.BIG_ENDIAN); if (cmd == CMD_WRITE) { // Shuttle data into local file @@ -138,7 +141,10 @@ public class FileBridge extends Thread { public static class FileBridgeOutputStream extends OutputStream { private final ParcelFileDescriptor mClientPfd; private final FileDescriptor mClient; - private final byte[] mTemp = new byte[MSG_LENGTH]; + private final ByteBuffer mTempBuffer = ByteBuffer.allocateDirect(MSG_LENGTH); + private final byte[] mTemp = mTempBuffer.hasArray() + ? mTempBuffer.array() + : new byte[MSG_LENGTH]; public FileBridgeOutputStream(ParcelFileDescriptor clientPfd) { mClientPfd = clientPfd; |
