AAPT2: Support --no-version-vectors

Change-Id: I8029b2f9e2f7ab8e37a49565f95210f47a7be609
This commit is contained in:
Adam Lesinski
2016-03-03 10:09:26 -08:00
parent f311b01b84
commit 626a69f345
3 changed files with 58 additions and 33 deletions

View File

@ -278,6 +278,7 @@ static std::unique_ptr<ResourceFile> loadFileExportHeader(const Source& source,
struct ResourceFileFlattenerOptions {
bool noAutoVersion = false;
bool noVersionVectors = false;
bool keepRawValues = false;
bool doNotCompressAnything = false;
std::vector<std::string> extensionsToNotCompress;
@ -297,14 +298,13 @@ private:
io::IFile* fileToCopy;
std::unique_ptr<xml::XmlResource> xmlToFlatten;
std::string dstPath;
bool skipVersion = false;
};
uint32_t getCompressionFlags(const StringPiece& str);
std::unique_ptr<xml::XmlResource> linkAndVersionXmlFile(const ResourceEntry* entry,
const ResourceFile& fileDesc,
io::IFile* file,
ResourceTable* table);
bool linkAndVersionXmlFile(const ResourceEntry* entry, const ResourceFile& fileDesc,
io::IFile* file, ResourceTable* table, FileOperation* outFileOp);
ResourceFileFlattenerOptions mOptions;
IAaptContext* mContext;
@ -324,11 +324,11 @@ uint32_t ResourceFileFlattener::getCompressionFlags(const StringPiece& str) {
return ArchiveEntry::kCompress;
}
std::unique_ptr<xml::XmlResource> ResourceFileFlattener::linkAndVersionXmlFile(
const ResourceEntry* entry,
const ResourceFile& fileDesc,
io::IFile* file,
ResourceTable* table) {
bool ResourceFileFlattener::linkAndVersionXmlFile(const ResourceEntry* entry,
const ResourceFile& fileDesc,
io::IFile* file,
ResourceTable* table,
FileOperation* outFileOp) {
const StringPiece srcPath = file->getSource().path;
if (mContext->verbose()) {
mContext->getDiagnostics()->note(DiagMessage() << "linking " << srcPath);
@ -337,51 +337,67 @@ std::unique_ptr<xml::XmlResource> ResourceFileFlattener::linkAndVersionXmlFile(
std::unique_ptr<io::IData> data = file->openAsData();
if (!data) {
mContext->getDiagnostics()->error(DiagMessage(file->getSource()) << "failed to open file");
return {};
return false;
}
std::unique_ptr<xml::XmlResource> xmlRes;
if (util::stringEndsWith<char>(srcPath, ".flat")) {
xmlRes = loadBinaryXmlSkipFileExport(file->getSource(), data->data(), data->size(),
mContext->getDiagnostics());
outFileOp->xmlToFlatten = loadBinaryXmlSkipFileExport(file->getSource(),
data->data(), data->size(),
mContext->getDiagnostics());
} else {
xmlRes = xml::inflate(data->data(), data->size(), mContext->getDiagnostics(),
file->getSource());
outFileOp->xmlToFlatten = xml::inflate(data->data(), data->size(),
mContext->getDiagnostics(),
file->getSource());
}
if (!xmlRes) {
return {};
if (!outFileOp->xmlToFlatten) {
return false;
}
// Copy the the file description header.
xmlRes->file = fileDesc;
outFileOp->xmlToFlatten->file = fileDesc;
XmlReferenceLinker xmlLinker;
if (!xmlLinker.consume(mContext, xmlRes.get())) {
return {};
if (!xmlLinker.consume(mContext, outFileOp->xmlToFlatten.get())) {
return false;
}
if (!proguard::collectProguardRules(xmlRes->file.source, xmlRes.get(), mKeepSet)) {
return {};
if (!proguard::collectProguardRules(outFileOp->xmlToFlatten->file.source,
outFileOp->xmlToFlatten.get(), mKeepSet)) {
return false;
}
if (!mOptions.noAutoVersion) {
if (mOptions.noVersionVectors) {
// Skip this if it is a vector or animated-vector.
xml::Element* el = xml::findRootElement(outFileOp->xmlToFlatten.get());
if (el && el->namespaceUri.empty()) {
if (el->name == u"vector" || el->name == u"animated-vector") {
// We are NOT going to version this file.
outFileOp->skipVersion = true;
return true;
}
}
}
// Find the first SDK level used that is higher than this defined config and
// not superseded by a lower or equal SDK level resource.
for (int sdkLevel : xmlLinker.getSdkLevels()) {
if (sdkLevel > xmlRes->file.config.sdkVersion) {
if (!shouldGenerateVersionedResource(entry, xmlRes->file.config, sdkLevel)) {
if (sdkLevel > outFileOp->xmlToFlatten->file.config.sdkVersion) {
if (!shouldGenerateVersionedResource(entry, outFileOp->xmlToFlatten->file.config,
sdkLevel)) {
// If we shouldn't generate a versioned resource, stop checking.
break;
}
ResourceFile versionedFileDesc = xmlRes->file;
ResourceFile versionedFileDesc = outFileOp->xmlToFlatten->file;
versionedFileDesc.config.sdkVersion = (uint16_t) sdkLevel;
if (mContext->verbose()) {
mContext->getDiagnostics()->note(DiagMessage(versionedFileDesc.source)
<< "auto-versioning resource from config '"
<< xmlRes->file.config << "' -> '"
<< outFileOp->xmlToFlatten->file.config
<< "' -> '"
<< versionedFileDesc.config << "'");
}
@ -395,13 +411,13 @@ std::unique_ptr<xml::XmlResource> ResourceFileFlattener::linkAndVersionXmlFile(
file,
mContext->getDiagnostics());
if (!added) {
return {};
return false;
}
break;
}
}
}
return xmlRes;
return true;
}
/**
@ -445,9 +461,7 @@ bool ResourceFileFlattener::flatten(ResourceTable* table, IArchiveWriter* archiv
fileDesc.config = configValue->config;
fileDesc.name = ResourceName(pkg->name, type->type, entry->name);
fileDesc.source = fileRef->getSource();
fileOp.xmlToFlatten = linkAndVersionXmlFile(entry.get(), fileDesc,
file, table);
if (!fileOp.xmlToFlatten) {
if (!linkAndVersionXmlFile(entry.get(), fileDesc, file, table, &fileOp)) {
error = true;
continue;
}
@ -477,7 +491,7 @@ bool ResourceFileFlattener::flatten(ResourceTable* table, IArchiveWriter* archiv
if (fileOp.xmlToFlatten) {
Maybe<size_t> maxSdkLevel;
if (!mOptions.noAutoVersion) {
if (!mOptions.noAutoVersion && !fileOp.skipVersion) {
maxSdkLevel = std::max<size_t>(config.sdkVersion, 1u);
}
@ -1215,6 +1229,7 @@ public:
fileFlattenerOptions.doNotCompressAnything = mOptions.doNotCompressAnything;
fileFlattenerOptions.extensionsToNotCompress = mOptions.extensionsToNotCompress;
fileFlattenerOptions.noAutoVersion = mOptions.noAutoVersion;
fileFlattenerOptions.noVersionVectors = mOptions.noVersionVectors;
ResourceFileFlattener fileFlattener(fileFlattenerOptions, mContext, &proguardKeepSet);
if (!fileFlattener.flatten(&mFinalTable, archiveWriter.get())) {
@ -1222,7 +1237,7 @@ public:
return 1;
}
if (!mOptions.staticLib && !mOptions.noAutoVersion) {
if (!mOptions.noAutoVersion) {
AutoVersioner versioner;
if (!versioner.consume(mContext, &mFinalTable)) {
mContext->getDiagnostics()->error(DiagMessage() << "failed versioning styles");
@ -1505,6 +1520,12 @@ int link(const std::vector<StringPiece>& args) {
options.tableSplitterOptions.preferredDensity = preferredDensityConfig.density;
}
// Turn off auto versioning for static-libs.
if (options.staticLib) {
options.noAutoVersion = true;
options.noVersionVectors = true;
}
LinkCommand cmd(&context, options);
return cmd.run(flags.getArgs());
}