summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCory Smith <corysmith@google.com>2018-03-18 23:29:45 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-03-18 23:29:45 +0000
commit34b10c529a1b90ef2a4e56f3ebf611c6aa41582f (patch)
tree8b0da7c1cd9b2484a83250b3081586453e589a48
parentd1457eea49a423d21fe398d921c216d039fd4ec4 (diff)
parent6a43bd634edce1e56c9f2193fd0fe3910eb1f03a (diff)
Merge "Writes the resource table proto out when writing a LoadedApk." into pi-dev am: 449be81065
am: 6a43bd634e Change-Id: I3e84028a1e74b28d2804d66971cf4610874ae349
-rw-r--r--tools/aapt2/LoadedApk.cpp26
-rw-r--r--tools/aapt2/LoadedApk.h7
-rw-r--r--tools/aapt2/optimize/MultiApkGenerator_test.cpp6
3 files changed, 27 insertions, 12 deletions
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index ac28227b8778..4a4260d1d323 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -22,6 +22,7 @@
#include "format/binary/TableFlattener.h"
#include "format/binary/XmlFlattener.h"
#include "format/proto/ProtoDeserialize.h"
+#include "format/proto/ProtoSerialize.h"
#include "io/BigBufferStream.h"
#include "io/Util.h"
#include "xml/XmlDom.h"
@@ -110,7 +111,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadProtoApkFromFileCollection(
return {};
}
return util::make_unique<LoadedApk>(source, std::move(collection), std::move(table),
- std::move(manifest));
+ std::move(manifest), ApkFormat::kProto);
}
std::unique_ptr<LoadedApk> LoadedApk::LoadBinaryApkFromFileCollection(
@@ -153,7 +154,7 @@ std::unique_ptr<LoadedApk> LoadedApk::LoadBinaryApkFromFileCollection(
return {};
}
return util::make_unique<LoadedApk>(source, std::move(collection), std::move(table),
- std::move(manifest));
+ std::move(manifest), ApkFormat::kBinary);
}
bool LoadedApk::WriteToArchive(IAaptContext* context, const TableFlattenerOptions& options,
@@ -205,7 +206,7 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
}
// The resource table needs to be re-serialized since it might have changed.
- if (path == "resources.arsc") {
+ if (format_ == ApkFormat::kBinary && path == kApkResourceTablePath) {
BigBuffer buffer(4096);
// TODO(adamlesinski): How to determine if there were sparse entries (and if to encode
// with sparse entries) b/35389232.
@@ -215,11 +216,22 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
}
io::BigBufferInputStream input_stream(&buffer);
- if (!io::CopyInputStreamToArchive(context, &input_stream, path, ArchiveEntry::kAlign,
+ if (!io::CopyInputStreamToArchive(context,
+ &input_stream,
+ path,
+ ArchiveEntry::kAlign,
writer)) {
return false;
}
-
+ } else if (format_ == ApkFormat::kProto && path == kProtoResourceTablePath) {
+ pb::ResourceTable pb_table;
+ SerializeTableToPb(*split_table, &pb_table);
+ if (!io::CopyProtoToArchive(context,
+ &pb_table,
+ path,
+ ArchiveEntry::kAlign, writer)) {
+ return false;
+ }
} else if (manifest != nullptr && path == "AndroidManifest.xml") {
BigBuffer buffer(8192);
XmlFlattenerOptions xml_flattener_options;
@@ -246,9 +258,9 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
}
ApkFormat LoadedApk::DetermineApkFormat(io::IFileCollection* apk) {
- if (apk->FindFile("resources.arsc") != nullptr) {
+ if (apk->FindFile(kApkResourceTablePath) != nullptr) {
return ApkFormat::kBinary;
- } else if (apk->FindFile("resources.pb") != nullptr) {
+ } else if (apk->FindFile(kProtoResourceTablePath) != nullptr) {
return ApkFormat::kProto;
} else {
// If the resource table is not present, attempt to read the manifest.
diff --git a/tools/aapt2/LoadedApk.h b/tools/aapt2/LoadedApk.h
index 81bcecc3ca5d..41f879d0cdc3 100644
--- a/tools/aapt2/LoadedApk.h
+++ b/tools/aapt2/LoadedApk.h
@@ -57,11 +57,13 @@ class LoadedApk {
const Source& source, std::unique_ptr<io::IFileCollection> collection, IDiagnostics* diag);
LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
- std::unique_ptr<ResourceTable> table, std::unique_ptr<xml::XmlResource> manifest)
+ std::unique_ptr<ResourceTable> table, std::unique_ptr<xml::XmlResource> manifest,
+ const ApkFormat& format)
: source_(source),
apk_(std::move(apk)),
table_(std::move(table)),
- manifest_(std::move(manifest)) {
+ manifest_(std::move(manifest)),
+ format_(format) {
}
io::IFileCollection* GetFileCollection() {
@@ -112,6 +114,7 @@ class LoadedApk {
std::unique_ptr<io::IFileCollection> apk_;
std::unique_ptr<ResourceTable> table_;
std::unique_ptr<xml::XmlResource> manifest_;
+ ApkFormat format_;
static ApkFormat DetermineApkFormat(io::IFileCollection* apk);
};
diff --git a/tools/aapt2/optimize/MultiApkGenerator_test.cpp b/tools/aapt2/optimize/MultiApkGenerator_test.cpp
index e1d951fc9776..80eb737fa682 100644
--- a/tools/aapt2/optimize/MultiApkGenerator_test.cpp
+++ b/tools/aapt2/optimize/MultiApkGenerator_test.cpp
@@ -104,7 +104,7 @@ class MultiApkGeneratorTest : public ::testing::Test {
TEST_F(MultiApkGeneratorTest, VersionFilterNewerVersion) {
std::unique_ptr<ResourceTable> table = BuildTable();
- LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
+ LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(19).Build();
FilterChain chain;
@@ -131,7 +131,7 @@ TEST_F(MultiApkGeneratorTest, VersionFilterNewerVersion) {
TEST_F(MultiApkGeneratorTest, VersionFilterOlderVersion) {
std::unique_ptr<ResourceTable> table = BuildTable();
- LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
+ LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(1).Build();
FilterChain chain;
@@ -156,7 +156,7 @@ TEST_F(MultiApkGeneratorTest, VersionFilterOlderVersion) {
TEST_F(MultiApkGeneratorTest, VersionFilterNoVersion) {
std::unique_ptr<ResourceTable> table = BuildTable();
- LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}};
+ LoadedApk apk = {{"test.apk"}, {}, std::move(table), {}, kBinary};
std::unique_ptr<IAaptContext> ctx = test::ContextBuilder().SetMinSdkVersion(1).Build();
FilterChain chain;