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

Commit 1d091465 authored by Jaekyun Seok's avatar Jaekyun Seok
Browse files

Newly create idmap only when it is outdated

For now, OverlayManagerService calls Installd.idmap() whenever a user
is changed, and then a idmap is re-generated even though there are no
changes on its target apk and overlay apk.
This CL is to avoid such unnecessary re-generation of idmap. Instead
only a group id will be updated when the idmap isn't outdated.

Test: building succeeded and tested on sailfish.
Bug: 37179531
Change-Id: Id726cbbc621bd64f2a329798b2ab5436f0c28d70
parent c211793a
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -1961,6 +1961,8 @@ binder::Status InstalldNativeService::idmap(const std::string& targetApkPath,

    int idmap_fd = -1;
    char idmap_path[PATH_MAX];
    struct stat target_apk_stat, overlay_apk_stat, idmap_stat;
    bool outdated = false;

    if (flatten_path(IDMAP_PREFIX, IDMAP_SUFFIX, overlay_apk,
                idmap_path, sizeof(idmap_path)) == -1) {
@@ -1968,8 +1970,22 @@ binder::Status InstalldNativeService::idmap(const std::string& targetApkPath,
        goto fail;
    }

    if (stat(idmap_path, &idmap_stat) < 0 ||
            stat(target_apk, &target_apk_stat) < 0 ||
            stat(overlay_apk, &overlay_apk_stat) < 0) {
        outdated = true;
    } else if (idmap_stat.st_mtime < target_apk_stat.st_mtime ||
            idmap_stat.st_mtime < overlay_apk_stat.st_mtime) {
        outdated = true;
    }

    if (outdated) {
        unlink(idmap_path);
        idmap_fd = open(idmap_path, O_RDWR | O_CREAT | O_EXCL, 0644);
    } else {
        idmap_fd = open(idmap_path, O_RDWR);
    }

    if (idmap_fd < 0) {
        ALOGE("idmap cannot open '%s' for output: %s\n", idmap_path, strerror(errno));
        goto fail;
@@ -1983,6 +1999,11 @@ binder::Status InstalldNativeService::idmap(const std::string& targetApkPath,
        goto fail;
    }

    if (!outdated) {
        close(idmap_fd);
        return ok();
    }

    pid_t pid;
    pid = fork();
    if (pid == 0) {