diff options
| author | 2023-11-08 12:20:24 -0800 | |
|---|---|---|
| committer | 2023-12-05 13:12:53 -0800 | |
| commit | deb46f31bf04f17e8a636ec2eead8f75268f64ec (patch) | |
| tree | b9aa91d5b4d1cd9558e8154cbe96009ee4cc74bb /libs/androidfw/include | |
| parent | 87f82bb9ba06450ebba5b65261dc707761dea54a (diff) | |
Handle 9patches being used for frros
This adds an api that allows creation of nine patch frros.
We process them the same as aapt2 does so that
when they are used at runtime they work correctly.
API-Coverage-Bug: 314168567
Test: manual and automatic
Bug: 296324826
Change-Id: I40da020189e9ec914fbea0c17f181209347d83de
Diffstat (limited to 'libs/androidfw/include')
| -rw-r--r-- | libs/androidfw/include/androidfw/BigBufferStream.h | 8 | ||||
| -rw-r--r-- | libs/androidfw/include/androidfw/FileStream.h | 14 | ||||
| -rw-r--r-- | libs/androidfw/include/androidfw/IDiagnostics.h | 35 | ||||
| -rw-r--r-- | libs/androidfw/include/androidfw/ResourceTypes.h | 1 |
4 files changed, 56 insertions, 2 deletions
diff --git a/libs/androidfw/include/androidfw/BigBufferStream.h b/libs/androidfw/include/androidfw/BigBufferStream.h index e55fe0d653cc..c23194bae423 100644 --- a/libs/androidfw/include/androidfw/BigBufferStream.h +++ b/libs/androidfw/include/androidfw/BigBufferStream.h @@ -24,8 +24,13 @@ namespace android { class BigBufferInputStream : public KnownSizeInputStream { public: inline explicit BigBufferInputStream(const BigBuffer* buffer) - : buffer_(buffer), iter_(buffer->begin()) { + : owning_buffer_(0), buffer_(buffer), iter_(buffer->begin()) { } + + inline explicit BigBufferInputStream(android::BigBuffer&& buffer) + : owning_buffer_(std::move(buffer)), buffer_(&owning_buffer_), iter_(buffer_->begin()) { + } + virtual ~BigBufferInputStream() = default; bool Next(const void** data, size_t* size) override; @@ -47,6 +52,7 @@ class BigBufferInputStream : public KnownSizeInputStream { private: DISALLOW_COPY_AND_ASSIGN(BigBufferInputStream); + android::BigBuffer owning_buffer_; const BigBuffer* buffer_; BigBuffer::const_iterator iter_; size_t offset_ = 0; diff --git a/libs/androidfw/include/androidfw/FileStream.h b/libs/androidfw/include/androidfw/FileStream.h index fb84a91a00de..87c42d12f825 100644 --- a/libs/androidfw/include/androidfw/FileStream.h +++ b/libs/androidfw/include/androidfw/FileStream.h @@ -18,6 +18,7 @@ #include <memory> #include <string> +#include <unistd.h> #include "Streams.h" #include "android-base/macros.h" @@ -35,6 +36,16 @@ class FileInputStream : public InputStream { // Take ownership of `fd`. explicit FileInputStream(int fd, size_t buffer_capacity = kDefaultBufferCapacity); + // Take ownership of `fd`. + explicit FileInputStream(android::base::borrowed_fd fd, + size_t buffer_capacity = kDefaultBufferCapacity); + + ~FileInputStream() { + if (should_close_ && (fd_ != -1)) { + close(fd_); + } + } + bool Next(const void** data, size_t* size) override; void BackUp(size_t count) override; @@ -50,8 +61,9 @@ class FileInputStream : public InputStream { private: DISALLOW_COPY_AND_ASSIGN(FileInputStream); - android::base::unique_fd fd_; + int fd_ = -1; std::string error_; + bool should_close_; std::unique_ptr<uint8_t[]> buffer_; size_t buffer_capacity_ = 0u; size_t buffer_offset_ = 0u; diff --git a/libs/androidfw/include/androidfw/IDiagnostics.h b/libs/androidfw/include/androidfw/IDiagnostics.h index 865a298f8389..d1dda818d97c 100644 --- a/libs/androidfw/include/androidfw/IDiagnostics.h +++ b/libs/androidfw/include/androidfw/IDiagnostics.h @@ -17,10 +17,15 @@ #ifndef _ANDROID_DIAGNOSTICS_H #define _ANDROID_DIAGNOSTICS_H +// on some systems ERROR is defined as 0 so android::base::ERROR becomes android::base::0 +// which doesn't compile. We undef it here to avoid that and because we don't ever need that def. +#undef ERROR + #include <sstream> #include <string> #include "Source.h" +#include "android-base/logging.h" #include "android-base/macros.h" #include "androidfw/StringPiece.h" @@ -144,6 +149,36 @@ class NoOpDiagnostics : public IDiagnostics { DISALLOW_COPY_AND_ASSIGN(NoOpDiagnostics); }; +class AndroidLogDiagnostics : public IDiagnostics { + public: + AndroidLogDiagnostics() = default; + + void Log(Level level, DiagMessageActual& actual_msg) override { + android::base::LogSeverity severity; + switch (level) { + case Level::Error: + severity = android::base::ERROR; + break; + + case Level::Warn: + severity = android::base::WARNING; + break; + + case Level::Note: + severity = android::base::INFO; + break; + } + if (!actual_msg.source.path.empty()) { + LOG(severity) << actual_msg.source << ": " + actual_msg.message; + } else { + LOG(severity) << actual_msg.message; + } + } + + DISALLOW_COPY_AND_ASSIGN(AndroidLogDiagnostics); +}; + + } // namespace android #endif /* _ANDROID_DIAGNOSTICS_H */ diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h index fdb355192676..c0514fdff469 100644 --- a/libs/androidfw/include/androidfw/ResourceTypes.h +++ b/libs/androidfw/include/androidfw/ResourceTypes.h @@ -1875,6 +1875,7 @@ struct FabricatedOverlayEntryParameters { off64_t binary_data_offset; size_t binary_data_size; std::string configuration; + bool nine_patch; }; class AssetManager2; |