From 29739df996d91fcdb0bbd4a7d4e47af878ef46fd Mon Sep 17 00:00:00 2001 From: ywy Date: Thu, 14 Aug 2025 15:30:23 +0800 Subject: [PATCH] appctrl does not depend on su --- .../server/pm/DeletePackageHelper.java | 31 +++++++++++++--- .../java/com/android/server/pm/Installer.java | 9 ----- .../server/pm/PackageManagerShellCommand.java | 2 +- .../cmds/installd/InstalldNativeService.cpp | 35 ------------------- .../cmds/installd/InstalldNativeService.h | 4 --- .../installd/binder/android/os/IInstalld.aidl | 2 -- aosp/system/vold/Android.bp | 6 ++++ aosp/system/vold/VoldNativeService.cpp | 33 +++++++++++++++++ aosp/system/vold/VoldNativeService.h | 2 ++ aosp/system/vold/binder/android/os/IVold.aidl | 2 ++ aosp/vendor/common/prebuild/Android.bp | 20 +++++++++++ aosp/vendor/common/prebuild/include/appctrl.h | 34 ++++++++++++++++++ aosp/vendor/common/prebuild/prebuild.mk | 3 +- 13 files changed, 126 insertions(+), 57 deletions(-) create mode 100644 aosp/vendor/common/prebuild/Android.bp create mode 100644 aosp/vendor/common/prebuild/include/appctrl.h diff --git a/aosp/frameworks/base/services/core/java/com/android/server/pm/DeletePackageHelper.java b/aosp/frameworks/base/services/core/java/com/android/server/pm/DeletePackageHelper.java index 63fa99510..809773244 100644 --- a/aosp/frameworks/base/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/aosp/frameworks/base/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -49,8 +49,11 @@ import android.content.pm.UserProperties; import android.content.pm.VersionedPackage; import android.net.Uri; import android.os.Binder; +import android.os.IBinder; +import android.os.IVold; import android.os.Process; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; @@ -88,6 +91,7 @@ final class DeletePackageHelper { private final UserManagerInternal mUserManagerInternal; private final RemovePackageHelper mRemovePackageHelper; private final BroadcastHelper mBroadcastHelper; + private IVold mVold; // TODO(b/198166813): remove PMS dependency DeletePackageHelper(PackageManagerService pm, RemovePackageHelper removePackageHelper, @@ -98,6 +102,26 @@ final class DeletePackageHelper { mBroadcastHelper = broadcastHelper; } + void cleanAppLink(String packageName, int deleteFlags) { + IBinder binder = ServiceManager.getService("vold"); + + if (binder != null) { + mVold = IVold.Stub.asInterface(binder); + + try { + if ((deleteFlags & PackageManagerShellCommand.DELETE_UPDATE_SHARE_APP) == 0) { + mVold.doAppctrlCmd("clean", packageName, ""); + } else { + mVold.doAppctrlCmd("clean", "-update", packageName); + } + } catch (RemoteException e) { + Slog.e(TAG, e.toString()); + } + } else { + Slog.e(TAG, "cleanAppLink() vold not found."); + } + } + /** * This method is an internal method that could be invoked either * to delete an installed package or to clean up a failed installation. @@ -123,11 +147,8 @@ final class DeletePackageHelper { final int removeUser = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0 ? UserHandle.USER_ALL : userId; - try { - mPm.mInstaller.cleanAppLink(packageName, deleteFlags); - } catch (InstallerException e) { - Slog.w(TAG, String.valueOf(e)); - } + // clean share app data + cleanAppLink(packageName, deleteFlags); final PackageSetting uninstalledPs; final PackageSetting disabledSystemPs; diff --git a/aosp/frameworks/base/services/core/java/com/android/server/pm/Installer.java b/aosp/frameworks/base/services/core/java/com/android/server/pm/Installer.java index 545753900..34903d1ed 100644 --- a/aosp/frameworks/base/services/core/java/com/android/server/pm/Installer.java +++ b/aosp/frameworks/base/services/core/java/com/android/server/pm/Installer.java @@ -757,15 +757,6 @@ public class Installer extends SystemService { } } - public void cleanAppLink(String packageName, int deleteFlags) throws InstallerException { - if (!checkBeforeRemote()) return; - try { - mInstalld.cleanAppLink(packageName, deleteFlags); - } catch (Exception e) { - throw InstallerException.from(e); - } - } - public void clearAppProfiles(String packageName, String profileName) throws InstallerException, LegacyDexoptDisabledException { checkLegacyDexoptDisabled(); diff --git a/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 3e840589b..e6ce3316b 100644 --- a/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/aosp/frameworks/base/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -206,7 +206,7 @@ class PackageManagerShellCommand extends ShellCommand { private static final SecureRandom RANDOM = new SecureRandom(); - private static final int DELETE_UPDATE_SHARE_APP = 0x00000010; + public static final int DELETE_UPDATE_SHARE_APP = 0x00000010; PackageManagerShellCommand(@NonNull IPackageManager packageManager, @NonNull Context context, @NonNull DomainVerificationShell domainVerificationShell) { diff --git a/aosp/frameworks/native/cmds/installd/InstalldNativeService.cpp b/aosp/frameworks/native/cmds/installd/InstalldNativeService.cpp index c67c5e518..9be17d458 100644 --- a/aosp/frameworks/native/cmds/installd/InstalldNativeService.cpp +++ b/aosp/frameworks/native/cmds/installd/InstalldNativeService.cpp @@ -4000,41 +4000,6 @@ binder::Status InstalldNativeService::migrateLegacyObbData() { return ok(); } -int InstalldNativeService::exe_system_cmd(const char *cmd_path, std::vector execve_str) { - int status = 0, ret = 0; - pid_t pid = fork(); - if (pid == 0) { - char *env[] = {nullptr}; - if (execve(cmd_path, const_cast(execve_str.data()), env) < 0) { - exit(1); - } - } else { - wait(&status); - ret = WEXITSTATUS(status); - } - if (ret == 1) { - return -1; - } - return 0; -} - -binder::Status InstalldNativeService::cleanAppLink(const std::string& packageName, int32_t deleteFlags) { - ENFORCE_UID(AID_SYSTEM); - std::vector execve_str = {nullptr}; - if (deleteFlags & DELETE_UPDATE_SHARE_APP) { - execve_str = {"appctrl", "clean", "-update", packageName.c_str(), nullptr}; - } else { - execve_str = {"appctrl", "clean", packageName.c_str(), nullptr}; - } - LOG(INFO) << "clean app link deleteFlags " << deleteFlags; - - const char *appctrl_path = "/system/bin/appctrl"; - if (exe_system_cmd(appctrl_path, execve_str) == -1) { - LOG(WARNING) << "appctrl clean fail package:" << packageName.c_str(); - } - return ok(); -} - binder::Status InstalldNativeService::cleanupInvalidPackageDirs( const std::optional& uuid, int32_t userId, int32_t flags) { ENFORCE_VALID_USER(userId); diff --git a/aosp/frameworks/native/cmds/installd/InstalldNativeService.h b/aosp/frameworks/native/cmds/installd/InstalldNativeService.h index 5f4c58ea8..436b93425 100644 --- a/aosp/frameworks/native/cmds/installd/InstalldNativeService.h +++ b/aosp/frameworks/native/cmds/installd/InstalldNativeService.h @@ -200,8 +200,6 @@ public: binder::Status migrateLegacyObbData(); - binder::Status cleanAppLink(const std::string& packageName, int32_t deleteFlags); - binder::Status cleanupInvalidPackageDirs(const std::optional& uuid, int32_t userId, int32_t flags); @@ -233,8 +231,6 @@ private: std::string findDataMediaPath(const std::optional& uuid, userid_t userid); - int exe_system_cmd(const char *cmd_path, std::vector execve_str); - binder::Status createAppDataLocked(const std::optional& uuid, const std::string& packageName, int32_t userId, int32_t flags, int32_t appId, int32_t previousAppId, diff --git a/aosp/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl b/aosp/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl index 67008dd6b..8a2f113bd 100644 --- a/aosp/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl +++ b/aosp/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl @@ -132,8 +132,6 @@ interface IInstalld { int getOdexVisibility(@utf8InCpp String packageName, @utf8InCpp String apkPath, @utf8InCpp String instructionSet, @nullable @utf8InCpp String outputPath); - void cleanAppLink(@utf8InCpp String packageName, int deleteFlags); - interface IFsveritySetupAuthToken { // Using an interface here is an easy way to create and maintain an IBinder object across // the processes. When installd creates this binder object, it stores the file stat diff --git a/aosp/system/vold/Android.bp b/aosp/system/vold/Android.bp index 8d6efaa84..5f8ff09a6 100644 --- a/aosp/system/vold/Android.bp +++ b/aosp/system/vold/Android.bp @@ -112,6 +112,10 @@ cc_library_static { "keystore2_use_latest_aidl_ndk_shared", ], + include_dirs: [ + "vendor/common/prebuild/include", + ], + srcs: [ "AppFuseUtil.cpp", "Benchmark.cpp", @@ -168,6 +172,7 @@ cc_library_static { ], shared_libs: [ "packagemanager_aidl-cpp", + "libappctrl", ], } @@ -185,6 +190,7 @@ cc_binary { ], shared_libs: [ "packagemanager_aidl-cpp", + "libappctrl", ], init_rc: [ diff --git a/aosp/system/vold/VoldNativeService.cpp b/aosp/system/vold/VoldNativeService.cpp index 5693febc3..ba3a42fc2 100644 --- a/aosp/system/vold/VoldNativeService.cpp +++ b/aosp/system/vold/VoldNativeService.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include "Benchmark.h" #include "Checkpoint.h" @@ -43,6 +44,7 @@ #include "VolumeManager.h" #include "cryptfs.h" #include "incfs.h" +#include "appctrl.h" using android::base::SetProperty; using namespace std::literals; @@ -975,5 +977,36 @@ binder::Status VoldNativeService::getStorageSize(int64_t* storageSize) { return translate(GetStorageSize(storageSize)); } +binder::Status VoldNativeService::doAppctrlCmd(const std::string& cmd, const std::string& pkgName, const std::string& extendArg) { + int ret = -1; + + const char *pkg_name = pkgName.c_str(); + const char *extend_arg = extendArg.c_str(); + + if (cmd == "clear") { + ret = appctrl::clear(); + } else if (cmd == "install") { + ret = appctrl::install(pkg_name); + } else if (cmd == "uninstall") { + ret = appctrl::uninstall(pkg_name); + } else if (cmd == "preinstall") { + ret = appctrl::preinstall(pkg_name, extend_arg); + } else if (cmd == "clean") { + ret = appctrl::clean(pkg_name, extend_arg); + } else if (cmd == "applyConfig") { + ret = appctrl::applyConfig(pkg_name); + } else { + LOG(ERROR) << "appctrl unknown command: " << cmd; + return binder::Status::ok(); + } + + if (ret != 0 && ret != SHARE_APP_INSTALLED) { + LOG(ERROR) << "execute appctrl command " << cmd << " failed! ret: " << ret; + return binder::Status::fromExceptionCode(-1); + } + LOG(INFO) << "execute appctrl command successfully."; + return binder::Status::ok(); +} + } // namespace vold } // namespace android diff --git a/aosp/system/vold/VoldNativeService.h b/aosp/system/vold/VoldNativeService.h index 7b8e31480..6638b839c 100644 --- a/aosp/system/vold/VoldNativeService.h +++ b/aosp/system/vold/VoldNativeService.h @@ -165,6 +165,8 @@ class VoldNativeService : public BinderService, public os::Bn binder::Status destroyDsuMetadataKey(const std::string& dsuSlot) override; binder::Status getStorageSize(int64_t* storageSize) override; + + binder::Status doAppctrlCmd(const std::string& cmd, const std::string& pkgName, const std::string& extendArg); }; } // namespace vold diff --git a/aosp/system/vold/binder/android/os/IVold.aidl b/aosp/system/vold/binder/android/os/IVold.aidl index 4677b3d56..6f54fac98 100644 --- a/aosp/system/vold/binder/android/os/IVold.aidl +++ b/aosp/system/vold/binder/android/os/IVold.aidl @@ -139,6 +139,8 @@ interface IVold { long getStorageSize(); + void doAppctrlCmd(@utf8InCpp String cmd, @utf8InCpp String pkgName, @utf8InCpp String extendArg); + // Returns the remaining storage lifetime as a percentage, rounded up as // needed when the underlying hardware reports low precision. Returns -1 // on failure. diff --git a/aosp/vendor/common/prebuild/Android.bp b/aosp/vendor/common/prebuild/Android.bp new file mode 100644 index 000000000..712391618 --- /dev/null +++ b/aosp/vendor/common/prebuild/Android.bp @@ -0,0 +1,20 @@ +cc_prebuilt_library_shared { + name: "libappctrl", + + arch: { + arm: { + srcs: ["system/lib/libappctrl.so"], + }, + arm64: { + srcs: ["system/lib64/libappctrl.so"], + }, + }, + compile_multilib: "both", + check_elf_files: false, + export_include_dirs: ["include"], + shared_libs: [ + "libbase", + "liblog", + "libutils", + ], +} \ No newline at end of file diff --git a/aosp/vendor/common/prebuild/include/appctrl.h b/aosp/vendor/common/prebuild/include/appctrl.h new file mode 100644 index 000000000..a0f23add5 --- /dev/null +++ b/aosp/vendor/common/prebuild/include/appctrl.h @@ -0,0 +1,34 @@ +#ifndef APPCTRL_H +#define APPCTRL_H + +#include +#include +#include + +namespace appctrl { + +#define HELP_APPCTRL "usage: appctrl [start] [install] [uninstall] [clear]\n\ + appctrl start PACKAGE_NAME ACTIVITY_NAME\n\ + appctrl install PACKAGE_NAME\n\ + appctrl uninstall PACKAGE_NAME\n\ + appctrl applyConfig CONFIG_PACKAGE_NAME\n\ + appctrl clear\n\n\ + This appctrl offer commands to control shareApp and configPackage\n\n" + +#define SHARE_APP_INSTALLED 1 + +int clear(); + +int uninstall(const char *package_name); + +int preinstall(const char *package_name, const char *bind_data); + +int install(const char *package_name); + +int clean(const char *package_name_old, const char *package_name_new); + +int applyConfig(const char *package_name); + +} // end namespace appctrl + +#endif \ No newline at end of file diff --git a/aosp/vendor/common/prebuild/prebuild.mk b/aosp/vendor/common/prebuild/prebuild.mk index 759bf9b27..17fdf38e4 100644 --- a/aosp/vendor/common/prebuild/prebuild.mk +++ b/aosp/vendor/common/prebuild/prebuild.mk @@ -44,4 +44,5 @@ PRODUCT_COPY_FILES += \ $(CUR_PATH)/system/bin/buildOverlayfs.sh:system/bin/buildOverlayfs.sh PRODUCT_PACKAGES += \ - appctrl \ No newline at end of file + appctrl \ + libappctrl \ No newline at end of file -- Gitee