diff options
author | Ryan Mitchell <rtmitchell@google.com> | 2019-11-12 16:22:04 -0800 |
---|---|---|
committer | Ryan Mitchell <rtmitchell@google.com> | 2019-11-13 14:51:14 -0800 |
commit | 73bfe41bab9b06a3d0c4e73c61928982b37b35eb (patch) | |
tree | e1dff38ea774af89ff06e26aa63798132793b9c8 /libs/androidfw/include | |
parent | 52a3801810fb06e73d1be9874c892fefa6a1bdc2 (diff) |
Do not look for R.class of overlays
Now that RROs are loaded as shared libraries,
LoadedApk#makeApplication is attempting to find the onResourcesLoaded
method of the overlays. This is a performance hit and causes more
memory than necessary to be allocated during application start up.
Bug: 143314947
Test: com.android.performance.tests.HermeticMemoryTest
Change-Id: I3b8cd22dae83e0164d6678c80279f9fffceb34e6
Diffstat (limited to 'libs/androidfw/include')
-rw-r--r-- | libs/androidfw/include/androidfw/ApkAssets.h | 21 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/AssetManager2.h | 9 | ||||
-rw-r--r-- | libs/androidfw/include/androidfw/LoadedArsc.h | 57 |
3 files changed, 44 insertions, 43 deletions
diff --git a/libs/androidfw/include/androidfw/ApkAssets.h b/libs/androidfw/include/androidfw/ApkAssets.h index 20472872263e..af802b0e50b9 100644 --- a/libs/androidfw/include/androidfw/ApkAssets.h +++ b/libs/androidfw/include/androidfw/ApkAssets.h @@ -76,10 +76,10 @@ class ApkAssets { // Takes ownership of the file descriptor. static std::unique_ptr<const ApkAssets> LoadArsc(base::unique_fd fd, const std::string& friendly_name, - bool resource_loader = false); + bool for_loader = false); // Creates a totally empty ApkAssets with no resources table and no file entries. - static std::unique_ptr<const ApkAssets> LoadEmpty(bool resource_loader = false); + static std::unique_ptr<const ApkAssets> LoadEmpty(bool for_loader = false); std::unique_ptr<Asset> Open(const std::string& path, Asset::AccessMode mode = Asset::AccessMode::ACCESS_RANDOM) const; @@ -100,12 +100,12 @@ class ApkAssets { return loaded_idmap_.get(); } - inline bool IsOverlay() const { - return idmap_asset_.get() != nullptr; + inline bool IsLoader() const { + return (property_flags_ & PROPERTY_LOADER) != 0; } - inline bool IsLoader() const { - return for_loader_; + inline bool IsOverlay() const { + return (property_flags_ & PROPERTY_OVERLAY) != 0; } bool IsUpToDate() const; @@ -119,24 +119,23 @@ class ApkAssets { static std::unique_ptr<const ApkAssets> LoadImpl(base::unique_fd fd, const std::string& path, std::unique_ptr<Asset> idmap_asset, std::unique_ptr<const LoadedIdmap> loaded_idmap, - bool system, bool load_as_shared_library, - bool resource_loader = false); + package_property_t property_flags); static std::unique_ptr<const ApkAssets> LoadArscImpl(base::unique_fd fd, const std::string& path, - bool resource_loader = false); + package_property_t property_flags); ApkAssets(ZipArchiveHandle unmanaged_handle, const std::string& path, time_t last_mod_time, - bool for_loader = false); + package_property_t property_flags); using ZipArchivePtr = std::unique_ptr<ZipArchive, void (*)(ZipArchiveHandle)>; ZipArchivePtr zip_handle_; const std::string path_; time_t last_mod_time_; - bool for_loader_; + package_property_t property_flags_ = 0U; std::unique_ptr<Asset> resources_asset_; std::unique_ptr<Asset> idmap_asset_; std::unique_ptr<const LoadedArsc> loaded_arsc_; diff --git a/libs/androidfw/include/androidfw/AssetManager2.h b/libs/androidfw/include/androidfw/AssetManager2.h index 20e40234b418..00cbbcad56e6 100644 --- a/libs/androidfw/include/androidfw/AssetManager2.h +++ b/libs/androidfw/include/androidfw/AssetManager2.h @@ -263,10 +263,13 @@ class AssetManager2 { // Creates a new Theme from this AssetManager. std::unique_ptr<Theme> NewTheme(); - void ForEachPackage(const std::function<bool(const std::string&, uint8_t)> func) const { + void ForEachPackage(const std::function<bool(const std::string&, uint8_t)> func, + package_property_t excluded_property_flags = 0U) const { for (const PackageGroup& package_group : package_groups_) { - if (!func(package_group.packages_.front().loaded_package_->GetPackageName(), - package_group.dynamic_ref_table->mAssignedPackageId)) { + const auto loaded_package = package_group.packages_.front().loaded_package_; + if ((loaded_package->GetPropertyFlags() & excluded_property_flags) == 0U + && !func(loaded_package->GetPackageName(), + package_group.dynamic_ref_table->mAssignedPackageId)) { return; } } diff --git a/libs/androidfw/include/androidfw/LoadedArsc.h b/libs/androidfw/include/androidfw/LoadedArsc.h index ba1beaa7827c..6cbda07b6950 100644 --- a/libs/androidfw/include/androidfw/LoadedArsc.h +++ b/libs/androidfw/include/androidfw/LoadedArsc.h @@ -69,6 +69,14 @@ struct TypeSpec { } }; +using package_property_t = uint32_t; +enum : package_property_t { + PROPERTY_DYNAMIC = 1, + PROPERTY_LOADER = 2, + PROPERTY_OVERLAY = 4, + PROPERTY_SYSTEM = 8, +}; + // TypeSpecPtr points to a block of memory that holds a TypeSpec struct, followed by an array of // ResTable_type pointers. // TypeSpecPtr is a managed pointer that knows how to delete itself. @@ -131,9 +139,8 @@ class LoadedPackage { return iterator(this, resource_ids_.size() + 1, 0); } - static std::unique_ptr<const LoadedPackage> Load(const Chunk& chunk, bool system, - bool load_as_shared_library, - bool load_as_custom_loader); + static std::unique_ptr<const LoadedPackage> Load(const Chunk& chunk, + package_property_t property_flags); ~LoadedPackage(); @@ -170,17 +177,26 @@ class LoadedPackage { // Returns true if this package is dynamic (shared library) and needs to have an ID assigned. inline bool IsDynamic() const { - return dynamic_; + return (property_flags_ & PROPERTY_DYNAMIC) != 0; + } + + // Returns true if this package is a Runtime Resource Overlay. + inline bool IsOverlay() const { + return (property_flags_ & PROPERTY_OVERLAY) != 0; } // Returns true if this package originates from a system provided resource. inline bool IsSystem() const { - return system_; + return (property_flags_ & PROPERTY_SYSTEM) != 0; } - // Returns true if this package is a custom loader and should behave like an overlay + // Returns true if this package is a custom loader and should behave like an overlay. inline bool IsCustomLoader() const { - return custom_loader_; + return (property_flags_ & PROPERTY_LOADER) != 0; + } + + inline package_property_t GetPropertyFlags() const { + return property_flags_; } // Returns the map of package name to package ID used in this LoadedPackage. At runtime, a @@ -248,12 +264,10 @@ class LoadedPackage { ResStringPool type_string_pool_; ResStringPool key_string_pool_; std::string package_name_; + bool defines_overlayable_ = false; int package_id_ = -1; int type_id_offset_ = 0; - bool dynamic_ = false; - bool system_ = false; - bool custom_loader_ = false; - bool defines_overlayable_ = false; + package_property_t property_flags_ = 0U; ByteBucketArray<TypeSpecPtr> type_specs_; ByteBucketArray<uint32_t> resource_ids_; @@ -274,9 +288,7 @@ class LoadedArsc { // ID. static std::unique_ptr<const LoadedArsc> Load(const StringPiece& data, const LoadedIdmap* loaded_idmap = nullptr, - bool system = false, - bool load_as_shared_library = false, - bool for_loader = false); + package_property_t property_flags = 0U); // Create an empty LoadedArsc. This is used when an APK has no resources.arsc. static std::unique_ptr<const LoadedArsc> CreateEmpty(); @@ -296,28 +308,15 @@ class LoadedArsc { return packages_; } - // Returns true if this is a system provided resource. - inline bool IsSystem() const { - return system_; - } - private: DISALLOW_COPY_AND_ASSIGN(LoadedArsc); LoadedArsc() = default; - bool LoadTable(const Chunk& chunk, const LoadedIdmap* loaded_idmap, bool load_as_shared_library, - bool for_loader); - - static std::unique_ptr<const LoadedArsc> LoadData(std::unique_ptr<LoadedArsc>& loaded_arsc, - const char* data, - size_t length, - const LoadedIdmap* loaded_idmap = nullptr, - bool load_as_shared_library = false, - bool for_loader = false); + bool LoadTable( + const Chunk& chunk, const LoadedIdmap* loaded_idmap, package_property_t property_flags); std::unique_ptr<ResStringPool> global_string_pool_ = util::make_unique<ResStringPool>(); std::vector<std::unique_ptr<const LoadedPackage>> packages_; - bool system_ = false; }; } // namespace android |