From 82a34378261f8d7423a2de49b352bf7981df6327 Mon Sep 17 00:00:00 2001 From: Yurii Zubrytskyi Date: Fri, 27 Dec 2024 16:43:35 -0800 Subject: [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 --- libs/androidfw/ZipUtils.cpp | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'libs/androidfw') 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 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 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 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(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; -- cgit v1.2.3-59-g8ed1b