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

Commit e84b0b1c authored by Rishabh Singh's avatar Rishabh Singh
Browse files

Destroy/Clear SdkSandbox Data Directories

When app is uninstalled we need to delete the sdksandbox data
directories and when the Clear Data or Clear Cache is called we
need to clear the sdksandbox data directories  and the cache
directories respectively.

Bug: 211766362
Test: atest installd_service_test:DestroyAppDataTest
Test: atest installd_service_test:ClearAppDataTest
Ignore-AOSP-First: Feature is being developed in internal branch
Change-Id: Ie0c454f9b8637b2057ab95246774220509c01b4b
parent 7038a115
Loading
Loading
Loading
Loading
+74 −27
Original line number Original line Diff line number Diff line
@@ -734,7 +734,7 @@ binder::Status InstalldNativeService::createAppDataLocked(


    } else {
    } else {
        // Package does not need sdk storage. Remove it.
        // Package does not need sdk storage. Remove it.
        deleteSdkSandboxDataPackageDirectory(uuid, packageName, userId, flags);
        destroySdkSandboxDataPackageDirectory(uuid, packageName, userId, flags);
    }
    }


    return ok();
    return ok();
@@ -802,32 +802,6 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory(
    return ok();
    return ok();
}
}


/**
 * Responsible for deleting /data/misc_{ce|de}/user/0/sdksandbox/<package-name> directory
 */
binder::Status InstalldNativeService::deleteSdkSandboxDataPackageDirectory(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags) {
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    auto res = ok();

    constexpr int storageFlags[2] = {FLAG_STORAGE_CE, FLAG_STORAGE_DE};
    for (int currentFlag : storageFlags) {
        if ((flags & currentFlag) == 0) {
            continue;
        }
        bool isCeData = (currentFlag == FLAG_STORAGE_CE);

        const auto& packagePath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId,
                                                                            packageName.c_str());
        if (delete_dir_contents_and_dir(packagePath, /*ignore_if_missing=*/true) != 0) {
            res = error("Failed to delete sdk package directory: " + packagePath);
        }
    }

    return res;
}

binder::Status InstalldNativeService::createAppData(
binder::Status InstalldNativeService::createAppData(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo,
        int32_t flags, int32_t appId, int32_t previousAppId, const std::string& seInfo,
@@ -1150,6 +1124,47 @@ binder::Status InstalldNativeService::clearAppData(const std::optional<std::stri
            }
            }
        }
        }
    }
    }
    auto status = clearSdkSandboxDataPackageDirectory(uuid, packageName, userId, flags);
    if (!status.isOk()) {
        res = status;
    }
    return res;
}

binder::Status InstalldNativeService::clearSdkSandboxDataPackageDirectory(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags) {
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    binder::Status res = ok();
    constexpr int storageFlags[2] = {FLAG_STORAGE_CE, FLAG_STORAGE_DE};
    for (int i = 0; i < 2; i++) {
        int currentFlag = storageFlags[i];
        if ((flags & currentFlag) == 0) {
            continue;
        }
        bool isCeData = (currentFlag == FLAG_STORAGE_CE);
        std::string suffix;
        if (flags & FLAG_CLEAR_CACHE_ONLY) {
            suffix = CACHE_DIR_POSTFIX;
        } else if (flags & FLAG_CLEAR_CODE_CACHE_ONLY) {
            suffix = CODE_CACHE_DIR_POSTFIX;
        }

        auto appPath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId, pkgname);
        if (access(appPath.c_str(), F_OK) != 0) continue;
        const auto subDirHandler = [&appPath, &res, &suffix](const std::string& filename) {
            auto filepath = appPath + "/" + filename + suffix;
            if (delete_dir_contents(filepath, true) != 0) {
                res = error("Failed to clear contents of " + filepath);
            }
        };
        const int ec = foreach_subdir(appPath, subDirHandler);
        if (ec != 0) {
            res = error("Failed to process subdirs for " + appPath);
        }
    }
    return res;
    return res;
}
}


@@ -1246,6 +1261,32 @@ binder::Status InstalldNativeService::destroyAppData(const std::optional<std::st
            }
            }
        }
        }
    }
    }
    auto status = destroySdkSandboxDataPackageDirectory(uuid, packageName, userId, flags);
    if (!status.isOk()) {
        res = status;
    }
    return res;
}

binder::Status InstalldNativeService::destroySdkSandboxDataPackageDirectory(
        const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId,
        int32_t flags) {
    const char* uuid_ = uuid ? uuid->c_str() : nullptr;
    const char* pkgname = packageName.c_str();

    binder::Status res = ok();
    constexpr int storageFlags[2] = {FLAG_STORAGE_CE, FLAG_STORAGE_DE};
    for (int i = 0; i < 2; i++) {
        int currentFlag = storageFlags[i];
        if ((flags & currentFlag) == 0) {
            continue;
        }
        bool isCeData = (currentFlag == FLAG_STORAGE_CE);
        auto appPath = create_data_misc_sdk_sandbox_package_path(uuid_, isCeData, userId, pkgname);
        if (rename_delete_dir_contents_and_dir(appPath) != 0) {
            res = error("Failed to delete " + appPath);
        }
    }
    return res;
    return res;
}
}


@@ -3439,11 +3480,17 @@ binder::Status InstalldNativeService::cleanupInvalidPackageDirs(
    if (flags & FLAG_STORAGE_CE) {
    if (flags & FLAG_STORAGE_CE) {
        auto ce_path = create_data_user_ce_path(uuid_cstr, userId);
        auto ce_path = create_data_user_ce_path(uuid_cstr, userId);
        cleanup_invalid_package_dirs_under_path(ce_path);
        cleanup_invalid_package_dirs_under_path(ce_path);
        auto sdksandbox_ce_path =
                create_data_misc_sdk_sandbox_path(uuid_cstr, /*isCeData=*/true, userId);
        cleanup_invalid_package_dirs_under_path(sdksandbox_ce_path);
    }
    }


    if (flags & FLAG_STORAGE_DE) {
    if (flags & FLAG_STORAGE_DE) {
        auto de_path = create_data_user_de_path(uuid_cstr, userId);
        auto de_path = create_data_user_de_path(uuid_cstr, userId);
        cleanup_invalid_package_dirs_under_path(de_path);
        cleanup_invalid_package_dirs_under_path(de_path);
        auto sdksandbox_de_path =
                create_data_misc_sdk_sandbox_path(uuid_cstr, /*isCeData=*/false, userId);
        cleanup_invalid_package_dirs_under_path(sdksandbox_de_path);
    }
    }


    return ok();
    return ok();
+11 −10
Original line number Original line Diff line number Diff line
@@ -207,22 +207,23 @@ private:
                                       const std::string& seInfo, int32_t targetSdkVersion,
                                       const std::string& seInfo, int32_t targetSdkVersion,
                                       int64_t* _aidl_return);
                                       int64_t* _aidl_return);


    binder::Status reconcileSdkData(const std::optional<std::string>& uuid,
                                    const std::string& packageName,
                                    const std::vector<std::string>& sdkPackageNames,
                                    const std::vector<std::string>& randomSuffixes, int32_t userId,
                                    int32_t appId, int32_t previousAppId, const std::string& seInfo,
                                    int flags);
    binder::Status createSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid,
    binder::Status createSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid,
                                                        const std::string& packageName,
                                                        const std::string& packageName,
                                                        int32_t userId, int32_t appId,
                                                        int32_t userId, int32_t appId,
                                                        int32_t previousAppId,
                                                        int32_t previousAppId,
                                                        const std::string& seInfo, int32_t flags);
                                                        const std::string& seInfo, int32_t flags);

    binder::Status clearSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid,
    binder::Status deleteSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid,
                                                       const std::string& packageName,
                                                       const std::string& packageName,
                                                       int32_t userId, int32_t flags);
                                                       int32_t userId, int32_t flags);

    binder::Status destroySdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid,
    binder::Status reconcileSdkData(const std::optional<std::string>& uuid,
                                                         const std::string& packageName,
                                                         const std::string& packageName,
                                    const std::vector<std::string>& sdkPackageNames,
                                                         int32_t userId, int32_t flags);
                                    const std::vector<std::string>& randomSuffixes, int32_t userId,
                                    int32_t appId, int32_t previousAppId, const std::string& seInfo,
                                    int flags);
};
};


}  // namespace installd
}  // namespace installd
+1 −0
Original line number Original line Diff line number Diff line
@@ -107,6 +107,7 @@ cc_test {
        "libziparchive",
        "libziparchive",
        "liblog",
        "liblog",
        "liblogwrap",
        "liblogwrap",
        "libc++fs",
    ],
    ],
    test_config: "installd_service_test.xml",
    test_config: "installd_service_test.xml",


+347 −154

File changed.

Preview size limit exceeded, changes collapsed.