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

Commit 9f1be623 authored by d34d's avatar d34d Committed by Steve Kondik
Browse files

Themes: Restructure resource cache [1/2]

The new structure is as follows:
/data/resource-cache/
        ├─ theme1_pkg_name
        |     ├─ target1_pkg_name
        |     |     ├─ idmap
        |     |     └─ resources.apk
        |     ├─ target2_pkg_name
        |     ·
        |     ·
        |     ·
        |     ├─ targetN_pkg_name
        |     └─ icons
        |           ├─ hash
        |           └─ resources.apk
        ├─ theme2_pkg_name
        ·
        ·
        ·
        └─ themeN_pkg_name

Change-Id: Id39688c88929733b42368c1f20ef0e25848a3390
parent f1aaf272
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -157,7 +157,8 @@ fail:
    }

    int create_idmap(const char *target_apk_path, const char *overlay_apk_path,
            uint32_t target_hash, uint32_t overlay_hash, uint32_t **data, size_t *size)
            const char *cache_path, uint32_t target_hash, uint32_t overlay_hash, uint32_t **data,
            size_t *size)
    {
        uint32_t target_crc, overlay_crc;

@@ -168,13 +169,14 @@ fail:
        overlay_crc = 0;

        AssetManager am;
        bool b = am.createIdmap(target_apk_path, overlay_apk_path, target_crc, overlay_crc,
                target_hash, overlay_hash, data, size);
        bool b = am.createIdmap(target_apk_path, overlay_apk_path, cache_path, target_crc,
                overlay_crc, target_hash, overlay_hash, data, size);
        return b ? 0 : -1;
    }

    int create_and_write_idmap(const char *target_apk_path, const char *overlay_apk_path,
            uint32_t target_hash, uint32_t overlay_hash, int fd, bool check_if_stale)
            const char *cache_path, uint32_t target_hash, uint32_t overlay_hash, int fd,
            bool check_if_stale)
    {
        if (check_if_stale) {
            if (!is_idmap_stale_fd(target_apk_path, overlay_apk_path, fd)) {
@@ -186,7 +188,7 @@ fail:
        uint32_t *data = NULL;
        size_t size;

        if (create_idmap(target_apk_path, overlay_apk_path, target_hash, overlay_hash,
        if (create_idmap(target_apk_path, overlay_apk_path, cache_path, target_hash, overlay_hash,
                &data, &size) == -1) {
            return -1;
        }
@@ -202,7 +204,7 @@ fail:
}

int idmap_create_path(const char *target_apk_path, const char *overlay_apk_path,
        uint32_t target_hash, uint32_t overlay_hash,
        const char *cache_path, uint32_t target_hash, uint32_t overlay_hash,
        const char *idmap_path)
{
    if (!is_idmap_stale_path(target_apk_path, overlay_apk_path, idmap_path)) {
@@ -215,8 +217,8 @@ int idmap_create_path(const char *target_apk_path, const char *overlay_apk_path,
        return EXIT_FAILURE;
    }

    int r = create_and_write_idmap(target_apk_path, overlay_apk_path, target_hash, overlay_hash,
            fd, false);
    int r = create_and_write_idmap(target_apk_path, overlay_apk_path, cache_path,
                    target_hash, overlay_hash, fd, false);
    close(fd);
    if (r != 0) {
        unlink(idmap_path);
@@ -225,10 +227,9 @@ int idmap_create_path(const char *target_apk_path, const char *overlay_apk_path,
}

int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path,
        uint32_t target_hash, uint32_t overlay_hash,
        int fd)
        const char *cache_path, uint32_t target_hash, uint32_t overlay_hash, int fd)
{
    return create_and_write_idmap(target_apk_path, overlay_apk_path, target_hash, overlay_hash,
            fd, true) == 0 ?
    return create_and_write_idmap(target_apk_path, overlay_apk_path, cache_path, target_hash,
                overlay_hash, fd, true) == 0 ?
        EXIT_SUCCESS : EXIT_FAILURE;
}
+12 −10
Original line number Diff line number Diff line
@@ -122,7 +122,8 @@ NOTES \n\
    }

    int maybe_create_fd(const char *target_apk_path, const char *overlay_apk_path,
            const char *idmap_str, const char *target_hash_str, const char *overlay_hash_str)
            const char *cache_path, const char *idmap_str, const char *target_hash_str,
            const char *overlay_hash_str)
    {
        // anyone (not just root or system) may do --fd -- the file has
        // already been opened by someone else on our behalf
@@ -146,12 +147,13 @@ NOTES \n\
        int target_hash = strtol(target_hash_str, 0, 10);
        int overlay_hash = strtol(overlay_hash_str, 0, 10);

        return idmap_create_fd(target_apk_path, overlay_apk_path, target_hash, overlay_hash,
                idmap_fd);
        return idmap_create_fd(target_apk_path, overlay_apk_path, cache_path, target_hash,
                overlay_hash, idmap_fd);
    }

    int maybe_create_path(const char *target_apk_path, const char *overlay_apk_path,
            const char *idmap_path, const char *target_hash_str, const char *overlay_hash_str)
            const char *cache_path, const char *idmap_path, const char *target_hash_str,
            const char *overlay_hash_str)
    {
        if (!verify_root_or_system()) {
            fprintf(stderr, "error: permission denied: not user root or user system\n");
@@ -170,8 +172,8 @@ NOTES \n\

        int target_hash = strtol(target_hash_str, 0, 10);
        int overlay_hash = strtol(overlay_hash_str, 0, 10);
        return idmap_create_path(target_apk_path, overlay_apk_path, target_hash, overlay_hash,
                idmap_path);
        return idmap_create_path(target_apk_path, overlay_apk_path, cache_path, target_hash,
                overlay_hash, idmap_path);
    }

    int maybe_scan(const char *overlay_dir, const char *target_package_name,
@@ -230,12 +232,12 @@ int main(int argc, char **argv)
        return 0;
    }

    if (argc == 7 && !strcmp(argv[1], "--fd")) {
        return maybe_create_fd(argv[2], argv[3], argv[4], argv[5], argv[6]);
    if (argc == 8 && !strcmp(argv[1], "--fd")) {
        return maybe_create_fd(argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
    }

    if (argc == 7 && !strcmp(argv[1], "--path")) {
        return maybe_create_path(argv[2], argv[3], argv[4], argv[5], argv[6]);
    if (argc == 8 && !strcmp(argv[1], "--path")) {
        return maybe_create_path(argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]);
    }

    if (argc == 6 && !strcmp(argv[1], "--scan")) {
+2 −2
Original line number Diff line number Diff line
@@ -19,11 +19,11 @@
#endif

int idmap_create_path(const char *target_apk_path, const char *overlay_apk_path,
        uint32_t target_hash, uint32_t overlay_hash,
        const char *cache_path, uint32_t target_hash, uint32_t overlay_hash,
        const char *idmap_path);

int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path,
        uint32_t target_hash, uint32_t overlay_hash,
        const char *cache_path, uint32_t target_hash, uint32_t overlay_hash,
        int fd);

// Regarding target_package_name: the idmap_scan implementation should
+1 −1
Original line number Diff line number Diff line
@@ -227,7 +227,7 @@ namespace {
                idmap_path.appendPath(flatten_path(overlay_apk_path + 1));
                idmap_path.append("@idmap");

                if (idmap_create_path(target_apk_path, overlay_apk_path, 0, 0,
                if (idmap_create_path(target_apk_path, overlay_apk_path, NULL, 0, 0,
                        idmap_path.string()) != 0) {
                    ALOGE("error: failed to create idmap for target=%s overlay=%s idmap=%s\n",
                            target_apk_path, overlay_apk_path, idmap_path.string());
+9 −6
Original line number Diff line number Diff line
@@ -218,7 +218,7 @@ public class ResourcesManager {

        if (overlayDirs != null) {
            for (String idmapPath : overlayDirs) {
                assets.addOverlayPath(idmapPath, null, null, null);
                assets.addOverlayPath(idmapPath, null, null, null, null);
            }
        }

@@ -565,9 +565,10 @@ public class ResourcesManager {
            String targetPackagePath = piTarget.applicationInfo.sourceDir;
            String prefixPath = ThemeUtils.getOverlayPathToTarget(basePackageName);

            String resCachePath = ThemeUtils.getResDir(basePackageName, piTheme);
            String resCachePath = ThemeUtils.getTargetCacheDir(piTarget.packageName, piTheme);
            String resApkPath = resCachePath + "/resources.apk";
            int cookie = assets.addOverlayPath(themePath, resApkPath,
            String idmapPath = ThemeUtils.getIdmapPath(piTarget.packageName, piTheme.packageName);
            int cookie = assets.addOverlayPath(idmapPath, themePath, resApkPath,
                    targetPackagePath, prefixPath);

            if (cookie != 0) {
@@ -577,11 +578,12 @@ public class ResourcesManager {
        }

        if (!piTarget.isThemeApk && piTheme.mOverlayTargets.contains("android")) {
            String resCachePath= ThemeUtils.getResDir(piAndroid.packageName, piTheme);
            String resCachePath= ThemeUtils.getTargetCacheDir(piAndroid.packageName, piTheme);
            String prefixPath = ThemeUtils.getOverlayPathToTarget(piAndroid.packageName);
            String targetPackagePath = piAndroid.applicationInfo.publicSourceDir;
            String resApkPath = resCachePath + "/resources.apk";
            int cookie = assets.addOverlayPath(themePath,
            String idmapPath = ThemeUtils.getIdmapPath("android", piTheme.packageName);
            int cookie = assets.addOverlayPath(idmapPath, themePath,
                    resApkPath, targetPackagePath, prefixPath);
            if (cookie != 0) {
                assets.setThemePackageName(themePackageName);
@@ -678,7 +680,8 @@ public class ResourcesManager {
        if (themePackageName != null && !themePackageName.isEmpty()) {
            String themePath =  piTheme.applicationInfo.publicSourceDir;
            String prefixPath = ThemeUtils.COMMON_RES_PATH;
            String resCachePath = ThemeUtils.getResDir(ThemeUtils.COMMON_RES_TARGET, piTheme);
            String resCachePath =
                    ThemeUtils.getTargetCacheDir(ThemeUtils.COMMON_RES_TARGET, piTheme);
            String resApkPath = resCachePath + "/resources.apk";
            int cookie = assets.addCommonOverlayPath(themePath, resApkPath,
                    prefixPath);
Loading