diff options
author | 2024-12-27 16:43:35 -0800 | |
---|---|---|
committer | 2024-12-27 16:43:35 -0800 | |
commit | 82a34378261f8d7423a2de49b352bf7981df6327 (patch) | |
tree | f266417a6139652524145aaac8b92f20f48954e3 | |
parent | e4ddaa6c723194d75c11f3fcebc434eec749b2c8 (diff) |
[res] Enable zero-copy assets access
libziparchive supports using the provided memory buffers
directly when exracting compressed files, but it requires
explicit opt in in the implementation of its interfaces.
This CL ensures the functions we use for reading compressed
assets use those.
Flag: EXEMPT small optimization
Test: build + boot + atest libandroidfw_tests
Change-Id: I6bcb73081e027b503b8513cf1d732c556df39012
-rw-r--r-- | libs/androidfw/ZipUtils.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/libs/androidfw/ZipUtils.cpp b/libs/androidfw/ZipUtils.cpp index a1385f2cf7b1..f7f62c51a25b 100644 --- a/libs/androidfw/ZipUtils.cpp +++ b/libs/androidfw/ZipUtils.cpp @@ -87,19 +87,29 @@ class BufferReader final : public zip_archive::Reader { } bool ReadAtOffset(uint8_t* buf, size_t len, off64_t offset) const override { - if (mInputSize < len || offset > mInputSize - len) { - return false; - } - - const incfs::map_ptr<uint8_t> pos = mInput.offset(offset); - if (!pos.verify(len)) { + auto in = AccessAtOffset(buf, len, offset); + if (!in) { return false; } - - memcpy(buf, pos.unsafe_ptr(), len); + memcpy(buf, in, len); return true; } + const uint8_t* AccessAtOffset(uint8_t*, size_t len, off64_t offset) const override { + if (offset > mInputSize - len) { + return nullptr; + } + const incfs::map_ptr<uint8_t> pos = mInput.offset(offset); + if (!pos.verify(len)) { + return nullptr; + } + return pos.unsafe_ptr(); + } + + bool IsZeroCopy() const override { + return true; + } + private: const incfs::map_ptr<uint8_t> mInput; const size_t mInputSize; @@ -107,7 +117,7 @@ class BufferReader final : public zip_archive::Reader { class BufferWriter final : public zip_archive::Writer { public: - BufferWriter(void* output, size_t outputSize) : Writer(), + BufferWriter(void* output, size_t outputSize) : mOutput(reinterpret_cast<uint8_t*>(output)), mOutputSize(outputSize), mBytesWritten(0) { } @@ -121,6 +131,12 @@ class BufferWriter final : public zip_archive::Writer { return true; } + Buffer GetBuffer(size_t length) override { + const auto remaining_size = mOutputSize - mBytesWritten; + return remaining_size >= length + ? Buffer(mOutput + mBytesWritten, remaining_size) : Buffer(); + } + private: uint8_t* const mOutput; const size_t mOutputSize; |