1*d57664e9SAndroid Build Coastguard Worker /* 2*d57664e9SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*d57664e9SAndroid Build Coastguard Worker * 4*d57664e9SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*d57664e9SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*d57664e9SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*d57664e9SAndroid Build Coastguard Worker * 8*d57664e9SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*d57664e9SAndroid Build Coastguard Worker * 10*d57664e9SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*d57664e9SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*d57664e9SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*d57664e9SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*d57664e9SAndroid Build Coastguard Worker * limitations under the License. 15*d57664e9SAndroid Build Coastguard Worker */ 16*d57664e9SAndroid Build Coastguard Worker 17*d57664e9SAndroid Build Coastguard Worker #ifndef AAPT_RESOURCE_TABLE_H 18*d57664e9SAndroid Build Coastguard Worker #define AAPT_RESOURCE_TABLE_H 19*d57664e9SAndroid Build Coastguard Worker 20*d57664e9SAndroid Build Coastguard Worker #include <functional> 21*d57664e9SAndroid Build Coastguard Worker #include <map> 22*d57664e9SAndroid Build Coastguard Worker #include <memory> 23*d57664e9SAndroid Build Coastguard Worker #include <string> 24*d57664e9SAndroid Build Coastguard Worker #include <tuple> 25*d57664e9SAndroid Build Coastguard Worker #include <unordered_map> 26*d57664e9SAndroid Build Coastguard Worker #include <vector> 27*d57664e9SAndroid Build Coastguard Worker 28*d57664e9SAndroid Build Coastguard Worker #include "Resource.h" 29*d57664e9SAndroid Build Coastguard Worker #include "ResourceValues.h" 30*d57664e9SAndroid Build Coastguard Worker #include "android-base/macros.h" 31*d57664e9SAndroid Build Coastguard Worker #include "androidfw/ConfigDescription.h" 32*d57664e9SAndroid Build Coastguard Worker #include "androidfw/IDiagnostics.h" 33*d57664e9SAndroid Build Coastguard Worker #include "androidfw/Source.h" 34*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPiece.h" 35*d57664e9SAndroid Build Coastguard Worker #include "androidfw/StringPool.h" 36*d57664e9SAndroid Build Coastguard Worker #include "io/File.h" 37*d57664e9SAndroid Build Coastguard Worker 38*d57664e9SAndroid Build Coastguard Worker using PolicyFlags = android::ResTable_overlayable_policy_header::PolicyFlags; 39*d57664e9SAndroid Build Coastguard Worker 40*d57664e9SAndroid Build Coastguard Worker namespace aapt { 41*d57664e9SAndroid Build Coastguard Worker 42*d57664e9SAndroid Build Coastguard Worker // The Public status of a resource. 43*d57664e9SAndroid Build Coastguard Worker struct Visibility { 44*d57664e9SAndroid Build Coastguard Worker enum class Level { 45*d57664e9SAndroid Build Coastguard Worker kUndefined, 46*d57664e9SAndroid Build Coastguard Worker kPrivate, 47*d57664e9SAndroid Build Coastguard Worker kPublic, 48*d57664e9SAndroid Build Coastguard Worker }; 49*d57664e9SAndroid Build Coastguard Worker 50*d57664e9SAndroid Build Coastguard Worker Level level = Level::kUndefined; 51*d57664e9SAndroid Build Coastguard Worker android::Source source; 52*d57664e9SAndroid Build Coastguard Worker std::string comment; 53*d57664e9SAndroid Build Coastguard Worker 54*d57664e9SAndroid Build Coastguard Worker // Indicates that the resource id may change across builds and that the public R.java identifier 55*d57664e9SAndroid Build Coastguard Worker // for this resource should not be final. This is set to `true` for resources in `staging-group` 56*d57664e9SAndroid Build Coastguard Worker // tags. 57*d57664e9SAndroid Build Coastguard Worker bool staged_api = false; 58*d57664e9SAndroid Build Coastguard Worker }; 59*d57664e9SAndroid Build Coastguard Worker 60*d57664e9SAndroid Build Coastguard Worker // Represents <add-resource> in an overlay. 61*d57664e9SAndroid Build Coastguard Worker struct AllowNew { 62*d57664e9SAndroid Build Coastguard Worker android::Source source; 63*d57664e9SAndroid Build Coastguard Worker std::string comment; 64*d57664e9SAndroid Build Coastguard Worker }; 65*d57664e9SAndroid Build Coastguard Worker 66*d57664e9SAndroid Build Coastguard Worker // Represents the staged resource id of a finalized resource. 67*d57664e9SAndroid Build Coastguard Worker struct StagedId { 68*d57664e9SAndroid Build Coastguard Worker ResourceId id; 69*d57664e9SAndroid Build Coastguard Worker android::Source source; 70*d57664e9SAndroid Build Coastguard Worker }; 71*d57664e9SAndroid Build Coastguard Worker 72*d57664e9SAndroid Build Coastguard Worker struct Overlayable { 73*d57664e9SAndroid Build Coastguard Worker Overlayable() = default; OverlayableOverlayable74*d57664e9SAndroid Build Coastguard Worker Overlayable(android::StringPiece name, android::StringPiece actor) : name(name), actor(actor) { 75*d57664e9SAndroid Build Coastguard Worker } OverlayableOverlayable76*d57664e9SAndroid Build Coastguard Worker Overlayable(android::StringPiece name, android::StringPiece actor, const android::Source& source) 77*d57664e9SAndroid Build Coastguard Worker : name(name), actor(actor), source(source) { 78*d57664e9SAndroid Build Coastguard Worker } 79*d57664e9SAndroid Build Coastguard Worker 80*d57664e9SAndroid Build Coastguard Worker static const char* kActorScheme; 81*d57664e9SAndroid Build Coastguard Worker std::string name; 82*d57664e9SAndroid Build Coastguard Worker std::string actor; 83*d57664e9SAndroid Build Coastguard Worker android::Source source; 84*d57664e9SAndroid Build Coastguard Worker }; 85*d57664e9SAndroid Build Coastguard Worker 86*d57664e9SAndroid Build Coastguard Worker // Represents a declaration that a resource is overlayable at runtime. 87*d57664e9SAndroid Build Coastguard Worker struct OverlayableItem { OverlayableItemOverlayableItem88*d57664e9SAndroid Build Coastguard Worker explicit OverlayableItem(const std::shared_ptr<Overlayable>& overlayable) 89*d57664e9SAndroid Build Coastguard Worker : overlayable(overlayable) {} 90*d57664e9SAndroid Build Coastguard Worker std::shared_ptr<Overlayable> overlayable; 91*d57664e9SAndroid Build Coastguard Worker PolicyFlags policies = PolicyFlags::NONE; 92*d57664e9SAndroid Build Coastguard Worker std::string comment; 93*d57664e9SAndroid Build Coastguard Worker android::Source source; 94*d57664e9SAndroid Build Coastguard Worker }; 95*d57664e9SAndroid Build Coastguard Worker 96*d57664e9SAndroid Build Coastguard Worker class ResourceConfigValue { 97*d57664e9SAndroid Build Coastguard Worker public: 98*d57664e9SAndroid Build Coastguard Worker // The configuration for which this value is defined. 99*d57664e9SAndroid Build Coastguard Worker const android::ConfigDescription config; 100*d57664e9SAndroid Build Coastguard Worker 101*d57664e9SAndroid Build Coastguard Worker // The product for which this value is defined. 102*d57664e9SAndroid Build Coastguard Worker const std::string product; 103*d57664e9SAndroid Build Coastguard Worker 104*d57664e9SAndroid Build Coastguard Worker // The actual Value. 105*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Value> value; 106*d57664e9SAndroid Build Coastguard Worker ResourceConfigValue(const android::ConfigDescription & config,android::StringPiece product)107*d57664e9SAndroid Build Coastguard Worker ResourceConfigValue(const android::ConfigDescription& config, android::StringPiece product) 108*d57664e9SAndroid Build Coastguard Worker : config(config), product(product) { 109*d57664e9SAndroid Build Coastguard Worker } 110*d57664e9SAndroid Build Coastguard Worker 111*d57664e9SAndroid Build Coastguard Worker private: 112*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ResourceConfigValue); 113*d57664e9SAndroid Build Coastguard Worker }; 114*d57664e9SAndroid Build Coastguard Worker 115*d57664e9SAndroid Build Coastguard Worker // Represents a resource entry, which may have varying values for each defined configuration. 116*d57664e9SAndroid Build Coastguard Worker class ResourceEntry { 117*d57664e9SAndroid Build Coastguard Worker public: 118*d57664e9SAndroid Build Coastguard Worker // The name of the resource. Immutable, as this determines the order of this resource 119*d57664e9SAndroid Build Coastguard Worker // when doing lookups. 120*d57664e9SAndroid Build Coastguard Worker const std::string name; 121*d57664e9SAndroid Build Coastguard Worker 122*d57664e9SAndroid Build Coastguard Worker // The entry ID for this resource (the EEEE in 0xPPTTEEEE). 123*d57664e9SAndroid Build Coastguard Worker std::optional<ResourceId> id; 124*d57664e9SAndroid Build Coastguard Worker 125*d57664e9SAndroid Build Coastguard Worker // Whether this resource is public (and must maintain the same entry ID across builds). 126*d57664e9SAndroid Build Coastguard Worker Visibility visibility; 127*d57664e9SAndroid Build Coastguard Worker 128*d57664e9SAndroid Build Coastguard Worker std::optional<AllowNew> allow_new; 129*d57664e9SAndroid Build Coastguard Worker 130*d57664e9SAndroid Build Coastguard Worker // The declarations of this resource as overlayable for RROs 131*d57664e9SAndroid Build Coastguard Worker std::optional<OverlayableItem> overlayable_item; 132*d57664e9SAndroid Build Coastguard Worker 133*d57664e9SAndroid Build Coastguard Worker // The staged resource id for a finalized resource. 134*d57664e9SAndroid Build Coastguard Worker std::optional<StagedId> staged_id; 135*d57664e9SAndroid Build Coastguard Worker 136*d57664e9SAndroid Build Coastguard Worker // The resource's values for each configuration. 137*d57664e9SAndroid Build Coastguard Worker std::vector<std::unique_ptr<ResourceConfigValue>> values; 138*d57664e9SAndroid Build Coastguard Worker 139*d57664e9SAndroid Build Coastguard Worker // The resource's values that are behind disabled flags. 140*d57664e9SAndroid Build Coastguard Worker std::vector<std::unique_ptr<ResourceConfigValue>> flag_disabled_values; 141*d57664e9SAndroid Build Coastguard Worker ResourceEntry(android::StringPiece name)142*d57664e9SAndroid Build Coastguard Worker explicit ResourceEntry(android::StringPiece name) : name(name) { 143*d57664e9SAndroid Build Coastguard Worker } 144*d57664e9SAndroid Build Coastguard Worker 145*d57664e9SAndroid Build Coastguard Worker ResourceConfigValue* FindValue(const android::ConfigDescription& config, 146*d57664e9SAndroid Build Coastguard Worker android::StringPiece product = {}); 147*d57664e9SAndroid Build Coastguard Worker const ResourceConfigValue* FindValue(const android::ConfigDescription& config, 148*d57664e9SAndroid Build Coastguard Worker android::StringPiece product = {}) const; 149*d57664e9SAndroid Build Coastguard Worker 150*d57664e9SAndroid Build Coastguard Worker ResourceConfigValue* FindOrCreateValue(const android::ConfigDescription& config, 151*d57664e9SAndroid Build Coastguard Worker android::StringPiece product); 152*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceConfigValue*> FindAllValues(const android::ConfigDescription& config); 153*d57664e9SAndroid Build Coastguard Worker 154*d57664e9SAndroid Build Coastguard Worker // Either returns the existing ResourceConfigValue in the disabled list with the given flag, 155*d57664e9SAndroid Build Coastguard Worker // config, and product or creates a new one and returns that. In either case the returned value 156*d57664e9SAndroid Build Coastguard Worker // does not have the flag set on the value so it must be set by the caller. 157*d57664e9SAndroid Build Coastguard Worker ResourceConfigValue* FindOrCreateFlagDisabledValue(const FeatureFlagAttribute& flag, 158*d57664e9SAndroid Build Coastguard Worker const android::ConfigDescription& config, 159*d57664e9SAndroid Build Coastguard Worker android::StringPiece product = {}); 160*d57664e9SAndroid Build Coastguard Worker 161*d57664e9SAndroid Build Coastguard Worker template <typename Func> FindValuesIf(Func f)162*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceConfigValue*> FindValuesIf(Func f) { 163*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceConfigValue*> results; 164*d57664e9SAndroid Build Coastguard Worker for (auto& config_value : values) { 165*d57664e9SAndroid Build Coastguard Worker if (f(config_value.get())) { 166*d57664e9SAndroid Build Coastguard Worker results.push_back(config_value.get()); 167*d57664e9SAndroid Build Coastguard Worker } 168*d57664e9SAndroid Build Coastguard Worker } 169*d57664e9SAndroid Build Coastguard Worker return results; 170*d57664e9SAndroid Build Coastguard Worker } 171*d57664e9SAndroid Build Coastguard Worker 172*d57664e9SAndroid Build Coastguard Worker bool HasDefaultValue() const; 173*d57664e9SAndroid Build Coastguard Worker 174*d57664e9SAndroid Build Coastguard Worker private: 175*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ResourceEntry); 176*d57664e9SAndroid Build Coastguard Worker }; 177*d57664e9SAndroid Build Coastguard Worker 178*d57664e9SAndroid Build Coastguard Worker // Represents a resource type (eg. string, drawable, layout, etc.) containing resource entries. 179*d57664e9SAndroid Build Coastguard Worker class ResourceTableType { 180*d57664e9SAndroid Build Coastguard Worker public: 181*d57664e9SAndroid Build Coastguard Worker // The logical type of resource (string, drawable, layout, etc.). 182*d57664e9SAndroid Build Coastguard Worker const ResourceNamedType named_type; 183*d57664e9SAndroid Build Coastguard Worker 184*d57664e9SAndroid Build Coastguard Worker // Whether this type is public (and must maintain the same type ID across builds). 185*d57664e9SAndroid Build Coastguard Worker Visibility::Level visibility_level = Visibility::Level::kUndefined; 186*d57664e9SAndroid Build Coastguard Worker 187*d57664e9SAndroid Build Coastguard Worker // List of resources for this type. 188*d57664e9SAndroid Build Coastguard Worker std::vector<std::unique_ptr<ResourceEntry>> entries; 189*d57664e9SAndroid Build Coastguard Worker ResourceTableType(const ResourceNamedTypeRef & type)190*d57664e9SAndroid Build Coastguard Worker explicit ResourceTableType(const ResourceNamedTypeRef& type) 191*d57664e9SAndroid Build Coastguard Worker : named_type(type.ToResourceNamedType()) { 192*d57664e9SAndroid Build Coastguard Worker } 193*d57664e9SAndroid Build Coastguard Worker 194*d57664e9SAndroid Build Coastguard Worker ResourceEntry* CreateEntry(android::StringPiece name); 195*d57664e9SAndroid Build Coastguard Worker ResourceEntry* FindEntry(android::StringPiece name) const; 196*d57664e9SAndroid Build Coastguard Worker ResourceEntry* FindOrCreateEntry(android::StringPiece name); 197*d57664e9SAndroid Build Coastguard Worker 198*d57664e9SAndroid Build Coastguard Worker private: 199*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ResourceTableType); 200*d57664e9SAndroid Build Coastguard Worker }; 201*d57664e9SAndroid Build Coastguard Worker 202*d57664e9SAndroid Build Coastguard Worker class ResourceTablePackage { 203*d57664e9SAndroid Build Coastguard Worker public: 204*d57664e9SAndroid Build Coastguard Worker std::string name; 205*d57664e9SAndroid Build Coastguard Worker 206*d57664e9SAndroid Build Coastguard Worker std::vector<std::unique_ptr<ResourceTableType>> types; 207*d57664e9SAndroid Build Coastguard Worker ResourceTablePackage(android::StringPiece name)208*d57664e9SAndroid Build Coastguard Worker explicit ResourceTablePackage(android::StringPiece name) : name(name) { 209*d57664e9SAndroid Build Coastguard Worker } 210*d57664e9SAndroid Build Coastguard Worker 211*d57664e9SAndroid Build Coastguard Worker ResourceTablePackage() = default; 212*d57664e9SAndroid Build Coastguard Worker ResourceTableType* FindTypeWithDefaultName(const ResourceType type) const; 213*d57664e9SAndroid Build Coastguard Worker ResourceTableType* FindType(const ResourceNamedTypeRef& type) const; 214*d57664e9SAndroid Build Coastguard Worker ResourceTableType* FindOrCreateType(const ResourceNamedTypeRef& type); 215*d57664e9SAndroid Build Coastguard Worker 216*d57664e9SAndroid Build Coastguard Worker private: 217*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ResourceTablePackage); 218*d57664e9SAndroid Build Coastguard Worker }; 219*d57664e9SAndroid Build Coastguard Worker 220*d57664e9SAndroid Build Coastguard Worker struct ResourceTableEntryView { 221*d57664e9SAndroid Build Coastguard Worker std::string name; 222*d57664e9SAndroid Build Coastguard Worker std::optional<uint16_t> id; 223*d57664e9SAndroid Build Coastguard Worker Visibility visibility; 224*d57664e9SAndroid Build Coastguard Worker std::optional<AllowNew> allow_new; 225*d57664e9SAndroid Build Coastguard Worker std::optional<OverlayableItem> overlayable_item; 226*d57664e9SAndroid Build Coastguard Worker std::optional<StagedId> staged_id; 227*d57664e9SAndroid Build Coastguard Worker std::vector<const ResourceConfigValue*> values; 228*d57664e9SAndroid Build Coastguard Worker std::vector<const ResourceConfigValue*> flag_disabled_values; 229*d57664e9SAndroid Build Coastguard Worker 230*d57664e9SAndroid Build Coastguard Worker const ResourceConfigValue* FindValue(const android::ConfigDescription& config, 231*d57664e9SAndroid Build Coastguard Worker android::StringPiece product = {}) const; 232*d57664e9SAndroid Build Coastguard Worker 233*d57664e9SAndroid Build Coastguard Worker const ResourceConfigValue* FindFlagDisabledValue(const FeatureFlagAttribute& flag, 234*d57664e9SAndroid Build Coastguard Worker const android::ConfigDescription& config, 235*d57664e9SAndroid Build Coastguard Worker android::StringPiece product = {}) const; 236*d57664e9SAndroid Build Coastguard Worker }; 237*d57664e9SAndroid Build Coastguard Worker 238*d57664e9SAndroid Build Coastguard Worker struct ResourceTableTypeView { 239*d57664e9SAndroid Build Coastguard Worker ResourceNamedType named_type; 240*d57664e9SAndroid Build Coastguard Worker std::optional<uint8_t> id; 241*d57664e9SAndroid Build Coastguard Worker Visibility::Level visibility_level = Visibility::Level::kUndefined; 242*d57664e9SAndroid Build Coastguard Worker 243*d57664e9SAndroid Build Coastguard Worker // Entries sorted in ascending entry id order. If ids have not been assigned, the entries are 244*d57664e9SAndroid Build Coastguard Worker // sorted lexicographically. 245*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceTableEntryView> entries; 246*d57664e9SAndroid Build Coastguard Worker }; 247*d57664e9SAndroid Build Coastguard Worker 248*d57664e9SAndroid Build Coastguard Worker struct ResourceTablePackageView { 249*d57664e9SAndroid Build Coastguard Worker std::string name; 250*d57664e9SAndroid Build Coastguard Worker std::optional<uint8_t> id; 251*d57664e9SAndroid Build Coastguard Worker // Types sorted in ascending type id order. If ids have not been assigned, the types are sorted by 252*d57664e9SAndroid Build Coastguard Worker // their declaration order in the ResourceType enum. 253*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceTableTypeView> types; 254*d57664e9SAndroid Build Coastguard Worker }; 255*d57664e9SAndroid Build Coastguard Worker 256*d57664e9SAndroid Build Coastguard Worker struct ResourceTableViewOptions { 257*d57664e9SAndroid Build Coastguard Worker bool create_alias_entries = false; 258*d57664e9SAndroid Build Coastguard Worker }; 259*d57664e9SAndroid Build Coastguard Worker 260*d57664e9SAndroid Build Coastguard Worker struct ResourceTableView { 261*d57664e9SAndroid Build Coastguard Worker // Packages sorted in ascending package id order. If ids have not been assigned, the packages are 262*d57664e9SAndroid Build Coastguard Worker // sorted lexicographically. 263*d57664e9SAndroid Build Coastguard Worker std::vector<ResourceTablePackageView> packages; 264*d57664e9SAndroid Build Coastguard Worker }; 265*d57664e9SAndroid Build Coastguard Worker 266*d57664e9SAndroid Build Coastguard Worker enum class OnIdConflict { 267*d57664e9SAndroid Build Coastguard Worker // If the resource entry already exists but has a different resource id, the resource value will 268*d57664e9SAndroid Build Coastguard Worker // not be added to the table. 269*d57664e9SAndroid Build Coastguard Worker ERROR, 270*d57664e9SAndroid Build Coastguard Worker 271*d57664e9SAndroid Build Coastguard Worker // If the resource entry already exists but has a different resource id, create a new resource 272*d57664e9SAndroid Build Coastguard Worker // with this resource name and id combination. 273*d57664e9SAndroid Build Coastguard Worker CREATE_ENTRY, 274*d57664e9SAndroid Build Coastguard Worker }; 275*d57664e9SAndroid Build Coastguard Worker 276*d57664e9SAndroid Build Coastguard Worker struct NewResource { 277*d57664e9SAndroid Build Coastguard Worker ResourceName name; 278*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<Value> value; 279*d57664e9SAndroid Build Coastguard Worker android::ConfigDescription config; 280*d57664e9SAndroid Build Coastguard Worker std::string product; 281*d57664e9SAndroid Build Coastguard Worker std::optional<std::pair<ResourceId, OnIdConflict>> id; 282*d57664e9SAndroid Build Coastguard Worker std::optional<Visibility> visibility; 283*d57664e9SAndroid Build Coastguard Worker std::optional<OverlayableItem> overlayable; 284*d57664e9SAndroid Build Coastguard Worker std::optional<AllowNew> allow_new; 285*d57664e9SAndroid Build Coastguard Worker std::optional<StagedId> staged_id; 286*d57664e9SAndroid Build Coastguard Worker bool allow_mangled = false; 287*d57664e9SAndroid Build Coastguard Worker }; 288*d57664e9SAndroid Build Coastguard Worker 289*d57664e9SAndroid Build Coastguard Worker struct NewResourceBuilder { 290*d57664e9SAndroid Build Coastguard Worker explicit NewResourceBuilder(const ResourceNameRef& name); 291*d57664e9SAndroid Build Coastguard Worker explicit NewResourceBuilder(const std::string& name); 292*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetValue(std::unique_ptr<Value> value, android::ConfigDescription config = {}, 293*d57664e9SAndroid Build Coastguard Worker std::string product = {}); 294*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetId(ResourceId id, OnIdConflict on_conflict = OnIdConflict::ERROR); 295*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetVisibility(Visibility id); 296*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetOverlayable(OverlayableItem overlayable); 297*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetAllowNew(AllowNew allow_new); 298*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetStagedId(StagedId id); 299*d57664e9SAndroid Build Coastguard Worker NewResourceBuilder& SetAllowMangled(bool allow_mangled); 300*d57664e9SAndroid Build Coastguard Worker NewResource Build(); 301*d57664e9SAndroid Build Coastguard Worker 302*d57664e9SAndroid Build Coastguard Worker private: 303*d57664e9SAndroid Build Coastguard Worker NewResource res_; 304*d57664e9SAndroid Build Coastguard Worker }; 305*d57664e9SAndroid Build Coastguard Worker 306*d57664e9SAndroid Build Coastguard Worker // The container and index for all resources defined for an app. 307*d57664e9SAndroid Build Coastguard Worker class ResourceTable { 308*d57664e9SAndroid Build Coastguard Worker public: 309*d57664e9SAndroid Build Coastguard Worker enum class Validation { 310*d57664e9SAndroid Build Coastguard Worker kEnabled, 311*d57664e9SAndroid Build Coastguard Worker kDisabled, 312*d57664e9SAndroid Build Coastguard Worker }; 313*d57664e9SAndroid Build Coastguard Worker 314*d57664e9SAndroid Build Coastguard Worker enum class CollisionResult { kKeepBoth, kKeepOriginal, kConflict, kTakeNew }; 315*d57664e9SAndroid Build Coastguard Worker 316*d57664e9SAndroid Build Coastguard Worker ResourceTable() = default; 317*d57664e9SAndroid Build Coastguard Worker explicit ResourceTable(Validation validation); 318*d57664e9SAndroid Build Coastguard Worker 319*d57664e9SAndroid Build Coastguard Worker bool AddResource(NewResource&& res, android::IDiagnostics* diag); 320*d57664e9SAndroid Build Coastguard Worker 321*d57664e9SAndroid Build Coastguard Worker // Retrieves a sorted a view of the packages, types, and entries sorted in ascending resource id 322*d57664e9SAndroid Build Coastguard Worker // order. 323*d57664e9SAndroid Build Coastguard Worker ResourceTableView GetPartitionedView(const ResourceTableViewOptions& options = {}) const; 324*d57664e9SAndroid Build Coastguard Worker 325*d57664e9SAndroid Build Coastguard Worker using ReferencedPackages = std::map<uint8_t, std::string>; GetReferencedPackages()326*d57664e9SAndroid Build Coastguard Worker const ReferencedPackages& GetReferencedPackages() const { 327*d57664e9SAndroid Build Coastguard Worker return included_packages_; 328*d57664e9SAndroid Build Coastguard Worker } 329*d57664e9SAndroid Build Coastguard Worker 330*d57664e9SAndroid Build Coastguard Worker struct SearchResult { 331*d57664e9SAndroid Build Coastguard Worker ResourceTablePackage* package; 332*d57664e9SAndroid Build Coastguard Worker ResourceTableType* type; 333*d57664e9SAndroid Build Coastguard Worker ResourceEntry* entry; 334*d57664e9SAndroid Build Coastguard Worker }; 335*d57664e9SAndroid Build Coastguard Worker 336*d57664e9SAndroid Build Coastguard Worker std::optional<SearchResult> FindResource(const ResourceNameRef& name) const; 337*d57664e9SAndroid Build Coastguard Worker std::optional<SearchResult> FindResource(const ResourceNameRef& name, ResourceId id) const; 338*d57664e9SAndroid Build Coastguard Worker bool RemoveResource(const ResourceNameRef& name, ResourceId id) const; 339*d57664e9SAndroid Build Coastguard Worker 340*d57664e9SAndroid Build Coastguard Worker // Returns the package struct with the given name, or nullptr if such a package does not 341*d57664e9SAndroid Build Coastguard Worker // exist. The empty string is a valid package and typically is used to represent the 342*d57664e9SAndroid Build Coastguard Worker // 'current' package before it is known to the ResourceTable. 343*d57664e9SAndroid Build Coastguard Worker ResourceTablePackage* FindPackage(android::StringPiece name) const; 344*d57664e9SAndroid Build Coastguard Worker ResourceTablePackage* FindOrCreatePackage(android::StringPiece name); 345*d57664e9SAndroid Build Coastguard Worker 346*d57664e9SAndroid Build Coastguard Worker std::unique_ptr<ResourceTable> Clone() const; 347*d57664e9SAndroid Build Coastguard Worker 348*d57664e9SAndroid Build Coastguard Worker // When a collision of resources occurs, these methods decide which value to keep. 349*d57664e9SAndroid Build Coastguard Worker static CollisionResult ResolveFlagCollision(FlagStatus existing, FlagStatus incoming); 350*d57664e9SAndroid Build Coastguard Worker static CollisionResult ResolveValueCollision(Value* existing, Value* incoming); 351*d57664e9SAndroid Build Coastguard Worker 352*d57664e9SAndroid Build Coastguard Worker // The string pool used by this resource table. Values that reference strings must use 353*d57664e9SAndroid Build Coastguard Worker // this pool to create their strings. 354*d57664e9SAndroid Build Coastguard Worker // NOTE: `string_pool` must come before `packages` so that it is destroyed after. 355*d57664e9SAndroid Build Coastguard Worker // When `string_pool` references are destroyed (as they will be when `packages` is destroyed), 356*d57664e9SAndroid Build Coastguard Worker // they decrement a refCount, which would cause invalid memory access if the pool was already 357*d57664e9SAndroid Build Coastguard Worker // destroyed. 358*d57664e9SAndroid Build Coastguard Worker android::StringPool string_pool; 359*d57664e9SAndroid Build Coastguard Worker 360*d57664e9SAndroid Build Coastguard Worker // The list of packages in this table, sorted alphabetically by package name and increasing 361*d57664e9SAndroid Build Coastguard Worker // package ID (missing ID being the lowest). 362*d57664e9SAndroid Build Coastguard Worker std::vector<std::unique_ptr<ResourceTablePackage>> packages; 363*d57664e9SAndroid Build Coastguard Worker 364*d57664e9SAndroid Build Coastguard Worker // Set of dynamic packages that this table may reference. Their package names get encoded 365*d57664e9SAndroid Build Coastguard Worker // into the resources.arsc along with their compile-time assigned IDs. 366*d57664e9SAndroid Build Coastguard Worker ReferencedPackages included_packages_; 367*d57664e9SAndroid Build Coastguard Worker 368*d57664e9SAndroid Build Coastguard Worker private: 369*d57664e9SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(ResourceTable); 370*d57664e9SAndroid Build Coastguard Worker 371*d57664e9SAndroid Build Coastguard Worker Validation validation_ = Validation::kEnabled; 372*d57664e9SAndroid Build Coastguard Worker }; 373*d57664e9SAndroid Build Coastguard Worker 374*d57664e9SAndroid Build Coastguard Worker } // namespace aapt 375*d57664e9SAndroid Build Coastguard Worker 376*d57664e9SAndroid Build Coastguard Worker #endif // AAPT_RESOURCE_TABLE_H 377