Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff759e6a authored by Pierre Lecesne's avatar Pierre Lecesne
Browse files

Moving the LoadedApk class to its own file.

Test: Unit tests pass.

Change-Id: Id706f9ad1f3406bb73a60a33139a04745d5d72c0
parent db88bfaa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -119,6 +119,7 @@ cc_library_host_static {
        "java/JavaClassGenerator.cpp",
        "java/ManifestClassGenerator.cpp",
        "java/ProguardRules.cpp",
        "LoadedApk.cpp",
        "Locale.cpp",
        "Resource.cpp",
        "ResourceParser.cpp",
+56 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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 "LoadedApk.h"

namespace aapt {

std::unique_ptr<LoadedApk> LoadedApk::LoadApkFromPath(
    IAaptContext* context, const StringPiece& path) {
  Source source(path);
  std::string error;
  std::unique_ptr<io::ZipFileCollection> apk =
      io::ZipFileCollection::Create(path, &error);
  if (!apk) {
    context->GetDiagnostics()->Error(DiagMessage(source) << error);
    return {};
  }

  io::IFile* file = apk->FindFile("resources.arsc");
  if (!file) {
    context->GetDiagnostics()->Error(DiagMessage(source)
                                     << "no resources.arsc found");
    return {};
  }

  std::unique_ptr<io::IData> data = file->OpenAsData();
  if (!data) {
    context->GetDiagnostics()->Error(DiagMessage(source)
                                     << "could not open resources.arsc");
    return {};
  }

  std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
  BinaryResourceParser parser(context, table.get(), source, data->data(),
                              data->size());
  if (!parser.Parse()) {
    return {};
  }

  return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
}

}  // namespace aapt
+58 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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.
 */

#ifndef AAPT_LOADEDAPK_H
#define AAPT_LOADEDAPK_H

#include "androidfw/StringPiece.h"

#include "io/ZipArchive.h"
#include "ResourceTable.h"
#include "unflatten/BinaryResourceParser.h"

using android::StringPiece;

namespace aapt {

/** Info about an APK loaded in memory. */
class LoadedApk {
 public:
  LoadedApk(
      const Source& source,
      std::unique_ptr<io::IFileCollection> apk,
      std::unique_ptr<ResourceTable> table)
      : source_(source), apk_(std::move(apk)), table_(std::move(table)) {}

  io::IFileCollection* GetFileCollection() { return apk_.get(); }

  ResourceTable* GetResourceTable() { return table_.get(); }

  const Source& GetSource() { return source_; }

  static std::unique_ptr<LoadedApk> LoadApkFromPath(
      IAaptContext* context, const StringPiece& path);

 private:
  Source source_;
  std::unique_ptr<io::IFileCollection> apk_;
  std::unique_ptr<ResourceTable> table_;

  DISALLOW_COPY_AND_ASSIGN(LoadedApk);
};

}  // namespace aapt

#endif /* AAPT_LOADEDAPK_H */
+3 −60
Original line number Diff line number Diff line
@@ -17,12 +17,10 @@
#include "android-base/macros.h"

#include "Flags.h"
#include "ResourceTable.h"
#include "LoadedApk.h"
#include "ValueVisitor.h"
#include "io/ZipArchive.h"
#include "process/IResourceTableConsumer.h"
#include "process/SymbolTable.h"
#include "unflatten/BinaryResourceParser.h"

using android::StringPiece;

@@ -51,61 +49,6 @@ class DiffContext : public IAaptContext {
  SymbolTable symbol_table_;
};

class LoadedApk {
 public:
  LoadedApk(const Source& source, std::unique_ptr<io::IFileCollection> apk,
            std::unique_ptr<ResourceTable> table)
      : source_(source), apk_(std::move(apk)), table_(std::move(table)) {}

  io::IFileCollection* GetFileCollection() { return apk_.get(); }

  ResourceTable* GetResourceTable() { return table_.get(); }

  const Source& GetSource() { return source_; }

 private:
  Source source_;
  std::unique_ptr<io::IFileCollection> apk_;
  std::unique_ptr<ResourceTable> table_;

  DISALLOW_COPY_AND_ASSIGN(LoadedApk);
};

static std::unique_ptr<LoadedApk> LoadApkFromPath(IAaptContext* context,
                                                  const StringPiece& path) {
  Source source(path);
  std::string error;
  std::unique_ptr<io::ZipFileCollection> apk =
      io::ZipFileCollection::Create(path, &error);
  if (!apk) {
    context->GetDiagnostics()->Error(DiagMessage(source) << error);
    return {};
  }

  io::IFile* file = apk->FindFile("resources.arsc");
  if (!file) {
    context->GetDiagnostics()->Error(DiagMessage(source)
                                     << "no resources.arsc found");
    return {};
  }

  std::unique_ptr<io::IData> data = file->OpenAsData();
  if (!data) {
    context->GetDiagnostics()->Error(DiagMessage(source)
                                     << "could not open resources.arsc");
    return {};
  }

  std::unique_ptr<ResourceTable> table = util::make_unique<ResourceTable>();
  BinaryResourceParser parser(context, table.get(), source, data->data(),
                              data->size());
  if (!parser.Parse()) {
    return {};
  }

  return util::make_unique<LoadedApk>(source, std::move(apk), std::move(table));
}

static void EmitDiffLine(const Source& source, const StringPiece& message) {
  std::cerr << source << ": " << message << "\n";
}
@@ -413,9 +356,9 @@ int Diff(const std::vector<StringPiece>& args) {
  }

  std::unique_ptr<LoadedApk> apk_a =
      LoadApkFromPath(&context, flags.GetArgs()[0]);
      LoadedApk::LoadApkFromPath(&context, flags.GetArgs()[0]);
  std::unique_ptr<LoadedApk> apk_b =
      LoadApkFromPath(&context, flags.GetArgs()[1]);
      LoadedApk::LoadApkFromPath(&context, flags.GetArgs()[1]);
  if (!apk_a || !apk_b) {
    return 1;
  }