AAPT: Version <adaptive-icon> to v26
Bug: 35908647 Test: manual Change-Id: Ic8f43efe34385192fbab18675eb5898ed80912a5
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user