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

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

Change-Id: Ib48f26516e1aca7b23a48d6521ad3dc097d8a095
This commit is contained in:
TreeHugger Robot
2021-07-19 22:09:12 +00:00
committed by Automerger Merge Worker
5 changed files with 61 additions and 14 deletions

View File

@@ -14,12 +14,13 @@
* limitations under the License. * limitations under the License.
*/ */
#include "idmap2/CommandUtils.h"
#include <fstream> #include <fstream>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
#include "idmap2/CommandUtils.h"
#include "idmap2/Idmap.h" #include "idmap2/Idmap.h"
#include "idmap2/Result.h" #include "idmap2/Result.h"
#include "idmap2/SysTrace.h" #include "idmap2/SysTrace.h"

View File

@@ -297,17 +297,40 @@ Status Idmap2Service::createFabricatedOverlay(
return ok(); 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) { std::vector<os::FabricatedOverlayInfo>* _aidl_return) {
for (const auto& entry : std::filesystem::directory_iterator(kIdmapCacheDir)) { constexpr size_t kMaxEntryCount = 100;
if (!android::IsFabricatedOverlay(entry.path())) { 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; continue;
} }
const auto overlay = FabricatedOverlayContainer::FromPath(entry.path()); const auto overlay = FabricatedOverlayContainer::FromPath(entry.path());
if (!overlay) { if (!overlay) {
// This is a sign something went wrong. LOG(WARNING) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
LOG(ERROR) << "Failed to open '" << entry.path() << "': " << overlay.GetErrorMessage();
continue; continue;
} }
@@ -319,8 +342,8 @@ Status Idmap2Service::getFabricatedOverlayInfos(
out_info.targetOverlayable = info.target_name; out_info.targetOverlayable = info.target_name;
out_info.path = entry.path(); out_info.path = entry.path();
_aidl_return->emplace_back(std::move(out_info)); _aidl_return->emplace_back(std::move(out_info));
count++;
} }
return ok(); return ok();
} }

View File

@@ -24,6 +24,7 @@
#include <idmap2/ResourceContainer.h> #include <idmap2/ResourceContainer.h>
#include <idmap2/Result.h> #include <idmap2/Result.h>
#include <filesystem>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
@@ -59,7 +60,11 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 {
binder::Status deleteFabricatedOverlay(const std::string& overlay_path, binder::Status deleteFabricatedOverlay(const std::string& overlay_path,
bool* _aidl_return) override; 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; std::vector<os::FabricatedOverlayInfo>* _aidl_return) override;
binder::Status dumpIdmap(const std::string& overlay_path, std::string* _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. // be able to be recalculated if idmap2 dies and restarts.
std::unique_ptr<idmap2::TargetResourceContainer> framework_apk_cache_; 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> template <typename T>
using MaybeUniquePtr = std::variant<std::unique_ptr<T>, T*>; using MaybeUniquePtr = std::variant<std::unique_ptr<T>, T*>;

View File

@@ -37,8 +37,13 @@ interface IIdmap2 {
int fulfilledPolicies, int fulfilledPolicies,
boolean enforceOverlayable, boolean enforceOverlayable,
int userId); int userId);
@nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay); @nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay);
List<FabricatedOverlayInfo> getFabricatedOverlayInfos();
boolean deleteFabricatedOverlay(@utf8InCpp String path); boolean deleteFabricatedOverlay(@utf8InCpp String path);
void acquireFabricatedOverlayIterator();
void releaseFabricatedOverlayIterator();
List<FabricatedOverlayInfo> nextFabricatedOverlayInfos();
@utf8InCpp String dumpIdmap(@utf8InCpp String overlayApkPath); @utf8InCpp String dumpIdmap(@utf8InCpp String overlayApkPath);
} }

View File

@@ -36,6 +36,7 @@ import android.util.Slog;
import com.android.server.FgThread; import com.android.server.FgThread;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeoutException; import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicInteger; 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()) { try (Connection c = connect()) {
return mService.getFabricatedOverlayInfos(); mService.acquireFabricatedOverlayIterator();
} catch (Exception e) { List<FabricatedOverlayInfo> infos;
Slog.wtf(TAG, "failed to get fabricated overlays", e); while (!(infos = mService.nextFabricatedOverlayInfos()).isEmpty()) {
return null; allInfos.addAll(infos);
} }
return allInfos;
} catch (Exception e) {
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) { String dumpIdmap(@NonNull String overlayPath) {