AAPT: Version <adaptive-icon> to v26

Bug: 35908647
Test: manual
Change-Id: Ic8f43efe34385192fbab18675eb5898ed80912a5
This commit is contained in:
Adam Lesinski
2017-03-16 16:54:23 -07:00
parent 3ab5c0173a
commit cf1f1d9128
3 changed files with 93 additions and 3 deletions

View File

@@ -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);
@@ -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);
@@ -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,

View File

@@ -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) {
@@ -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,

View File

@@ -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,
@@ -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;