summaryrefslogtreecommitdiff
path: root/libs/androidfw/ZipUtils.cpp
diff options
context:
space:
mode:
author Yurii Zubrytskyi <zyy@google.com> 2024-12-27 16:43:35 -0800
committer Yurii Zubrytskyi <zyy@google.com> 2024-12-27 16:43:35 -0800
commit82a34378261f8d7423a2de49b352bf7981df6327 (patch)
treef266417a6139652524145aaac8b92f20f48954e3 /libs/androidfw/ZipUtils.cpp
parente4ddaa6c723194d75c11f3fcebc434eec749b2c8 (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
Diffstat (limited to 'libs/androidfw/ZipUtils.cpp')
-rw-r--r--libs/androidfw/ZipUtils.cpp34
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;