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

Commit fbb8676b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Use binder-based iterator to retrieve FRROs" into sc-dev am: 5be998a6

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15302837

Change-Id: If9c7c5521ee2844ff8049e3bbd95461af406a9fa
parents 3b84010e 5be998a6
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -14,12 +14,13 @@
 * limitations under the License.
 */

#include "idmap2/CommandUtils.h"

#include <fstream>
#include <memory>
#include <string>
#include <vector>

#include "idmap2/CommandUtils.h"
#include "idmap2/Idmap.h"
#include "idmap2/Result.h"
#include "idmap2/SysTrace.h"
+29 −6
Original line number Diff line number Diff line
@@ -297,17 +297,40 @@ Status Idmap2Service::createFabricatedOverlay(
  return ok();
}

Status Idmap2Service::getFabricatedOverlayInfos(
Status Idmap2Service::acquireFabricatedOverlayIterator() {
  if (frro_iter_.has_value()) {
    LOG(WARNING) << "active ffro iterator was not previously released";
  }
  frro_iter_ = std::filesystem::directory_iterator(kIdmapCacheDir);
  return ok();
}

Status Idmap2Service::releaseFabricatedOverlayIterator() {
  if (!frro_iter_.has_value()) {
    LOG(WARNING) << "no active ffro iterator to release";
  }
  return ok();
}

Status Idmap2Service::nextFabricatedOverlayInfos(
    std::vector<os::FabricatedOverlayInfo>* _aidl_return) {
  for (const auto& entry : std::filesystem::directory_iterator(kIdmapCacheDir)) {
    if (!android::IsFabricatedOverlay(entry.path())) {
  constexpr size_t kMaxEntryCount = 100;
  if (!frro_iter_.has_value()) {
    return error("no active frro iterator");
  }

  size_t count = 0;
  auto& entry_iter = *frro_iter_;
  auto entry_iter_end = end(*frro_iter_);
  for (; entry_iter != entry_iter_end && count < kMaxEntryCount; ++entry_iter) {
    auto& entry = *entry_iter;
    if (!entry.is_regular_file() || !android::IsFabricatedOverlay(entry.path())) {
      continue;
    }

    const auto overlay = FabricatedOverlayContainer::FromPath(entry.path());
    if (!overlay) {
      // This is a sign something went wrong.
      LOG(ERROR) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
      LOG(WARNING) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
      continue;
    }

@@ -319,8 +342,8 @@ Status Idmap2Service::getFabricatedOverlayInfos(
    out_info.targetOverlayable = info.target_name;
    out_info.path = entry.path();
    _aidl_return->emplace_back(std::move(out_info));
    count++;
  }

  return ok();
}

+7 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <idmap2/ResourceContainer.h>
#include <idmap2/Result.h>

#include <filesystem>
#include <memory>
#include <string>
#include <vector>
@@ -59,7 +60,11 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 {
  binder::Status deleteFabricatedOverlay(const std::string& overlay_path,
                                         bool* _aidl_return) override;

  binder::Status getFabricatedOverlayInfos(
  binder::Status acquireFabricatedOverlayIterator() override;

  binder::Status releaseFabricatedOverlayIterator() override;

  binder::Status nextFabricatedOverlayInfos(
      std::vector<os::FabricatedOverlayInfo>* _aidl_return) override;

  binder::Status dumpIdmap(const std::string& overlay_path, std::string* _aidl_return) override;
@@ -69,7 +74,7 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 {
  // be able to be recalculated if idmap2 dies and restarts.
  std::unique_ptr<idmap2::TargetResourceContainer> framework_apk_cache_;

  std::vector<os::FabricatedOverlayInfo> fabricated_overlays_;
  std::optional<std::filesystem::directory_iterator> frro_iter_;

  template <typename T>
  using MaybeUniquePtr = std::variant<std::unique_ptr<T>, T*>;
+6 −1
Original line number Diff line number Diff line
@@ -37,8 +37,13 @@ interface IIdmap2 {
                                          int fulfilledPolicies,
                                          boolean enforceOverlayable,
                                          int userId);

  @nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay);
  List<FabricatedOverlayInfo> getFabricatedOverlayInfos();
  boolean deleteFabricatedOverlay(@utf8InCpp String path);

  void acquireFabricatedOverlayIterator();
  void releaseFabricatedOverlayIterator();
  List<FabricatedOverlayInfo> nextFabricatedOverlayInfos();

  @utf8InCpp String dumpIdmap(@utf8InCpp String overlayApkPath);
}
+17 −4
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.util.Slog;
import com.android.server.FgThread;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger;
@@ -161,13 +162,25 @@ class IdmapDaemon {
        }
    }

    List<FabricatedOverlayInfo> getFabricatedOverlayInfos() {
    synchronized List<FabricatedOverlayInfo> getFabricatedOverlayInfos() {
        final ArrayList<FabricatedOverlayInfo> allInfos = new ArrayList<>();
        try (Connection c = connect()) {
            return mService.getFabricatedOverlayInfos();
            mService.acquireFabricatedOverlayIterator();
            List<FabricatedOverlayInfo> infos;
            while (!(infos = mService.nextFabricatedOverlayInfos()).isEmpty()) {
                allInfos.addAll(infos);
            }
            return allInfos;
        } catch (Exception e) {
            Slog.wtf(TAG, "failed to get fabricated overlays", e);
            return null;
            Slog.wtf(TAG, "failed to get all fabricated overlays", e);
        } finally {
            try {
                mService.releaseFabricatedOverlayIterator();
            } catch (RemoteException e) {
                // ignore
            }
        }
        return allInfos;
    }

    String dumpIdmap(@NonNull String overlayPath) {