Loading tools/aapt2/Android.bp +7 −6 Original line number Diff line number Diff line Loading @@ -15,11 +15,12 @@ // toolSources = [ "compile/Compile.cpp", "diff/Diff.cpp", "dump/Dump.cpp", "link/Link.cpp", "optimize/Optimize.cpp", "cmd/Compile.cpp", "cmd/Diff.cpp", "cmd/Dump.cpp", "cmd/Link.cpp", "cmd/Optimize.cpp", "cmd/Util.cpp", ] cc_defaults { Loading Loading @@ -90,7 +91,7 @@ cc_library_host_static { "io/BigBufferStreams.cpp", "io/File.cpp", "io/FileSystem.cpp", "io/Io.cpp", "io/Util.cpp", "io/ZipArchive.cpp", "link/AutoVersioner.cpp", "link/ManifestFixer.cpp", Loading tools/aapt2/AppInfo.h +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ struct AppInfo { std::string package; // The app's minimum SDK version, if it is defined. Maybe<std::string> min_sdk_version; Maybe<int> min_sdk_version; // The app's version code, if it is defined. Maybe<uint32_t> version_code; Loading tools/aapt2/LoadedApk.cpp +9 −13 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "flatten/Archive.h" #include "flatten/TableFlattener.h" #include "io/BigBufferInputStream.h" #include "io/Util.h" namespace aapt { Loading @@ -47,11 +48,10 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadApkFromPath(IAaptContext* context, } std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>(); BinaryResourceParser parser(context, table.get(), source, data->data(), data->size()); BinaryResourceParser parser(context, table.get(), source, data->data(), data->size(), apk.get()); if (!parser.Parse()) { return {}; } return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table)); } Loading Loading @@ -100,22 +100,18 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOption } io::BigBufferInputStream input_stream(&buffer); if (!writer->WriteFile(path, ArchiveEntry::kAlign, &input_stream)) { context->GetDiagnostics()->Error(DiagMessage() << "Error when writing file '" << path << "' in APK."); if (!io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kAlign, writer)) { return false; } continue; } std::unique_ptr<io::IData> data = file->OpenAsData(); } else { uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u; if (!writer->WriteFile(path, compression_flags, data.get())) { context->GetDiagnostics()->Error(DiagMessage() << "Error when writing file '" << path << "' in APK."); if (!io::CopyFileToArchive(context, file, path, compression_flags, writer)) { return false; } } } return true; } Loading tools/aapt2/Main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ namespace aapt { static const char* sMajorVersion = "2"; // Update minor version whenever a feature or flag is added. static const char* sMinorVersion = "12"; static const char* sMinorVersion = "13"; int PrintVersion() { std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "." Loading tools/aapt2/ResourceUtils.cpp +60 −0 Original line number Diff line number Diff line Loading @@ -675,5 +675,65 @@ std::string BuildResourceFileName(const ResourceFile& res_file, return out.str(); } std::unique_ptr<Item> ParseBinaryResValue(const ResourceType& type, const ConfigDescription& config, const android::ResStringPool& src_pool, const android::Res_value& res_value, StringPool* dst_pool) { if (type == ResourceType::kId) { return util::make_unique<Id>(); } const uint32_t data = util::DeviceToHost32(res_value.data); switch (res_value.dataType) { case android::Res_value::TYPE_STRING: { const std::string str = util::GetString(src_pool, data); const android::ResStringPool_span* spans = src_pool.styleAt(data); // Check if the string has a valid style associated with it. if (spans != nullptr && spans->name.index != android::ResStringPool_span::END) { StyleString style_str = {str}; while (spans->name.index != android::ResStringPool_span::END) { style_str.spans.push_back(Span{util::GetString(src_pool, spans->name.index), spans->firstChar, spans->lastChar}); spans++; } return util::make_unique<StyledString>(dst_pool->MakeRef( style_str, StringPool::Context(StringPool::Context::kStylePriority, config))); } else { if (type != ResourceType::kString && util::StartsWith(str, "res/")) { // This must be a FileReference. return util::make_unique<FileReference>(dst_pool->MakeRef( str, StringPool::Context(StringPool::Context::kHighPriority, config))); } // There are no styles associated with this string, so treat it as a simple string. return util::make_unique<String>(dst_pool->MakeRef(str, StringPool::Context(config))); } } break; case android::Res_value::TYPE_REFERENCE: case android::Res_value::TYPE_ATTRIBUTE: case android::Res_value::TYPE_DYNAMIC_REFERENCE: case android::Res_value::TYPE_DYNAMIC_ATTRIBUTE: { Reference::Type ref_type = Reference::Type::kResource; if (res_value.dataType == android::Res_value::TYPE_ATTRIBUTE || res_value.dataType == android::Res_value::TYPE_DYNAMIC_ATTRIBUTE) { ref_type = Reference::Type::kAttribute; } if (data == 0) { // A reference of 0, must be the magic @null reference. return util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_REFERENCE, 0u); } // This is a normal reference. return util::make_unique<Reference>(data, ref_type); } break; } // Treat this as a raw binary primitive. return util::make_unique<BinaryPrimitive>(res_value); } } // namespace ResourceUtils } // namespace aapt Loading
tools/aapt2/Android.bp +7 −6 Original line number Diff line number Diff line Loading @@ -15,11 +15,12 @@ // toolSources = [ "compile/Compile.cpp", "diff/Diff.cpp", "dump/Dump.cpp", "link/Link.cpp", "optimize/Optimize.cpp", "cmd/Compile.cpp", "cmd/Diff.cpp", "cmd/Dump.cpp", "cmd/Link.cpp", "cmd/Optimize.cpp", "cmd/Util.cpp", ] cc_defaults { Loading Loading @@ -90,7 +91,7 @@ cc_library_host_static { "io/BigBufferStreams.cpp", "io/File.cpp", "io/FileSystem.cpp", "io/Io.cpp", "io/Util.cpp", "io/ZipArchive.cpp", "link/AutoVersioner.cpp", "link/ManifestFixer.cpp", Loading
tools/aapt2/AppInfo.h +1 −1 Original line number Diff line number Diff line Loading @@ -29,7 +29,7 @@ struct AppInfo { std::string package; // The app's minimum SDK version, if it is defined. Maybe<std::string> min_sdk_version; Maybe<int> min_sdk_version; // The app's version code, if it is defined. Maybe<uint32_t> version_code; Loading
tools/aapt2/LoadedApk.cpp +9 −13 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ #include "flatten/Archive.h" #include "flatten/TableFlattener.h" #include "io/BigBufferInputStream.h" #include "io/Util.h" namespace aapt { Loading @@ -47,11 +48,10 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadApkFromPath(IAaptContext* context, } std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>(); BinaryResourceParser parser(context, table.get(), source, data->data(), data->size()); BinaryResourceParser parser(context, table.get(), source, data->data(), data->size(), apk.get()); if (!parser.Parse()) { return {}; } return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table)); } Loading Loading @@ -100,22 +100,18 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOption } io::BigBufferInputStream input_stream(&buffer); if (!writer->WriteFile(path, ArchiveEntry::kAlign, &input_stream)) { context->GetDiagnostics()->Error(DiagMessage() << "Error when writing file '" << path << "' in APK."); if (!io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kAlign, writer)) { return false; } continue; } std::unique_ptr<io::IData> data = file->OpenAsData(); } else { uint32_t compression_flags = file->WasCompressed() ? ArchiveEntry::kCompress : 0u; if (!writer->WriteFile(path, compression_flags, data.get())) { context->GetDiagnostics()->Error(DiagMessage() << "Error when writing file '" << path << "' in APK."); if (!io::CopyFileToArchive(context, file, path, compression_flags, writer)) { return false; } } } return true; } Loading
tools/aapt2/Main.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,7 @@ namespace aapt { static const char* sMajorVersion = "2"; // Update minor version whenever a feature or flag is added. static const char* sMinorVersion = "12"; static const char* sMinorVersion = "13"; int PrintVersion() { std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "." Loading
tools/aapt2/ResourceUtils.cpp +60 −0 Original line number Diff line number Diff line Loading @@ -675,5 +675,65 @@ std::string BuildResourceFileName(const ResourceFile& res_file, return out.str(); } std::unique_ptr<Item> ParseBinaryResValue(const ResourceType& type, const ConfigDescription& config, const android::ResStringPool& src_pool, const android::Res_value& res_value, StringPool* dst_pool) { if (type == ResourceType::kId) { return util::make_unique<Id>(); } const uint32_t data = util::DeviceToHost32(res_value.data); switch (res_value.dataType) { case android::Res_value::TYPE_STRING: { const std::string str = util::GetString(src_pool, data); const android::ResStringPool_span* spans = src_pool.styleAt(data); // Check if the string has a valid style associated with it. if (spans != nullptr && spans->name.index != android::ResStringPool_span::END) { StyleString style_str = {str}; while (spans->name.index != android::ResStringPool_span::END) { style_str.spans.push_back(Span{util::GetString(src_pool, spans->name.index), spans->firstChar, spans->lastChar}); spans++; } return util::make_unique<StyledString>(dst_pool->MakeRef( style_str, StringPool::Context(StringPool::Context::kStylePriority, config))); } else { if (type != ResourceType::kString && util::StartsWith(str, "res/")) { // This must be a FileReference. return util::make_unique<FileReference>(dst_pool->MakeRef( str, StringPool::Context(StringPool::Context::kHighPriority, config))); } // There are no styles associated with this string, so treat it as a simple string. return util::make_unique<String>(dst_pool->MakeRef(str, StringPool::Context(config))); } } break; case android::Res_value::TYPE_REFERENCE: case android::Res_value::TYPE_ATTRIBUTE: case android::Res_value::TYPE_DYNAMIC_REFERENCE: case android::Res_value::TYPE_DYNAMIC_ATTRIBUTE: { Reference::Type ref_type = Reference::Type::kResource; if (res_value.dataType == android::Res_value::TYPE_ATTRIBUTE || res_value.dataType == android::Res_value::TYPE_DYNAMIC_ATTRIBUTE) { ref_type = Reference::Type::kAttribute; } if (data == 0) { // A reference of 0, must be the magic @null reference. return util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_REFERENCE, 0u); } // This is a normal reference. return util::make_unique<Reference>(data, ref_type); } break; } // Treat this as a raw binary primitive. return util::make_unique<BinaryPrimitive>(res_value); } } // namespace ResourceUtils } // namespace aapt