Loading tools/aapt/Resource.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -1403,7 +1403,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(bundle, assets, String16(it.getBaseName()), it.getFile(), &table, xmlFlags); if (err == NO_ERROR) { // Only verify IDs if there was no error and the file is non-empty. if (err == NO_ERROR && it.getFile()->hasData()) { ResXMLTree block; block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); checkForIds(src, block); Loading Loading @@ -1550,7 +1551,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(bundle, assets, String16(it.getBaseName()), it.getFile(), &table, xmlFlags); if (err == NO_ERROR) { if (err == NO_ERROR && it.getFile()->hasData()) { ResXMLTree block; block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); checkForIds(src, block); Loading Loading @@ -1598,7 +1599,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil err = compileXmlFile(bundle, assets, workItem.resourceName, workItem.xmlRoot, workItem.file, &table, xmlCompilationFlags); if (err == NO_ERROR) { if (err == NO_ERROR && workItem.file->hasData()) { assets->addResource(workItem.resPath.getPathLeaf(), workItem.resPath, workItem.file, Loading tools/aapt/ResourceTable.cpp +82 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,17 @@ status_t compileXmlFile(const Bundle* bundle, ResourceTable* table, int options) { if (table->versionForCompat(bundle, resourceName, target, root)) { // The file was versioned, so stop processing here. // The resource entry has already been removed and the new one added. // Remove the assets entry. sp<AaptDir> resDir = assets->getDirs().valueFor(String8("res")); sp<AaptDir> dir = resDir->getDirs().valueFor(target->getGroupEntry().toDirName( target->getResourceType())); dir->removeFile(target->getPath().getPathLeaf()); return NO_ERROR; } if ((options&XML_COMPILE_STRIP_WHITESPACE) != 0) { root->removeWhitespace(true, NULL); } else if ((options&XML_COMPILE_COMPACT_WHITESPACE) != 0) { Loading Loading @@ -4758,6 +4769,77 @@ static bool IsTransitionElement(const String16& name) { return false; } bool ResourceTable::versionForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& target, const sp<XMLNode>& root) { XMLNode* node = root.get(); while (node->getType() != XMLNode::TYPE_ELEMENT) { // We're assuming the root element is what we're looking for, which can only be under a // bunch of namespace declarations. if (node->getChildren().size() != 1) { // Not sure what to do, bail. return false; } node = node->getChildren().itemAt(0).get(); } if (node->getElementNamespace().size() != 0) { // Not something we care about. return false; } int versionedSdk = 0; if (node->getElementName() == String16("adaptive-icon")) { versionedSdk = SDK_O; } const int minSdkVersion = getMinSdkVersion(bundle); const ConfigDescription config(target->getGroupEntry().toParams()); if (versionedSdk <= minSdkVersion || versionedSdk <= config.sdkVersion) { return false; } sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()), String16(target->getResourceType()), resourceName); if (!shouldGenerateVersionedResource(cl, config, versionedSdk)) { return false; } // Remove the original entry. cl->removeEntry(config); // We need to wholesale version this file. ConfigDescription newConfig(config); newConfig.sdkVersion = versionedSdk; sp<AaptFile> newFile = new AaptFile(target->getSourceFile(), AaptGroupEntry(newConfig), target->getResourceType()); String8 resPath = String8::format("res/%s/%s.xml", newFile->getGroupEntry().toDirName(target->getResourceType()).string(), String8(resourceName).string()); resPath.convertToResPath(); // Add a resource table entry. addEntry(SourcePos(), String16(mAssets->getPackage()), String16(target->getResourceType()), resourceName, String16(resPath), NULL, &newConfig); // Schedule this to be compiled. CompileResourceWorkItem item; item.resourceName = resourceName; item.resPath = resPath; item.file = newFile; item.xmlRoot = root->clone(); item.needsCompiling = false; // This step occurs after we parse/assign, so we don't need // to do it again. mWorkQueue.push(item); // Now mark the old entry as deleted. return true; } status_t ResourceTable::modifyForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& target, Loading tools/aapt/ResourceTable.h +7 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,9 @@ public: size_t numLocalResources() const; bool hasResources() const; bool versionForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& file, const sp<XMLNode>& root); status_t modifyForCompat(const Bundle* bundle); status_t modifyForCompat(const Bundle* bundle, const String16& resourceName, Loading Loading @@ -431,6 +434,10 @@ public: mEntries.add(config, entry); } void removeEntry(const ResTable_config& config) { mEntries.removeItem(config); } const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; } private: const String16 mName; Loading Loading
tools/aapt/Resource.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -1403,7 +1403,8 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(bundle, assets, String16(it.getBaseName()), it.getFile(), &table, xmlFlags); if (err == NO_ERROR) { // Only verify IDs if there was no error and the file is non-empty. if (err == NO_ERROR && it.getFile()->hasData()) { ResXMLTree block; block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); checkForIds(src, block); Loading Loading @@ -1550,7 +1551,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil String8 src = it.getFile()->getPrintableSource(); err = compileXmlFile(bundle, assets, String16(it.getBaseName()), it.getFile(), &table, xmlFlags); if (err == NO_ERROR) { if (err == NO_ERROR && it.getFile()->hasData()) { ResXMLTree block; block.setTo(it.getFile()->getData(), it.getFile()->getSize(), true); checkForIds(src, block); Loading Loading @@ -1598,7 +1599,7 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets, sp<ApkBuil err = compileXmlFile(bundle, assets, workItem.resourceName, workItem.xmlRoot, workItem.file, &table, xmlCompilationFlags); if (err == NO_ERROR) { if (err == NO_ERROR && workItem.file->hasData()) { assets->addResource(workItem.resPath.getPathLeaf(), workItem.resPath, workItem.file, Loading
tools/aapt/ResourceTable.cpp +82 −0 Original line number Diff line number Diff line Loading @@ -78,6 +78,17 @@ status_t compileXmlFile(const Bundle* bundle, ResourceTable* table, int options) { if (table->versionForCompat(bundle, resourceName, target, root)) { // The file was versioned, so stop processing here. // The resource entry has already been removed and the new one added. // Remove the assets entry. sp<AaptDir> resDir = assets->getDirs().valueFor(String8("res")); sp<AaptDir> dir = resDir->getDirs().valueFor(target->getGroupEntry().toDirName( target->getResourceType())); dir->removeFile(target->getPath().getPathLeaf()); return NO_ERROR; } if ((options&XML_COMPILE_STRIP_WHITESPACE) != 0) { root->removeWhitespace(true, NULL); } else if ((options&XML_COMPILE_COMPACT_WHITESPACE) != 0) { Loading Loading @@ -4758,6 +4769,77 @@ static bool IsTransitionElement(const String16& name) { return false; } bool ResourceTable::versionForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& target, const sp<XMLNode>& root) { XMLNode* node = root.get(); while (node->getType() != XMLNode::TYPE_ELEMENT) { // We're assuming the root element is what we're looking for, which can only be under a // bunch of namespace declarations. if (node->getChildren().size() != 1) { // Not sure what to do, bail. return false; } node = node->getChildren().itemAt(0).get(); } if (node->getElementNamespace().size() != 0) { // Not something we care about. return false; } int versionedSdk = 0; if (node->getElementName() == String16("adaptive-icon")) { versionedSdk = SDK_O; } const int minSdkVersion = getMinSdkVersion(bundle); const ConfigDescription config(target->getGroupEntry().toParams()); if (versionedSdk <= minSdkVersion || versionedSdk <= config.sdkVersion) { return false; } sp<ConfigList> cl = getConfigList(String16(mAssets->getPackage()), String16(target->getResourceType()), resourceName); if (!shouldGenerateVersionedResource(cl, config, versionedSdk)) { return false; } // Remove the original entry. cl->removeEntry(config); // We need to wholesale version this file. ConfigDescription newConfig(config); newConfig.sdkVersion = versionedSdk; sp<AaptFile> newFile = new AaptFile(target->getSourceFile(), AaptGroupEntry(newConfig), target->getResourceType()); String8 resPath = String8::format("res/%s/%s.xml", newFile->getGroupEntry().toDirName(target->getResourceType()).string(), String8(resourceName).string()); resPath.convertToResPath(); // Add a resource table entry. addEntry(SourcePos(), String16(mAssets->getPackage()), String16(target->getResourceType()), resourceName, String16(resPath), NULL, &newConfig); // Schedule this to be compiled. CompileResourceWorkItem item; item.resourceName = resourceName; item.resPath = resPath; item.file = newFile; item.xmlRoot = root->clone(); item.needsCompiling = false; // This step occurs after we parse/assign, so we don't need // to do it again. mWorkQueue.push(item); // Now mark the old entry as deleted. return true; } status_t ResourceTable::modifyForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& target, Loading
tools/aapt/ResourceTable.h +7 −0 Original line number Diff line number Diff line Loading @@ -203,6 +203,9 @@ public: size_t numLocalResources() const; bool hasResources() const; bool versionForCompat(const Bundle* bundle, const String16& resourceName, const sp<AaptFile>& file, const sp<XMLNode>& root); status_t modifyForCompat(const Bundle* bundle); status_t modifyForCompat(const Bundle* bundle, const String16& resourceName, Loading Loading @@ -431,6 +434,10 @@ public: mEntries.add(config, entry); } void removeEntry(const ResTable_config& config) { mEntries.removeItem(config); } const DefaultKeyedVector<ConfigDescription, sp<Entry> >& getEntries() const { return mEntries; } private: const String16 mName; Loading