summaryrefslogtreecommitdiff
path: root/tools/aapt2/LoadedApk.cpp
diff options
context:
space:
mode:
authorRyan Mitchell <rtmitchell@google.com>2018-07-19 14:29:00 -0700
committerRyan Mitchell <rtmitchell@google.com>2018-08-14 15:56:29 -0700
commit5d2755129dae6ff6f0061da0abe634f44054b23e (patch)
tree1cb30f47af58b340f5598defc4b062139812954d /tools/aapt2/LoadedApk.cpp
parent1a8a69075e8710b3457f685de3984c7028ef2ffb (diff)
AAPT2: Reformatted dump command invocations
Use with: aapt2 dump apc [apc] aapt2 dump configurations [apk] aapt2 dump strings [apk] aapt2 dump resources [apk] aapt2 dump xmlstrings [apk] --file [file] aapt2 dump xmltree [apk] --file [file] Will add permissions and badging in a later commit. Bug: 73351292 Test: Manual tests of the commands Change-Id: I97eec01222af14053a98bd70255f1bfecd16b1c4
Diffstat (limited to 'tools/aapt2/LoadedApk.cpp')
-rw-r--r--tools/aapt2/LoadedApk.cpp47
1 files changed, 47 insertions, 0 deletions
diff --git a/tools/aapt2/LoadedApk.cpp b/tools/aapt2/LoadedApk.cpp
index b32766be8d18..b6ee1ad83ce3 100644
--- a/tools/aapt2/LoadedApk.cpp
+++ b/tools/aapt2/LoadedApk.cpp
@@ -257,6 +257,53 @@ bool LoadedApk::WriteToArchive(IAaptContext* context, ResourceTable* split_table
return true;
}
+std::unique_ptr<xml::XmlResource> LoadedApk::LoadXml(const std::string& file_path,
+ IDiagnostics* diag) {
+ io::IFile* file = apk_->FindFile(file_path);
+ if (file == nullptr) {
+ diag->Error(DiagMessage() << "failed to find file");
+ return nullptr;
+ }
+
+ std::unique_ptr<xml::XmlResource> doc;
+ if (format_ == ApkFormat::kProto) {
+ std::unique_ptr<io::InputStream> in = file->OpenInputStream();
+ if (!in) {
+ diag->Error(DiagMessage() << "failed to open file");
+ return nullptr;
+ }
+
+ io::ZeroCopyInputAdaptor adaptor(in.get());
+ pb::XmlNode pb_node;
+ if (!pb_node.ParseFromZeroCopyStream(&adaptor)) {
+ diag->Error(DiagMessage() << "failed to parse file as proto XML");
+ return nullptr;
+ }
+
+ std::string err;
+ doc = DeserializeXmlResourceFromPb(pb_node, &err);
+ if (!doc) {
+ diag->Error(DiagMessage() << "failed to deserialize proto XML: " << err);
+ return nullptr;
+ }
+ } else if (format_ == ApkFormat::kBinary) {
+ std::unique_ptr<io::IData> data = file->OpenAsData();
+ if (!data) {
+ diag->Error(DiagMessage() << "failed to open file");
+ return nullptr;
+ }
+
+ std::string err;
+ doc = xml::Inflate(data->data(), data->size(), &err);
+ if (!doc) {
+ diag->Error(DiagMessage() << "failed to parse file as binary XML: " << err);
+ return nullptr;
+ }
+ }
+
+ return doc;
+}
+
ApkFormat LoadedApk::DetermineApkFormat(io::IFileCollection* apk) {
if (apk->FindFile(kApkResourceTablePath) != nullptr) {
return ApkFormat::kBinary;