AaptAssets.h revision de898ff42912bd7ca1bfb099cd439562496765a4
1// 2// Copyright 2006 The Android Open Source Project 3// 4// Information about assets being operated on. 5// 6#ifndef __AAPT_ASSETS_H 7#define __AAPT_ASSETS_H 8 9#include <stdlib.h> 10#include <androidfw/AssetManager.h> 11#include <androidfw/ResourceTypes.h> 12#include <utils/KeyedVector.h> 13#include <utils/RefBase.h> 14#include <utils/SortedVector.h> 15#include <utils/String8.h> 16#include <utils/Vector.h> 17#include "ZipFile.h" 18 19#include "Bundle.h" 20#include "SourcePos.h" 21 22using namespace android; 23 24 25extern const char * const gDefaultIgnoreAssets; 26extern const char * gUserIgnoreAssets; 27 28bool valid_symbol_name(const String8& str); 29 30class AaptAssets; 31 32enum { 33 AXIS_NONE = 0, 34 AXIS_MCC = 1, 35 AXIS_MNC, 36 AXIS_LOCALE, 37 AXIS_SCREENLAYOUTSIZE, 38 AXIS_SCREENLAYOUTLONG, 39 AXIS_ORIENTATION, 40 AXIS_UIMODETYPE, 41 AXIS_UIMODENIGHT, 42 AXIS_DENSITY, 43 AXIS_TOUCHSCREEN, 44 AXIS_KEYSHIDDEN, 45 AXIS_KEYBOARD, 46 AXIS_NAVHIDDEN, 47 AXIS_NAVIGATION, 48 AXIS_SCREENSIZE, 49 AXIS_SMALLESTSCREENWIDTHDP, 50 AXIS_SCREENWIDTHDP, 51 AXIS_SCREENHEIGHTDP, 52 AXIS_LAYOUTDIR, 53 AXIS_VERSION, 54 55 AXIS_START = AXIS_MCC, 56 AXIS_END = AXIS_VERSION, 57}; 58 59struct AaptLocaleValue { 60 char language[4]; 61 char region[4]; 62 char script[4]; 63 char variant[8]; 64 65 AaptLocaleValue() { 66 memset(this, 0, sizeof(AaptLocaleValue)); 67 } 68 69 // Initialize this AaptLocaleValue from a config string. 70 bool initFromFilterString(const String8& config); 71 72 int initFromDirName(const Vector<String8>& parts, const int startIndex); 73 74 // Initialize this AaptLocaleValue from a ResTable_config. 75 void initFromResTable(const ResTable_config& config); 76 77 void writeTo(ResTable_config* out) const; 78 79 String8 toDirName() const; 80 81 int compare(const AaptLocaleValue& other) const { 82 return memcmp(this, &other, sizeof(AaptLocaleValue)); 83 } 84 85 static void splitAndLowerCase(const char* const chars, Vector<String8>* parts, 86 const char separator); 87 88 inline bool operator<(const AaptLocaleValue& o) const { return compare(o) < 0; } 89 inline bool operator<=(const AaptLocaleValue& o) const { return compare(o) <= 0; } 90 inline bool operator==(const AaptLocaleValue& o) const { return compare(o) == 0; } 91 inline bool operator!=(const AaptLocaleValue& o) const { return compare(o) != 0; } 92 inline bool operator>=(const AaptLocaleValue& o) const { return compare(o) >= 0; } 93 inline bool operator>(const AaptLocaleValue& o) const { return compare(o) > 0; } 94private: 95 void setLanguage(const char* language); 96 void setRegion(const char* language); 97 void setScript(const char* script); 98 void setVariant(const char* variant); 99}; 100 101struct AxisValue { 102 // Used for all axes except AXIS_LOCALE, which is represented 103 // as a AaptLocaleValue value. 104 int intValue; 105 AaptLocaleValue localeValue; 106 107 AxisValue() : intValue(0) { 108 } 109 110 inline int compare(const AxisValue &other) const { 111 if (intValue != other.intValue) { 112 return intValue - other.intValue; 113 } 114 115 return localeValue.compare(other.localeValue); 116 } 117 118 inline bool operator<(const AxisValue& o) const { return compare(o) < 0; } 119 inline bool operator<=(const AxisValue& o) const { return compare(o) <= 0; } 120 inline bool operator==(const AxisValue& o) const { return compare(o) == 0; } 121 inline bool operator!=(const AxisValue& o) const { return compare(o) != 0; } 122 inline bool operator>=(const AxisValue& o) const { return compare(o) >= 0; } 123 inline bool operator>(const AxisValue& o) const { return compare(o) > 0; } 124}; 125 126/** 127 * This structure contains a specific variation of a single file out 128 * of all the variations it can have that we can have. 129 */ 130struct AaptGroupEntry 131{ 132public: 133 AaptGroupEntry() : mParamsChanged(true) { 134 memset(&mParams, 0, sizeof(ResTable_config)); 135 } 136 137 bool initFromDirName(const char* dir, String8* resType); 138 139 static bool parseFilterNamePart(const String8& part, int* axis, AxisValue* value); 140 141 static AxisValue getConfigValueForAxis(const ResTable_config& config, int axis); 142 143 static bool configSameExcept(const ResTable_config& config, 144 const ResTable_config& otherConfig, int axis); 145 146 int compare(const AaptGroupEntry& o) const; 147 148 const ResTable_config toParams() const; 149 150 inline bool operator<(const AaptGroupEntry& o) const { return compare(o) < 0; } 151 inline bool operator<=(const AaptGroupEntry& o) const { return compare(o) <= 0; } 152 inline bool operator==(const AaptGroupEntry& o) const { return compare(o) == 0; } 153 inline bool operator!=(const AaptGroupEntry& o) const { return compare(o) != 0; } 154 inline bool operator>=(const AaptGroupEntry& o) const { return compare(o) >= 0; } 155 inline bool operator>(const AaptGroupEntry& o) const { return compare(o) > 0; } 156 157 String8 toString() const; 158 String8 toDirName(const String8& resType) const; 159 160 const String8& getVersionString() const { return version; } 161 162private: 163 static bool getMccName(const char* name, ResTable_config* out = NULL); 164 static bool getMncName(const char* name, ResTable_config* out = NULL); 165 static bool getScreenLayoutSizeName(const char* name, ResTable_config* out = NULL); 166 static bool getScreenLayoutLongName(const char* name, ResTable_config* out = NULL); 167 static bool getOrientationName(const char* name, ResTable_config* out = NULL); 168 static bool getUiModeTypeName(const char* name, ResTable_config* out = NULL); 169 static bool getUiModeNightName(const char* name, ResTable_config* out = NULL); 170 static bool getDensityName(const char* name, ResTable_config* out = NULL); 171 static bool getTouchscreenName(const char* name, ResTable_config* out = NULL); 172 static bool getKeysHiddenName(const char* name, ResTable_config* out = NULL); 173 static bool getKeyboardName(const char* name, ResTable_config* out = NULL); 174 static bool getNavigationName(const char* name, ResTable_config* out = NULL); 175 static bool getNavHiddenName(const char* name, ResTable_config* out = NULL); 176 static bool getScreenSizeName(const char* name, ResTable_config* out = NULL); 177 static bool getSmallestScreenWidthDpName(const char* name, ResTable_config* out = NULL); 178 static bool getScreenWidthDpName(const char* name, ResTable_config* out = NULL); 179 static bool getScreenHeightDpName(const char* name, ResTable_config* out = NULL); 180 static bool getLayoutDirectionName(const char* name, ResTable_config* out = NULL); 181 static bool getVersionName(const char* name, ResTable_config* out = NULL); 182 183 String8 mcc; 184 String8 mnc; 185 AaptLocaleValue locale; 186 String8 vendor; 187 String8 smallestScreenWidthDp; 188 String8 screenWidthDp; 189 String8 screenHeightDp; 190 String8 screenLayoutSize; 191 String8 screenLayoutLong; 192 String8 orientation; 193 String8 uiModeType; 194 String8 uiModeNight; 195 String8 density; 196 String8 touchscreen; 197 String8 keysHidden; 198 String8 keyboard; 199 String8 navHidden; 200 String8 navigation; 201 String8 screenSize; 202 String8 layoutDirection; 203 String8 version; 204 205 mutable bool mParamsChanged; 206 mutable ResTable_config mParams; 207}; 208 209inline int compare_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs) 210{ 211 return lhs.compare(rhs); 212} 213 214inline int strictly_order_type(const AaptGroupEntry& lhs, const AaptGroupEntry& rhs) 215{ 216 return compare_type(lhs, rhs) < 0; 217} 218 219class AaptGroup; 220class FilePathStore; 221 222/** 223 * A single asset file we know about. 224 */ 225class AaptFile : public RefBase 226{ 227public: 228 AaptFile(const String8& sourceFile, const AaptGroupEntry& groupEntry, 229 const String8& resType) 230 : mGroupEntry(groupEntry) 231 , mResourceType(resType) 232 , mSourceFile(sourceFile) 233 , mData(NULL) 234 , mDataSize(0) 235 , mBufferSize(0) 236 , mCompression(ZipEntry::kCompressStored) 237 { 238 //printf("new AaptFile created %s\n", (const char*)sourceFile); 239 } 240 virtual ~AaptFile() { 241 free(mData); 242 } 243 244 const String8& getPath() const { return mPath; } 245 const AaptGroupEntry& getGroupEntry() const { return mGroupEntry; } 246 247 // Data API. If there is data attached to the file, 248 // getSourceFile() is not used. 249 bool hasData() const { return mData != NULL; } 250 const void* getData() const { return mData; } 251 size_t getSize() const { return mDataSize; } 252 void* editData(size_t size); 253 void* editData(size_t* outSize = NULL); 254 void* editDataInRange(size_t offset, size_t size); 255 void* padData(size_t wordSize); 256 status_t writeData(const void* data, size_t size); 257 void clearData(); 258 259 const String8& getResourceType() const { return mResourceType; } 260 261 // File API. If the file does not hold raw data, this is 262 // a full path to a file on the filesystem that holds its data. 263 const String8& getSourceFile() const { return mSourceFile; } 264 265 String8 getPrintableSource() const; 266 267 // Desired compression method, as per utils/ZipEntry.h. For example, 268 // no compression is ZipEntry::kCompressStored. 269 int getCompressionMethod() const { return mCompression; } 270 void setCompressionMethod(int c) { mCompression = c; } 271private: 272 friend class AaptGroup; 273 274 String8 mPath; 275 AaptGroupEntry mGroupEntry; 276 String8 mResourceType; 277 String8 mSourceFile; 278 void* mData; 279 size_t mDataSize; 280 size_t mBufferSize; 281 int mCompression; 282}; 283 284/** 285 * A group of related files (the same file, with different 286 * vendor/locale variations). 287 */ 288class AaptGroup : public RefBase 289{ 290public: 291 AaptGroup(const String8& leaf, const String8& path) 292 : mLeaf(leaf), mPath(path) { } 293 virtual ~AaptGroup() { } 294 295 const String8& getLeaf() const { return mLeaf; } 296 297 // Returns the relative path after the AaptGroupEntry dirs. 298 const String8& getPath() const { return mPath; } 299 300 const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& getFiles() const 301 { return mFiles; } 302 303 status_t addFile(const sp<AaptFile>& file, const bool overwriteDuplicate=false); 304 void removeFile(size_t index); 305 306 void print(const String8& prefix) const; 307 308 String8 getPrintableSource() const; 309 310private: 311 String8 mLeaf; 312 String8 mPath; 313 314 DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > mFiles; 315}; 316 317/** 318 * A single directory of assets, which can contain files and other 319 * sub-directories. 320 */ 321class AaptDir : public RefBase 322{ 323public: 324 AaptDir(const String8& leaf, const String8& path) 325 : mLeaf(leaf), mPath(path) { } 326 virtual ~AaptDir() { } 327 328 const String8& getLeaf() const { return mLeaf; } 329 330 const String8& getPath() const { return mPath; } 331 332 const DefaultKeyedVector<String8, sp<AaptGroup> >& getFiles() const { return mFiles; } 333 const DefaultKeyedVector<String8, sp<AaptDir> >& getDirs() const { return mDirs; } 334 335 virtual status_t addFile(const String8& name, const sp<AaptGroup>& file); 336 337 void removeFile(const String8& name); 338 void removeDir(const String8& name); 339 340 /* 341 * Perform some sanity checks on the names of files and directories here. 342 * In particular: 343 * - Check for illegal chars in filenames. 344 * - Check filename length. 345 * - Check for presence of ".gz" and non-".gz" copies of same file. 346 * - Check for multiple files whose names match in a case-insensitive 347 * fashion (problematic for some systems). 348 * 349 * Comparing names against all other names is O(n^2). We could speed 350 * it up some by sorting the entries and being smarter about what we 351 * compare against, but I'm not expecting to have enough files in a 352 * single directory to make a noticeable difference in speed. 353 * 354 * Note that sorting here is not enough to guarantee that the package 355 * contents are sorted -- subsequent updates can rearrange things. 356 */ 357 status_t validate() const; 358 359 void print(const String8& prefix) const; 360 361 String8 getPrintableSource() const; 362 363private: 364 friend class AaptAssets; 365 366 status_t addDir(const String8& name, const sp<AaptDir>& dir); 367 sp<AaptDir> makeDir(const String8& name); 368 status_t addLeafFile(const String8& leafName, 369 const sp<AaptFile>& file, 370 const bool overwrite=false); 371 virtual ssize_t slurpFullTree(Bundle* bundle, 372 const String8& srcDir, 373 const AaptGroupEntry& kind, 374 const String8& resType, 375 sp<FilePathStore>& fullResPaths, 376 const bool overwrite=false); 377 378 String8 mLeaf; 379 String8 mPath; 380 381 DefaultKeyedVector<String8, sp<AaptGroup> > mFiles; 382 DefaultKeyedVector<String8, sp<AaptDir> > mDirs; 383}; 384 385/** 386 * All information we know about a particular symbol. 387 */ 388class AaptSymbolEntry 389{ 390public: 391 AaptSymbolEntry() 392 : isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN) 393 { 394 } 395 AaptSymbolEntry(const String8& _name) 396 : name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN) 397 { 398 } 399 AaptSymbolEntry(const AaptSymbolEntry& o) 400 : name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic) 401 , isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment) 402 , typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal) 403 { 404 } 405 AaptSymbolEntry operator=(const AaptSymbolEntry& o) 406 { 407 sourcePos = o.sourcePos; 408 isPublic = o.isPublic; 409 isJavaSymbol = o.isJavaSymbol; 410 comment = o.comment; 411 typeComment = o.typeComment; 412 typeCode = o.typeCode; 413 int32Val = o.int32Val; 414 stringVal = o.stringVal; 415 return *this; 416 } 417 418 const String8 name; 419 420 SourcePos sourcePos; 421 bool isPublic; 422 bool isJavaSymbol; 423 424 String16 comment; 425 String16 typeComment; 426 427 enum { 428 TYPE_UNKNOWN = 0, 429 TYPE_INT32, 430 TYPE_STRING 431 }; 432 433 int typeCode; 434 435 // Value. May be one of these. 436 int32_t int32Val; 437 String8 stringVal; 438}; 439 440/** 441 * A group of related symbols (such as indices into a string block) 442 * that have been generated from the assets. 443 */ 444class AaptSymbols : public RefBase 445{ 446public: 447 AaptSymbols() { } 448 virtual ~AaptSymbols() { } 449 450 status_t addSymbol(const String8& name, int32_t value, const SourcePos& pos) { 451 if (!check_valid_symbol_name(name, pos, "symbol")) { 452 return BAD_VALUE; 453 } 454 AaptSymbolEntry& sym = edit_symbol(name, &pos); 455 sym.typeCode = AaptSymbolEntry::TYPE_INT32; 456 sym.int32Val = value; 457 return NO_ERROR; 458 } 459 460 status_t addStringSymbol(const String8& name, const String8& value, 461 const SourcePos& pos) { 462 if (!check_valid_symbol_name(name, pos, "symbol")) { 463 return BAD_VALUE; 464 } 465 AaptSymbolEntry& sym = edit_symbol(name, &pos); 466 sym.typeCode = AaptSymbolEntry::TYPE_STRING; 467 sym.stringVal = value; 468 return NO_ERROR; 469 } 470 471 status_t makeSymbolPublic(const String8& name, const SourcePos& pos) { 472 if (!check_valid_symbol_name(name, pos, "symbol")) { 473 return BAD_VALUE; 474 } 475 AaptSymbolEntry& sym = edit_symbol(name, &pos); 476 sym.isPublic = true; 477 return NO_ERROR; 478 } 479 480 status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) { 481 if (!check_valid_symbol_name(name, pos, "symbol")) { 482 return BAD_VALUE; 483 } 484 AaptSymbolEntry& sym = edit_symbol(name, &pos); 485 sym.isJavaSymbol = true; 486 return NO_ERROR; 487 } 488 489 void appendComment(const String8& name, const String16& comment, const SourcePos& pos) { 490 if (comment.size() <= 0) { 491 return; 492 } 493 AaptSymbolEntry& sym = edit_symbol(name, &pos); 494 if (sym.comment.size() == 0) { 495 sym.comment = comment; 496 } else { 497 sym.comment.append(String16("\n")); 498 sym.comment.append(comment); 499 } 500 } 501 502 void appendTypeComment(const String8& name, const String16& comment) { 503 if (comment.size() <= 0) { 504 return; 505 } 506 AaptSymbolEntry& sym = edit_symbol(name, NULL); 507 if (sym.typeComment.size() == 0) { 508 sym.typeComment = comment; 509 } else { 510 sym.typeComment.append(String16("\n")); 511 sym.typeComment.append(comment); 512 } 513 } 514 515 sp<AaptSymbols> addNestedSymbol(const String8& name, const SourcePos& pos) { 516 if (!check_valid_symbol_name(name, pos, "nested symbol")) { 517 return NULL; 518 } 519 520 sp<AaptSymbols> sym = mNestedSymbols.valueFor(name); 521 if (sym == NULL) { 522 sym = new AaptSymbols(); 523 mNestedSymbols.add(name, sym); 524 } 525 526 return sym; 527 } 528 529 status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols); 530 531 const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const 532 { return mSymbols; } 533 const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const 534 { return mNestedSymbols; } 535 536 const String16& getComment(const String8& name) const 537 { return get_symbol(name).comment; } 538 const String16& getTypeComment(const String8& name) const 539 { return get_symbol(name).typeComment; } 540 541private: 542 bool check_valid_symbol_name(const String8& symbol, const SourcePos& pos, const char* label) { 543 if (valid_symbol_name(symbol)) { 544 return true; 545 } 546 pos.error("invalid %s: '%s'\n", label, symbol.string()); 547 return false; 548 } 549 AaptSymbolEntry& edit_symbol(const String8& symbol, const SourcePos* pos) { 550 ssize_t i = mSymbols.indexOfKey(symbol); 551 if (i < 0) { 552 i = mSymbols.add(symbol, AaptSymbolEntry(symbol)); 553 } 554 AaptSymbolEntry& sym = mSymbols.editValueAt(i); 555 if (pos != NULL && sym.sourcePos.line < 0) { 556 sym.sourcePos = *pos; 557 } 558 return sym; 559 } 560 const AaptSymbolEntry& get_symbol(const String8& symbol) const { 561 ssize_t i = mSymbols.indexOfKey(symbol); 562 if (i >= 0) { 563 return mSymbols.valueAt(i); 564 } 565 return mDefSymbol; 566 } 567 568 KeyedVector<String8, AaptSymbolEntry> mSymbols; 569 DefaultKeyedVector<String8, sp<AaptSymbols> > mNestedSymbols; 570 AaptSymbolEntry mDefSymbol; 571}; 572 573class ResourceTypeSet : public RefBase, 574 public KeyedVector<String8,sp<AaptGroup> > 575{ 576public: 577 ResourceTypeSet(); 578}; 579 580// Storage for lists of fully qualified paths for 581// resources encountered during slurping. 582class FilePathStore : public RefBase, 583 public Vector<String8> 584{ 585public: 586 FilePathStore(); 587}; 588 589/** 590 * Asset hierarchy being operated on. 591 */ 592class AaptAssets : public AaptDir 593{ 594public: 595 AaptAssets(); 596 virtual ~AaptAssets() { delete mRes; } 597 598 const String8& getPackage() const { return mPackage; } 599 void setPackage(const String8& package) { 600 mPackage = package; 601 mSymbolsPrivatePackage = package; 602 mHavePrivateSymbols = false; 603 } 604 605 const SortedVector<AaptGroupEntry>& getGroupEntries() const; 606 607 virtual status_t addFile(const String8& name, const sp<AaptGroup>& file); 608 609 sp<AaptFile> addFile(const String8& filePath, 610 const AaptGroupEntry& entry, 611 const String8& srcDir, 612 sp<AaptGroup>* outGroup, 613 const String8& resType); 614 615 void addResource(const String8& leafName, 616 const String8& path, 617 const sp<AaptFile>& file, 618 const String8& resType); 619 620 void addGroupEntry(const AaptGroupEntry& entry) { mGroupEntries.add(entry); } 621 622 ssize_t slurpFromArgs(Bundle* bundle); 623 624 sp<AaptSymbols> getSymbolsFor(const String8& name); 625 626 sp<AaptSymbols> getJavaSymbolsFor(const String8& name); 627 628 status_t applyJavaSymbols(); 629 630 const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; } 631 632 String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; } 633 void setSymbolsPrivatePackage(const String8& pkg) { 634 mSymbolsPrivatePackage = pkg; 635 mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage; 636 } 637 638 bool havePrivateSymbols() const { return mHavePrivateSymbols; } 639 640 bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const; 641 642 status_t buildIncludedResources(Bundle* bundle); 643 status_t addIncludedResources(const sp<AaptFile>& file); 644 const ResTable& getIncludedResources() const; 645 646 void print(const String8& prefix) const; 647 648 inline const Vector<sp<AaptDir> >& resDirs() const { return mResDirs; } 649 sp<AaptDir> resDir(const String8& name) const; 650 651 inline sp<AaptAssets> getOverlay() { return mOverlay; } 652 inline void setOverlay(sp<AaptAssets>& overlay) { mOverlay = overlay; } 653 654 inline KeyedVector<String8, sp<ResourceTypeSet> >* getResources() { return mRes; } 655 inline void 656 setResources(KeyedVector<String8, sp<ResourceTypeSet> >* res) { delete mRes; mRes = res; } 657 658 inline sp<FilePathStore>& getFullResPaths() { return mFullResPaths; } 659 inline void 660 setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; } 661 662 inline sp<FilePathStore>& getFullAssetPaths() { return mFullAssetPaths; } 663 inline void 664 setFullAssetPaths(sp<FilePathStore>& res) { mFullAssetPaths = res; } 665 666private: 667 virtual ssize_t slurpFullTree(Bundle* bundle, 668 const String8& srcDir, 669 const AaptGroupEntry& kind, 670 const String8& resType, 671 sp<FilePathStore>& fullResPaths); 672 673 ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir); 674 ssize_t slurpResourceZip(Bundle* bundle, const char* filename); 675 676 status_t filter(Bundle* bundle); 677 678 String8 mPackage; 679 SortedVector<AaptGroupEntry> mGroupEntries; 680 DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols; 681 DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols; 682 String8 mSymbolsPrivatePackage; 683 bool mHavePrivateSymbols; 684 685 Vector<sp<AaptDir> > mResDirs; 686 687 bool mChanged; 688 689 bool mHaveIncludedAssets; 690 AssetManager mIncludedAssets; 691 692 sp<AaptAssets> mOverlay; 693 KeyedVector<String8, sp<ResourceTypeSet> >* mRes; 694 695 sp<FilePathStore> mFullResPaths; 696 sp<FilePathStore> mFullAssetPaths; 697}; 698 699#endif // __AAPT_ASSETS_H 700 701