Merge "Use apexservice to get the list of apexes" into main

This commit is contained in:
Jooyung Han 2023-08-09 06:37:02 +00:00 committed by Gerrit Code Review
commit d54caf0598
2 changed files with 32 additions and 14 deletions

View file

@ -239,7 +239,10 @@ cc_binary {
cc_binary { cc_binary {
name: "vold_prepare_subdirs", name: "vold_prepare_subdirs",
defaults: ["vold_default_flags"], defaults: [
"vold_default_flags",
"libapexservice-deps",
],
srcs: [ srcs: [
"vold_prepare_subdirs.cpp", "vold_prepare_subdirs.cpp",

View file

@ -30,7 +30,11 @@
#include <sys/types.h> #include <sys/types.h>
#include <android-base/logging.h> #include <android-base/logging.h>
#include <android-base/result.h>
#include <android-base/scopeguard.h> #include <android-base/scopeguard.h>
#include <android/apex/ApexInfo.h>
#include <android/apex/IApexService.h>
#include <binder/IServiceManager.h>
#include <cutils/fs.h> #include <cutils/fs.h>
#include <selinux/android.h> #include <selinux/android.h>
@ -141,24 +145,35 @@ static bool rmrf_contents(const std::string& path) {
} }
} }
static android::base::Result<std::vector<std::string>> get_apex_list() {
auto sm = android::defaultServiceManager();
auto binder = sm->waitForService(android::String16("apexservice"));
if (binder == nullptr) {
return android::base::Error() << "Failed to get apexservice";
}
auto service = android::interface_cast<android::apex::IApexService>(binder);
std::vector<android::apex::ApexInfo> list;
auto status = service->getActivePackages(&list);
if (!status.isOk()) {
return android::base::Error() << status.exceptionMessage().c_str();
}
std::vector<std::string> names;
names.reserve(list.size());
for (const auto& apex_info : list) {
names.push_back(apex_info.moduleName);
}
return names;
}
static bool prepare_apex_subdirs(struct selabel_handle* sehandle, const std::string& path) { static bool prepare_apex_subdirs(struct selabel_handle* sehandle, const std::string& path) {
if (!prepare_dir(sehandle, 0711, 0, 0, path + "/apexdata")) return false; if (!prepare_dir(sehandle, 0711, 0, 0, path + "/apexdata")) return false;
auto dirp = std::unique_ptr<DIR, int (*)(DIR*)>(opendir("/apex"), closedir); auto apex_list = get_apex_list();
if (!dirp) { if (!apex_list.ok()) {
PLOG(ERROR) << "Unable to open apex directory"; LOG(ERROR) << apex_list.error();
return false; return false;
} }
struct dirent* entry; for (const auto& name : *apex_list) {
while ((entry = readdir(dirp.get())) != nullptr) {
if (entry->d_type != DT_DIR) continue;
const char* name = entry->d_name;
// skip any starting with "."
if (name[0] == '.') continue;
if (strchr(name, '@') != NULL) continue;
if (!prepare_dir(sehandle, 0771, AID_ROOT, AID_SYSTEM, path + "/apexdata/" + name)) { if (!prepare_dir(sehandle, 0771, AID_ROOT, AID_SYSTEM, path + "/apexdata/" + name)) {
return false; return false;
} }