AaptAssets.h revision 91447d88f2bdf9c2bf8d1a53570efef6172fba74
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* padData(size_t wordSize); 255 status_t writeData(const void* data, size_t size); 256 void clearData(); 257 258 const String8& getResourceType() const { return mResourceType; } 259 260 // File API. If the file does not hold raw data, this is 261 // a full path to a file on the filesystem that holds its data. 262 const String8& getSourceFile() const { return mSourceFile; } 263 264 String8 getPrintableSource() const; 265 266 // Desired compression method, as per utils/ZipEntry.h. For example, 267 // no compression is ZipEntry::kCompressStored. 268 int getCompressionMethod() const { return mCompression; } 269 void setCompressionMethod(int c) { mCompression = c; } 270private: 271 friend class AaptGroup; 272 273 String8 mPath; 274 AaptGroupEntry mGroupEntry; 275 String8 mResourceType; 276 String8 mSourceFile; 277 void* mData; 278 size_t mDataSize; 279 size_t mBufferSize; 280 int mCompression; 281}; 282 283/** 284 * A group of related files (the same file, with different 285 * vendor/locale variations). 286 */ 287class AaptGroup : public RefBase 288{ 289public: 290 AaptGroup(const String8& leaf, const String8& path) 291 : mLeaf(leaf), mPath(path) { } 292 virtual ~AaptGroup() { } 293 294 const String8& getLeaf() const { return mLeaf; } 295 296 // Returns the relative path after the AaptGroupEntry dirs. 297 const String8& getPath() const { return mPath; } 298 299 const DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> >& getFiles() const 300 { return mFiles; } 301 302 status_t addFile(const sp<AaptFile>& file, const bool overwriteDuplicate=false); 303 void removeFile(size_t index); 304 305 void print(const String8& prefix) const; 306 307 String8 getPrintableSource() const; 308 309private: 310 String8 mLeaf; 311 String8 mPath; 312 313 DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > mFiles; 314}; 315 316/** 317 * A single directory of assets, which can contain files and other 318 * sub-directories. 319 */ 320class AaptDir : public RefBase 321{ 322public: 323 AaptDir(const String8& leaf, const String8& path) 324 : mLeaf(leaf), mPath(path) { } 325 virtual ~AaptDir() { } 326 327 const String8& getLeaf() const { return mLeaf; } 328 329 const String8& getPath() const { return mPath; } 330 331 const DefaultKeyedVector<String8, sp<AaptGroup> >& getFiles() const { return mFiles; } 332 const DefaultKeyedVector<String8, sp<AaptDir> >& getDirs() const { return mDirs; } 333 334 virtual status_t addFile(const String8& name, const sp<AaptGroup>& file); 335 336 void removeFile(const String8& name); 337 void removeDir(const String8& name); 338 339 /* 340 * Perform some sanity checks on the names of files and directories here. 341 * In particular: 342 * - Check for illegal chars in filenames. 343 * - Check filename length. 344 * - Check for presence of ".gz" and non-".gz" copies of same file. 345 * - Check for multiple files whose names match in a case-insensitive 346 * fashion (problematic for some systems). 347 * 348 * Comparing names against all other names is O(n^2). We could speed 349 * it up some by sorting the entries and being smarter about what we 350 * compare against, but I'm not expecting to have enough files in a 351 * single directory to make a noticeable difference in speed. 352 * 353 * Note that sorting here is not enough to guarantee that the package 354 * contents are sorted -- subsequent updates can rearrange things. 355 */ 356 status_t validate() const; 357 358 void print(const String8& prefix) const; 359 360 String8 getPrintableSource() const; 361 362private: 363 friend class AaptAssets; 364 365 status_t addDir(const String8& name, const sp<AaptDir>& dir); 366 sp<AaptDir> makeDir(const String8& name); 367 status_t addLeafFile(const String8& leafName, 368 const sp<AaptFile>& file, 369 const bool overwrite=false); 370 virtual ssize_t slurpFullTree(Bundle* bundle, 371 const String8& srcDir, 372 const AaptGroupEntry& kind, 373 const String8& resType, 374 sp<FilePathStore>& fullResPaths, 375 const bool overwrite=false); 376 377 String8 mLeaf; 378 String8 mPath; 379 380 DefaultKeyedVector<String8, sp<AaptGroup> > mFiles; 381 DefaultKeyedVector<String8, sp<AaptDir> > mDirs; 382}; 383 384/** 385 * All information we know about a particular symbol. 386 */ 387class AaptSymbolEntry 388{ 389public: 390 AaptSymbolEntry() 391 : isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN) 392 { 393 } 394 AaptSymbolEntry(const String8& _name) 395 : name(_name), isPublic(false), isJavaSymbol(false), typeCode(TYPE_UNKNOWN) 396 { 397 } 398 AaptSymbolEntry(const AaptSymbolEntry& o) 399 : name(o.name), sourcePos(o.sourcePos), isPublic(o.isPublic) 400 , isJavaSymbol(o.isJavaSymbol), comment(o.comment), typeComment(o.typeComment) 401 , typeCode(o.typeCode), int32Val(o.int32Val), stringVal(o.stringVal) 402 { 403 } 404 AaptSymbolEntry operator=(const AaptSymbolEntry& o) 405 { 406 sourcePos = o.sourcePos; 407 isPublic = o.isPublic; 408 isJavaSymbol = o.isJavaSymbol; 409 comment = o.comment; 410 typeComment = o.typeComment; 411 typeCode = o.typeCode; 412 int32Val = o.int32Val; 413 stringVal = o.stringVal; 414 return *this; 415 } 416 417 const String8 name; 418 419 SourcePos sourcePos; 420 bool isPublic; 421 bool isJavaSymbol; 422 423 String16 comment; 424 String16 typeComment; 425 426 enum { 427 TYPE_UNKNOWN = 0, 428 TYPE_INT32, 429 TYPE_STRING 430 }; 431 432 int typeCode; 433 434 // Value. May be one of these. 435 int32_t int32Val; 436 String8 stringVal; 437}; 438 439/** 440 * A group of related symbols (such as indices into a string block) 441 * that have been generated from the assets. 442 */ 443class AaptSymbols : public RefBase 444{ 445public: 446 AaptSymbols() { } 447 virtual ~AaptSymbols() { } 448 449 status_t addSymbol(const String8& name, int32_t value, const SourcePos& pos) { 450 if (!check_valid_symbol_name(name, pos, "symbol")) { 451 return BAD_VALUE; 452 } 453 AaptSymbolEntry& sym = edit_symbol(name, &pos); 454 sym.typeCode = AaptSymbolEntry::TYPE_INT32; 455 sym.int32Val = value; 456 return NO_ERROR; 457 } 458 459 status_t addStringSymbol(const String8& name, const String8& value, 460 const SourcePos& pos) { 461 if (!check_valid_symbol_name(name, pos, "symbol")) { 462 return BAD_VALUE; 463 } 464 AaptSymbolEntry& sym = edit_symbol(name, &pos); 465 sym.typeCode = AaptSymbolEntry::TYPE_STRING; 466 sym.stringVal = value; 467 return NO_ERROR; 468 } 469 470 status_t makeSymbolPublic(const String8& name, const SourcePos& pos) { 471 if (!check_valid_symbol_name(name, pos, "symbol")) { 472 return BAD_VALUE; 473 } 474 AaptSymbolEntry& sym = edit_symbol(name, &pos); 475 sym.isPublic = true; 476 return NO_ERROR; 477 } 478 479 status_t makeSymbolJavaSymbol(const String8& name, const SourcePos& pos) { 480 if (!check_valid_symbol_name(name, pos, "symbol")) { 481 return BAD_VALUE; 482 } 483 AaptSymbolEntry& sym = edit_symbol(name, &pos); 484 sym.isJavaSymbol = true; 485 return NO_ERROR; 486 } 487 488 void appendComment(const String8& name, const String16& comment, const SourcePos& pos) { 489 if (comment.size() <= 0) { 490 return; 491 } 492 AaptSymbolEntry& sym = edit_symbol(name, &pos); 493 if (sym.comment.size() == 0) { 494 sym.comment = comment; 495 } else { 496 sym.comment.append(String16("\n")); 497 sym.comment.append(comment); 498 } 499 } 500 501 void appendTypeComment(const String8& name, const String16& comment) { 502 if (comment.size() <= 0) { 503 return; 504 } 505 AaptSymbolEntry& sym = edit_symbol(name, NULL); 506 if (sym.typeComment.size() == 0) { 507 sym.typeComment = comment; 508 } else { 509 sym.typeComment.append(String16("\n")); 510 sym.typeComment.append(comment); 511 } 512 } 513 514 sp<AaptSymbols> addNestedSymbol(const String8& name, const SourcePos& pos) { 515 if (!check_valid_symbol_name(name, pos, "nested symbol")) { 516 return NULL; 517 } 518 519 sp<AaptSymbols> sym = mNestedSymbols.valueFor(name); 520 if (sym == NULL) { 521 sym = new AaptSymbols(); 522 mNestedSymbols.add(name, sym); 523 } 524 525 return sym; 526 } 527 528 status_t applyJavaSymbols(const sp<AaptSymbols>& javaSymbols); 529 530 const KeyedVector<String8, AaptSymbolEntry>& getSymbols() const 531 { return mSymbols; } 532 const DefaultKeyedVector<String8, sp<AaptSymbols> >& getNestedSymbols() const 533 { return mNestedSymbols; } 534 535 const String16& getComment(const String8& name) const 536 { return get_symbol(name).comment; } 537 const String16& getTypeComment(const String8& name) const 538 { return get_symbol(name).typeComment; } 539 540private: 541 bool check_valid_symbol_name(const String8& symbol, const SourcePos& pos, const char* label) { 542 if (valid_symbol_name(symbol)) { 543 return true; 544 } 545 pos.error("invalid %s: '%s'\n", label, symbol.string()); 546 return false; 547 } 548 AaptSymbolEntry& edit_symbol(const String8& symbol, const SourcePos* pos) { 549 ssize_t i = mSymbols.indexOfKey(symbol); 550 if (i < 0) { 551 i = mSymbols.add(symbol, AaptSymbolEntry(symbol)); 552 } 553 AaptSymbolEntry& sym = mSymbols.editValueAt(i); 554 if (pos != NULL && sym.sourcePos.line < 0) { 555 sym.sourcePos = *pos; 556 } 557 return sym; 558 } 559 const AaptSymbolEntry& get_symbol(const String8& symbol) const { 560 ssize_t i = mSymbols.indexOfKey(symbol); 561 if (i >= 0) { 562 return mSymbols.valueAt(i); 563 } 564 return mDefSymbol; 565 } 566 567 KeyedVector<String8, AaptSymbolEntry> mSymbols; 568 DefaultKeyedVector<String8, sp<AaptSymbols> > mNestedSymbols; 569 AaptSymbolEntry mDefSymbol; 570}; 571 572class ResourceTypeSet : public RefBase, 573 public KeyedVector<String8,sp<AaptGroup> > 574{ 575public: 576 ResourceTypeSet(); 577}; 578 579// Storage for lists of fully qualified paths for 580// resources encountered during slurping. 581class FilePathStore : public RefBase, 582 public Vector<String8> 583{ 584public: 585 FilePathStore(); 586}; 587 588/** 589 * Asset hierarchy being operated on. 590 */ 591class AaptAssets : public AaptDir 592{ 593public: 594 AaptAssets(); 595 virtual ~AaptAssets() { delete mRes; } 596 597 const String8& getPackage() const { return mPackage; } 598 void setPackage(const String8& package) { 599 mPackage = package; 600 mSymbolsPrivatePackage = package; 601 mHavePrivateSymbols = false; 602 } 603 604 const SortedVector<AaptGroupEntry>& getGroupEntries() const; 605 606 virtual status_t addFile(const String8& name, const sp<AaptGroup>& file); 607 608 sp<AaptFile> addFile(const String8& filePath, 609 const AaptGroupEntry& entry, 610 const String8& srcDir, 611 sp<AaptGroup>* outGroup, 612 const String8& resType); 613 614 void addResource(const String8& leafName, 615 const String8& path, 616 const sp<AaptFile>& file, 617 const String8& resType); 618 619 void addGroupEntry(const AaptGroupEntry& entry) { mGroupEntries.add(entry); } 620 621 ssize_t slurpFromArgs(Bundle* bundle); 622 623 sp<AaptSymbols> getSymbolsFor(const String8& name); 624 625 sp<AaptSymbols> getJavaSymbolsFor(const String8& name); 626 627 status_t applyJavaSymbols(); 628 629 const DefaultKeyedVector<String8, sp<AaptSymbols> >& getSymbols() const { return mSymbols; } 630 631 String8 getSymbolsPrivatePackage() const { return mSymbolsPrivatePackage; } 632 void setSymbolsPrivatePackage(const String8& pkg) { 633 mSymbolsPrivatePackage = pkg; 634 mHavePrivateSymbols = mSymbolsPrivatePackage != mPackage; 635 } 636 637 bool havePrivateSymbols() const { return mHavePrivateSymbols; } 638 639 bool isJavaSymbol(const AaptSymbolEntry& sym, bool includePrivate) const; 640 641 status_t buildIncludedResources(Bundle* bundle); 642 status_t addIncludedResources(const sp<AaptFile>& file); 643 const ResTable& getIncludedResources() const; 644 645 void print(const String8& prefix) const; 646 647 inline const Vector<sp<AaptDir> >& resDirs() const { return mResDirs; } 648 sp<AaptDir> resDir(const String8& name) const; 649 650 inline sp<AaptAssets> getOverlay() { return mOverlay; } 651 inline void setOverlay(sp<AaptAssets>& overlay) { mOverlay = overlay; } 652 653 inline KeyedVector<String8, sp<ResourceTypeSet> >* getResources() { return mRes; } 654 inline void 655 setResources(KeyedVector<String8, sp<ResourceTypeSet> >* res) { delete mRes; mRes = res; } 656 657 inline sp<FilePathStore>& getFullResPaths() { return mFullResPaths; } 658 inline void 659 setFullResPaths(sp<FilePathStore>& res) { mFullResPaths = res; } 660 661 inline sp<FilePathStore>& getFullAssetPaths() { return mFullAssetPaths; } 662 inline void 663 setFullAssetPaths(sp<FilePathStore>& res) { mFullAssetPaths = res; } 664 665private: 666 virtual ssize_t slurpFullTree(Bundle* bundle, 667 const String8& srcDir, 668 const AaptGroupEntry& kind, 669 const String8& resType, 670 sp<FilePathStore>& fullResPaths); 671 672 ssize_t slurpResourceTree(Bundle* bundle, const String8& srcDir); 673 ssize_t slurpResourceZip(Bundle* bundle, const char* filename); 674 675 status_t filter(Bundle* bundle); 676 677 String8 mPackage; 678 SortedVector<AaptGroupEntry> mGroupEntries; 679 DefaultKeyedVector<String8, sp<AaptSymbols> > mSymbols; 680 DefaultKeyedVector<String8, sp<AaptSymbols> > mJavaSymbols; 681 String8 mSymbolsPrivatePackage; 682 bool mHavePrivateSymbols; 683 684 Vector<sp<AaptDir> > mResDirs; 685 686 bool mChanged; 687 688 bool mHaveIncludedAssets; 689 AssetManager mIncludedAssets; 690 691 sp<AaptAssets> mOverlay; 692 KeyedVector<String8, sp<ResourceTypeSet> >* mRes; 693 694 sp<FilePathStore> mFullResPaths; 695 sp<FilePathStore> mFullAssetPaths; 696}; 697 698#endif // __AAPT_ASSETS_H 699 700