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

Commit a71b59cb authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge "Delete external app dir on app uninstall with FUSE" am: c3323c7d am: f32fa062

Change-Id: I40ccd8d29e79f7490cf0798d26c780508e44f0a0
parents 442c3a42 f32fa062
Loading
Loading
Loading
Loading
+41 −14
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ static constexpr const char* CODE_CACHE_DIR_POSTFIX = "/code_cache";
static constexpr int kVerityPageSize = 4096;
static constexpr size_t kSha256Size = 32;
static constexpr const char* kPropApkVerityMode = "ro.apk_verity.mode";
static constexpr const char* kFuseProp = "persist.sys.fuse";

namespace {

@@ -588,12 +589,21 @@ binder::Status InstalldNativeService::clearAppData(const std::unique_ptr<std::st
        std::lock_guard<std::recursive_mutex> lock(mMountsLock);
        for (const auto& n : mStorageMounts) {
            auto extPath = n.second;

            if (android::base::GetBoolProperty(kFuseProp, false)) {
                std::regex re("^\\/mnt\\/pass_through\\/[0-9]+\\/emulated");
                if (std::regex_match(extPath, re)) {
                    extPath += "/" + std::to_string(userId);
                }
            } else {
                if (n.first.compare(0, 14, "/mnt/media_rw/") != 0) {
                    extPath += StringPrintf("/%d", userId);
                } else if (userId != 0) {
                    // TODO: support devices mounted under secondary users
                    continue;
                }
            }

            if (flags & FLAG_CLEAR_CACHE_ONLY) {
                // Clear only cached data from shared storage
                auto path = StringPrintf("%s/Android/data/%s/cache", extPath.c_str(), pkgname);
@@ -684,16 +694,26 @@ binder::Status InstalldNativeService::destroyAppData(const std::unique_ptr<std::
        std::lock_guard<std::recursive_mutex> lock(mMountsLock);
        for (const auto& n : mStorageMounts) {
            auto extPath = n.second;

            if (android::base::GetBoolProperty(kFuseProp, false)) {
                std::regex re("^\\/mnt\\/pass_through\\/[0-9]+\\/emulated");
                if (std::regex_match(extPath, re)) {
                    extPath += "/" + std::to_string(userId);
                }
            } else {
                if (n.first.compare(0, 14, "/mnt/media_rw/") != 0) {
                    extPath += StringPrintf("/%d", userId);
                } else if (userId != 0) {
                    // TODO: support devices mounted under secondary users
                    continue;
                }
            }

            auto path = StringPrintf("%s/Android/data/%s", extPath.c_str(), pkgname);
            if (delete_dir_contents_and_dir(path, true) != 0) {
                res = error("Failed to delete contents of " + path);
            }

            path = StringPrintf("%s/Android/media/%s", extPath.c_str(), pkgname);
            if (delete_dir_contents_and_dir(path, true) != 0) {
                res = error("Failed to delete contents of " + path);
@@ -2574,6 +2594,12 @@ binder::Status InstalldNativeService::invalidateMounts() {
        std::getline(in, target, ' ');
        std::getline(in, ignored);

        if (android::base::GetBoolProperty(kFuseProp, false)) {
            if (target.compare(0, 17, "/mnt/pass_through") == 0) {
                LOG(DEBUG) << "Found storage mount " << source << " at " << target;
                mStorageMounts[source] = target;
            }
        } else {
#if !BYPASS_SDCARDFS
            if (target.compare(0, 21, "/mnt/runtime/default/") == 0) {
                LOG(DEBUG) << "Found storage mount " << source << " at " << target;
@@ -2581,6 +2607,7 @@ binder::Status InstalldNativeService::invalidateMounts() {
            }
#endif
        }
    }
    return ok();
}