From 769de98f2dd41bfe39a1c9f76aefd1ad58942733 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 10 Apr 2015 19:43:55 -0700 Subject: AAPT2: Add library support Change-Id: I307f56d9631784ab29ee4156d94886f9b2f25b30 --- tools/aapt2/Android.mk | 6 +- tools/aapt2/BinaryResourceParser.cpp | 67 +- tools/aapt2/BinaryResourceParser.h | 7 +- tools/aapt2/BinaryXmlPullParser.cpp | 204 +++++ tools/aapt2/BinaryXmlPullParser.h | 73 ++ tools/aapt2/Flag.cpp | 2 +- tools/aapt2/Flag.h | 2 + tools/aapt2/JavaClassGenerator.cpp | 126 +-- tools/aapt2/JavaClassGenerator.h | 13 +- tools/aapt2/JavaClassGenerator_test.cpp | 35 +- tools/aapt2/Linker.cpp | 16 +- tools/aapt2/Linker_test.cpp | 17 +- tools/aapt2/Main.cpp | 851 +++++++++--------- tools/aapt2/NameMangler.h | 54 ++ tools/aapt2/NameMangler_test.cpp | 45 + tools/aapt2/Png.cpp | 18 +- tools/aapt2/Png.h | 3 +- tools/aapt2/ResChunkPullParser.h | 16 + tools/aapt2/Resolver.cpp | 36 +- tools/aapt2/Resolver.h | 2 + tools/aapt2/Resource.h | 14 +- tools/aapt2/ResourceParser.cpp | 130 ++- tools/aapt2/ResourceParser.h | 13 +- tools/aapt2/ResourceParser_test.cpp | 38 +- tools/aapt2/ResourceTable.cpp | 66 ++ tools/aapt2/ResourceTable.h | 6 + tools/aapt2/ResourceTable_test.cpp | 4 +- tools/aapt2/ResourceValues.cpp | 49 +- tools/aapt2/ResourceValues.h | 37 +- tools/aapt2/StringPool.cpp | 21 +- tools/aapt2/StringPool.h | 6 + tools/aapt2/StringPool_test.cpp | 23 +- tools/aapt2/XmlFlattener.cpp | 66 +- tools/aapt2/XmlFlattener.h | 4 +- tools/aapt2/XmlFlattener_test.cpp | 2 +- tools/aapt2/ZipEntry.cpp | 739 ++++++++++++++++ tools/aapt2/ZipEntry.h | 349 ++++++++ tools/aapt2/ZipFile.cpp | 1305 ++++++++++++++++++++++++++++ tools/aapt2/ZipFile.h | 276 ++++++ tools/aapt2/data/Makefile | 56 +- tools/aapt2/data/lib/AndroidManifest.xml | 3 + tools/aapt2/data/lib/Makefile | 81 ++ tools/aapt2/data/lib/res/values/styles.xml | 6 + tools/aapt2/data/res/values/styles.xml | 2 +- tools/aapt2/process.dot | 18 +- 45 files changed, 4178 insertions(+), 729 deletions(-) create mode 100644 tools/aapt2/BinaryXmlPullParser.cpp create mode 100644 tools/aapt2/BinaryXmlPullParser.h create mode 100644 tools/aapt2/NameMangler.h create mode 100644 tools/aapt2/NameMangler_test.cpp create mode 100644 tools/aapt2/ZipEntry.cpp create mode 100644 tools/aapt2/ZipEntry.h create mode 100644 tools/aapt2/ZipFile.cpp create mode 100644 tools/aapt2/ZipFile.h create mode 100644 tools/aapt2/data/lib/AndroidManifest.xml create mode 100644 tools/aapt2/data/lib/Makefile create mode 100644 tools/aapt2/data/lib/res/values/styles.xml (limited to 'tools/aapt2') diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk index 0622dc6..05034c3 100644 --- a/tools/aapt2/Android.mk +++ b/tools/aapt2/Android.mk @@ -27,6 +27,7 @@ main := Main.cpp sources := \ BigBuffer.cpp \ BinaryResourceParser.cpp \ + BinaryXmlPullParser.cpp \ BindingXmlPullParser.cpp \ ConfigDescription.cpp \ Files.cpp \ @@ -51,7 +52,9 @@ sources := \ ScopedXmlPullParser.cpp \ SourceXmlPullParser.cpp \ XliffXmlPullParser.cpp \ - XmlFlattener.cpp + XmlFlattener.cpp \ + ZipEntry.cpp \ + ZipFile.cpp testSources := \ BigBuffer_test.cpp \ @@ -63,6 +66,7 @@ testSources := \ Locale_test.cpp \ ManifestParser_test.cpp \ Maybe_test.cpp \ + NameMangler_test.cpp \ ResourceParser_test.cpp \ Resource_test.cpp \ ResourceTable_test.cpp \ diff --git a/tools/aapt2/BinaryResourceParser.cpp b/tools/aapt2/BinaryResourceParser.cpp index 3eb96bc..71016c1 100644 --- a/tools/aapt2/BinaryResourceParser.cpp +++ b/tools/aapt2/BinaryResourceParser.cpp @@ -17,6 +17,7 @@ #include "BinaryResourceParser.h" #include "Logger.h" #include "ResChunkPullParser.h" +#include "Resolver.h" #include "ResourceParser.h" #include "ResourceTable.h" #include "ResourceTypeExtensions.h" @@ -33,28 +34,14 @@ namespace aapt { using namespace android; -template -inline static const T* convertTo(const ResChunk_header* chunk) { - if (chunk->headerSize < sizeof(T)) { - return nullptr; - } - return reinterpret_cast(chunk); -} - -inline static const uint8_t* getChunkData(const ResChunk_header& chunk) { - return reinterpret_cast(&chunk) + chunk.headerSize; -} - -inline static size_t getChunkDataLen(const ResChunk_header& chunk) { - return chunk.size - chunk.headerSize; -} - /* * Visitor that converts a reference's resource ID to a resource name, * given a mapping from resource ID to resource name. */ struct ReferenceIdToNameVisitor : ValueVisitor { - ReferenceIdToNameVisitor(const std::map& cache) : mCache(cache) { + ReferenceIdToNameVisitor(const std::shared_ptr& resolver, + std::map* cache) : + mResolver(resolver), mCache(cache) { } void visit(Reference& reference, ValueVisitorArgs&) override { @@ -104,24 +91,39 @@ private: return; } - auto cacheIter = mCache.find(reference.id); - if (cacheIter == std::end(mCache)) { - Logger::note() << "failed to find " << reference.id << std::endl; - } else { + auto cacheIter = mCache->find(reference.id); + if (cacheIter != mCache->end()) { reference.name = cacheIter->second; reference.id = 0; + } else { + const android::ResTable& table = mResolver->getResTable(); + android::ResTable::resource_name resourceName; + if (table.getResourceName(reference.id.id, false, &resourceName)) { + const ResourceType* type = parseResourceType(StringPiece16(resourceName.type, + resourceName.typeLen)); + assert(type); + reference.name.package.assign(resourceName.package, resourceName.packageLen); + reference.name.type = *type; + reference.name.entry.assign(resourceName.name, resourceName.nameLen); + reference.id = 0; + + // Add to cache. + mCache->insert({reference.id, reference.name}); + } } } - const std::map& mCache; + std::shared_ptr mResolver; + std::map* mCache; }; -BinaryResourceParser::BinaryResourceParser(std::shared_ptr table, +BinaryResourceParser::BinaryResourceParser(const std::shared_ptr& table, + const std::shared_ptr& resolver, const Source& source, const void* data, size_t len) : - mTable(table), mSource(source), mData(data), mDataLen(len) { + mTable(table), mResolver(resolver), mSource(source), mData(data), mDataLen(len) { } bool BinaryResourceParser::parse() { @@ -421,7 +423,7 @@ bool BinaryResourceParser::parsePackage(const ResChunk_header* chunk) { // Now go through the table and change resource ID references to // symbolic references. - ReferenceIdToNameVisitor visitor(mIdIndex); + ReferenceIdToNameVisitor visitor(mResolver, &mIdIndex); for (auto& type : *mTable) { for (auto& entry : type->entries) { for (auto& configValue : entry->values) { @@ -676,7 +678,8 @@ std::unique_ptr BinaryResourceParser::parseMapEntry(const ResourceNameRef std::unique_ptr + diff --git a/tools/aapt2/data/res/values/styles.xml b/tools/aapt2/data/res/values/styles.xml index 71ce388..c5dd276 100644 --- a/tools/aapt2/data/res/values/styles.xml +++ b/tools/aapt2/data/res/values/styles.xml @@ -1,6 +1,6 @@ -