Allow using reserved package IDs
Pre-O, the platform treats negative resource IDs [those with
a package ID of 0x80 or higher] as invalid. In order to work
around this limitation, we allow the use of traditionally
reserved resource IDs [those between 0x02 and 0x7E].
Bug: 78041707
Test: ./out/host/linux-x86/nativetest64/aapt2_tests/aapt2_tests
Test: ./out/host/linux-x86/nativetest/libandroidfw_tests/libandroidfw_tests
Test: Manual. Create a feature split with a package ID of 0x7E and see it runs and can reference base resources.
Change-Id: I3d9782cc05d3a55e1a2467bf39566788847e1160
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 2e97a2f..fc4c9b5 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -227,6 +227,10 @@
return package_map;
}
+bool AssetManagerSymbolSource::IsPackageDynamic(uint32_t packageId) const {
+ return assets_.getResources(false).isPackageDynamic(packageId);
+}
+
static std::unique_ptr<SymbolTable::Symbol> LookupAttributeInTable(
const android::ResTable& table, ResourceId id) {
// Try as a bag.
@@ -330,6 +334,7 @@
} else {
s = util::make_unique<SymbolTable::Symbol>();
s->id = res_id;
+ s->is_dynamic = table.isResourceDynamic(res_id.id);
}
if (s) {
@@ -354,7 +359,6 @@
// Exit early and avoid the error logs from AssetManager.
return {};
}
-
const android::ResTable& table = assets_.getResources(false);
Maybe<ResourceName> maybe_name = GetResourceName(table, id);
if (!maybe_name) {
@@ -370,6 +374,7 @@
} else {
s = util::make_unique<SymbolTable::Symbol>();
s->id = id;
+ s->is_dynamic = table.isResourceDynamic(id.id);
}
if (s) {
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index b676efb..51a2e37 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -68,6 +68,7 @@
Maybe<ResourceId> id;
std::shared_ptr<Attribute> attribute;
bool is_public = false;
+ bool is_dynamic = false;
};
SymbolTable(NameMangler* mangler);
@@ -192,6 +193,7 @@
bool AddAssetPath(const android::StringPiece& path);
std::map<size_t, std::string> GetAssignedPackageIds() const;
+ bool IsPackageDynamic(uint32_t packageId) const;
std::unique_ptr<SymbolTable::Symbol> FindByName(
const ResourceName& name) override;