From 6f6ceb7e1456698b1f33e04536bfb3227f9fcfcb Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 14 Nov 2014 14:48:12 -0800 Subject: AAPT2 First checking of AAPT2. The individual phases of AAPT2 work, but there are some missing pieces. For early testing we are missing: - Need to properly mark file references and include them in package - Need to package into zip Final AAPT for apps we are missing: - Need to crush PNGs - Need to parse 9-patches - Need to validate all of AndroidManifest.xml - Need to write align method to align resource tables for splits. Final AAPT for apps + system we are missing: - Need to handle overlays - Need to store comments for R file - Need to handle --shared-lib (dynamic references too). New AAPT features coming: - Need to import compiled libraries - Name mangling - R file generation for library code Change-Id: I95f8a63581b81a1f424ae6fb2c373c883b72c18d --- tools/aapt2/ManifestParser.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 tools/aapt2/ManifestParser.cpp (limited to 'tools/aapt2/ManifestParser.cpp') diff --git a/tools/aapt2/ManifestParser.cpp b/tools/aapt2/ManifestParser.cpp new file mode 100644 index 000000000000..b8f0a430bcee --- /dev/null +++ b/tools/aapt2/ManifestParser.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "AppInfo.h" +#include "Logger.h" +#include "ManifestParser.h" +#include "Source.h" +#include "XmlPullParser.h" + +#include + +namespace aapt { + +bool ManifestParser::parse(const Source& source, std::shared_ptr parser, + AppInfo* outInfo) { + SourceLogger logger = { source }; + + int depth = 0; + while (XmlPullParser::isGoodEvent(parser->next())) { + XmlPullParser::Event event = parser->getEvent(); + if (event == XmlPullParser::Event::kEndElement) { + depth--; + continue; + } else if (event != XmlPullParser::Event::kStartElement) { + continue; + } + + depth++; + + const std::u16string& element = parser->getElementName(); + if (depth == 1) { + if (element == u"manifest") { + if (!parseManifest(logger, parser, outInfo)) { + return false; + } + } else { + logger.error() + << "unexpected top-level element '" + << element + << "'." + << std::endl; + return false; + } + } else { + XmlPullParser::skipCurrentElement(parser.get()); + } + } + + if (parser->getEvent() == XmlPullParser::Event::kBadDocument) { + logger.error(parser->getLineNumber()) + << "failed to parse manifest: " + << parser->getLastError() + << "." + << std::endl; + return false; + } + return true; +} + +bool ManifestParser::parseManifest(SourceLogger& logger, std::shared_ptr parser, + AppInfo* outInfo) { + auto attrIter = parser->findAttribute(u"", u"package"); + if (attrIter == parser->endAttributes() || attrIter->value.empty()) { + logger.error() << "no 'package' attribute found for element ." << std::endl; + return false; + } + outInfo->package = attrIter->value; + return true; +} + +} // namespace aapt -- cgit v1.2.3-59-g8ed1b