通過設置應用包名白名單的方式限制未授權的應用軟件安裝。
diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index af9a533..caa122d 100755
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -787,6 +787,19 @@ public class PackageManagerService extends IPackageManager.Stub {
? ? ?private List<String> mKeepUninstalledPackages;
?
? ? ?private UserManagerInternal mUserManagerInternal;
+? ? ? ?
+? ? ? ?//白名單文件路徑
+? ? ? ?private static final String WHITELIST_FILE_PATH = "/system/etc/package_whitelist.txt";
+? ? ? ?
+? ? ? ?// 定義默認白名單
+? ? ? ?private static final List<String> DEFAULT_WHITELIST = Arrays.asList(
+? ? ? ? ? ? ? ?"com.antutu.ABenchMark",
+? ? ? ? ? ? ? ?"com.qihoo360.mobilesafe"
+? ? ? ?);
?
? ? ?private static class IFVerificationParams {
? ? ? ? ?PackageParser.Package pkg;
@@ -8196,10 +8209,91 @@ public class PackageManagerService extends IPackageManager.Stub {
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? ?}
+? ? ? ?
+? ? ? ? ? ? ? ?/**
+? ? ? ? * 檢查應用是否允許安裝
+? ? ? ? */
+? ? ? ?private boolean isPackageAllowed(PackageParser.Package pkg) {
+? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ?// 檢查白名單
+? ? ? ? ? ? ? ?final List<String> allowedPackages = loadWhitelist();
+? ? ? ? ? ? ? ?final String packageName = pkg.packageName;
+? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ?// 精確匹配
+? ? ? ? ? ? ? ?if (allowedPackages.contains(packageName)) {
+? ? ? ? ? ? ? ? ? ? ? ?return true;
+? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ?return false;
+? ? ? ?}
+? ? ? ?
+? ? ? ? ? ? ? ?/**
+
+? ? ? ?/**
+? ? ? ? * 從配置文件加載白名單
+? ? ? ? */
+? ? ? ?private List<String> loadWhitelist() {
+? ? ? ? ? ? ? ?//List<String> whitelist = new ArrayList<>();
+? ? ? ? ? ? ? ?List<String> whitelist = new ArrayList<>(DEFAULT_WHITELIST);? // 使用默認列表
+? ? ? ? ? ? ? ?File whitelistFile = new File(WHITELIST_FILE_PATH);
+? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ?if (whitelistFile.exists() && whitelistFile.canRead()) {
+? ? ? ? ? ? ? ? ? ? ? ?try (BufferedReader reader = new BufferedReader(new FileReader(whitelistFile))) {
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?String line;
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?while ((line = reader.readLine()) != null) {
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?line = line.trim();
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 跳過空行和注釋
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?if (!line.isEmpty() && !line.startsWith("#")) {
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?whitelist.add(line);
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Slog.i(TAG, "Loaded " + whitelist.size() + " packages from whitelist");
+? ? ? ? ? ? ? ? ? ? ? ?} catch (FileNotFoundException e) {
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Slog.e(TAG, "Whitelist file not found: " + WHITELIST_FILE_PATH);
+? ? ? ? ? ? ? ? ? ? ? ?} catch (IOException e) {
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Slog.e(TAG, "Error reading whitelist file", e);
+? ? ? ? ? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ?return whitelist;
+? ? ? ?}
+
?
? ? ?private PackageParser.Package scanPackageDirtyLI(PackageParser.Package pkg,
? ? ? ? ? ? ?final int policyFlags, final int scanFlags, long currentTime, UserHandle user)
? ? ? ? ? ? ?throws PackageManagerException {
+? ? ? ? ? ? ? ? ? ? ? ?
+? ? ? ? ? ? ? ? // ========== 新增:動態白名單校驗 ==========
+? ? ? ? ? ? ? ?if ((policyFlags&PackageParser.PARSE_IS_SYSTEM) == 0 && !isPackageAllowed(pkg)) {
+? ? ? ? ? ? ? ? ? ? ? ?throw new PackageManagerException(
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PackageManager.INSTALL_FAILED_INVALID_APK,
+? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"Installation of package " + pkg.packageName + " is not allowed");
+? ? ? ? ? ? ? ?}
+? ? ? ? ? ? ? ?
? ? ? ? ?final File scanFile = new File(pkg.codePath);
? ? ? ? ?if (pkg.applicationInfo.getCodePath() == null ||
? ? ? ? ? ? ? ? ?pkg.applicationInfo.getResourcePath() == null) {
DEFAULT_WHITELIST 列表中是系統默認允許安裝的應用包名,用于系統預置應用的安裝。若還需要其他應用安裝,則可通過往/system/etc/package_whitelist.txt中添加應用包名實現。