IsFabricatedOverlay() optimization
This function is used mostly to select what type should be parsing the very same file, so instead of opening that file again later make it able to accept an opened fd Bug: 237583012 Test: build + boot Change-Id: I9ca1f44d6fe16fec0dd4732bfc9f0d6272d3b1e7
This commit is contained in:
@@ -83,15 +83,16 @@ std::unique_ptr<ApkAssets> ApkAssets::LoadOverlay(const std::string& idmap_path,
|
||||
return {};
|
||||
}
|
||||
|
||||
std::string overlay_path(loaded_idmap->OverlayApkPath());
|
||||
auto fd = unique_fd(::open(overlay_path.c_str(), O_RDONLY|O_CLOEXEC));
|
||||
std::unique_ptr<AssetsProvider> overlay_assets;
|
||||
const std::string overlay_path(loaded_idmap->OverlayApkPath());
|
||||
if (IsFabricatedOverlay(overlay_path)) {
|
||||
if (IsFabricatedOverlay(fd)) {
|
||||
// Fabricated overlays do not contain resource definitions. All of the overlay resource values
|
||||
// are defined inline in the idmap.
|
||||
overlay_assets = EmptyAssetsProvider::Create(overlay_path);
|
||||
overlay_assets = EmptyAssetsProvider::Create(std::move(overlay_path));
|
||||
} else {
|
||||
// The overlay should be an APK.
|
||||
overlay_assets = ZipAssetsProvider::Create(overlay_path, flags);
|
||||
overlay_assets = ZipAssetsProvider::Create(std::move(fd), std::move(overlay_path), flags);
|
||||
}
|
||||
if (overlay_assets == nullptr) {
|
||||
return {};
|
||||
|
||||
@@ -393,8 +393,8 @@ std::unique_ptr<AssetsProvider> EmptyAssetsProvider::Create() {
|
||||
return std::unique_ptr<EmptyAssetsProvider>(new EmptyAssetsProvider({}));
|
||||
}
|
||||
|
||||
std::unique_ptr<AssetsProvider> EmptyAssetsProvider::Create(const std::string& path) {
|
||||
return std::unique_ptr<EmptyAssetsProvider>(new EmptyAssetsProvider(path));
|
||||
std::unique_ptr<AssetsProvider> EmptyAssetsProvider::Create(std::string path) {
|
||||
return std::unique_ptr<EmptyAssetsProvider>(new EmptyAssetsProvider(std::move(path)));
|
||||
}
|
||||
|
||||
std::unique_ptr<Asset> EmptyAssetsProvider::OpenInternal(const std::string& /* path */,
|
||||
|
||||
@@ -33,7 +33,9 @@
|
||||
#include <type_traits>
|
||||
#include <vector>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/macros.h>
|
||||
#include <android-base/utf8.h>
|
||||
#include <androidfw/ByteBucketArray.h>
|
||||
#include <androidfw/ResourceTypes.h>
|
||||
#include <androidfw/TypeWrappers.h>
|
||||
@@ -236,12 +238,23 @@ void Res_png_9patch::serialize(const Res_png_9patch& patch, const int32_t* xDivs
|
||||
}
|
||||
|
||||
bool IsFabricatedOverlay(const std::string& path) {
|
||||
std::ifstream fin(path);
|
||||
uint32_t magic;
|
||||
if (fin.read(reinterpret_cast<char*>(&magic), sizeof(uint32_t))) {
|
||||
return magic == kFabricatedOverlayMagic;
|
||||
return IsFabricatedOverlay(path.c_str());
|
||||
}
|
||||
|
||||
bool IsFabricatedOverlay(const char* path) {
|
||||
auto fd = base::unique_fd(base::utf8::open(path, O_RDONLY|O_CLOEXEC));
|
||||
if (fd < 0) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
return IsFabricatedOverlay(fd);
|
||||
}
|
||||
|
||||
bool IsFabricatedOverlay(base::borrowed_fd fd) {
|
||||
uint32_t magic;
|
||||
if (!base::ReadFullyAtOffset(fd, &magic, sizeof(magic), 0)) {
|
||||
return false;
|
||||
}
|
||||
return magic == kFabricatedOverlayMagic;
|
||||
}
|
||||
|
||||
static bool assertIdmapHeader(const void* idmap, size_t size) {
|
||||
|
||||
@@ -181,7 +181,7 @@ struct MultiAssetsProvider : public AssetsProvider {
|
||||
// Does not provide any assets.
|
||||
struct EmptyAssetsProvider : public AssetsProvider {
|
||||
static std::unique_ptr<AssetsProvider> Create();
|
||||
static std::unique_ptr<AssetsProvider> Create(const std::string& path);
|
||||
static std::unique_ptr<AssetsProvider> Create(std::string path);
|
||||
|
||||
bool ForEachFile(const std::string& path,
|
||||
const std::function<void(StringPiece, FileType)>& f) const override;
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#define _LIBS_UTILS_RESOURCE_TYPES_H
|
||||
|
||||
#include <android-base/expected.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
|
||||
#include <androidfw/Asset.h>
|
||||
#include <androidfw/Errors.h>
|
||||
@@ -58,6 +59,8 @@ constexpr const uint32_t kFabricatedOverlayCurrentVersion = 3;
|
||||
|
||||
// Returns whether or not the path represents a fabricated overlay.
|
||||
bool IsFabricatedOverlay(const std::string& path);
|
||||
bool IsFabricatedOverlay(const char* path);
|
||||
bool IsFabricatedOverlay(android::base::borrowed_fd fd);
|
||||
|
||||
/**
|
||||
* In C++11, char16_t is defined as *at least* 16 bits. We do a lot of
|
||||
|
||||
Reference in New Issue
Block a user