Loading cmds/installd/InstalldNativeService.cpp +74 −27 Original line number Diff line number Diff line Loading @@ -734,7 +734,7 @@ binder::Status InstalldNativeService::createAppDataLocked( } else { // Package does not need sdk storage. Remove it. deleteSdkSandboxDataPackageDirectory(uuid, packageName, userId, flags); destroySdkSandboxDataPackageDirectory(uuid, packageName, userId, flags); } return ok(); Loading Loading @@ -802,32 +802,6 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory( 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( 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, Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -3439,11 +3480,17 @@ binder::Status InstalldNativeService::cleanupInvalidPackageDirs( if (flags & FLAG_STORAGE_CE) { auto ce_path = create_data_user_ce_path(uuid_cstr, userId); 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) { auto de_path = create_data_user_de_path(uuid_cstr, userId); 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(); Loading cmds/installd/InstalldNativeService.h +11 −10 Original line number Diff line number Diff line Loading @@ -207,22 +207,23 @@ private: const std::string& seInfo, int32_t targetSdkVersion, 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, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags); binder::Status deleteSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid, binder::Status clearSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags); binder::Status reconcileSdkData(const std::optional<std::string>& uuid, binder::Status destroySdkSandboxDataPackageDirectory(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); int32_t userId, int32_t flags); }; } // namespace installd Loading cmds/installd/tests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ cc_test { "libziparchive", "liblog", "liblogwrap", "libc++fs", ], test_config: "installd_service_test.xml", Loading cmds/installd/tests/installd_service_test.cpp +347 −154 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
cmds/installd/InstalldNativeService.cpp +74 −27 Original line number Diff line number Diff line Loading @@ -734,7 +734,7 @@ binder::Status InstalldNativeService::createAppDataLocked( } else { // Package does not need sdk storage. Remove it. deleteSdkSandboxDataPackageDirectory(uuid, packageName, userId, flags); destroySdkSandboxDataPackageDirectory(uuid, packageName, userId, flags); } return ok(); Loading Loading @@ -802,32 +802,6 @@ binder::Status InstalldNativeService::createSdkSandboxDataPackageDirectory( 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( 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, Loading Loading @@ -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; } Loading Loading @@ -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; } Loading Loading @@ -3439,11 +3480,17 @@ binder::Status InstalldNativeService::cleanupInvalidPackageDirs( if (flags & FLAG_STORAGE_CE) { auto ce_path = create_data_user_ce_path(uuid_cstr, userId); 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) { auto de_path = create_data_user_de_path(uuid_cstr, userId); 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(); Loading
cmds/installd/InstalldNativeService.h +11 −10 Original line number Diff line number Diff line Loading @@ -207,22 +207,23 @@ private: const std::string& seInfo, int32_t targetSdkVersion, 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, const std::string& packageName, int32_t userId, int32_t appId, int32_t previousAppId, const std::string& seInfo, int32_t flags); binder::Status deleteSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid, binder::Status clearSdkSandboxDataPackageDirectory(const std::optional<std::string>& uuid, const std::string& packageName, int32_t userId, int32_t flags); binder::Status reconcileSdkData(const std::optional<std::string>& uuid, binder::Status destroySdkSandboxDataPackageDirectory(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); int32_t userId, int32_t flags); }; } // namespace installd Loading
cmds/installd/tests/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ cc_test { "libziparchive", "liblog", "liblogwrap", "libc++fs", ], test_config: "installd_service_test.xml", Loading
cmds/installd/tests/installd_service_test.cpp +347 −154 File changed.Preview size limit exceeded, changes collapsed. Show changes