当前位置: 首页 > article >正文

RK3399 Android7.1增加应用安装白名单机制

通过设置应用包名白名单的方式限制未授权的应用软件安装。

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中添加应用包名实现。

http://www.lryc.cn/news/2395225.html

相关文章:

  • uni-app 安卓消失的字符去哪里了?maxLength失效了!
  • #AI短视频制作完整教程
  • 嵌入式STM32学习——串口USART 2.0(printf重定义及串口发送)
  • 【大模型】情绪对话模型项目研发
  • Git 教程 | 如何将指定文件夹回滚到上一次或某次提交状态(命令详解)
  • 【PCI】PCI入门介绍(包含部分PCIe讲解)
  • Cloudera Manager 学习笔记
  • Deepin 23.10安装Docker
  • 使用PowerBI个人网关定时刷新数据
  • 数字人引领政务新风尚:智能设备助力政务服务
  • 深入剖析Java类加载机制:双亲委派模型的突破与实战应用
  • Kotlin JVM 注解详解
  • 将 node.js 项目作为后台进程持续运行
  • 【PhysUnits】15.5 引入P1后的标准化表示(standardization.rs)
  • MySQL-5.7 修改密码和连接访问权限
  • tauri2项目打开某个文件夹,类似于mac系统中的 open ./
  • 企业文件乱、传输慢?用群晖 NAS 构建安全高效的共享系统
  • 防爆手机VS普通手机,区别在哪里?
  • C语言结构体的别名与创建结构体变量
  • 在RTX5060Ti上进行Qwen3-4B的GRPO强化微调
  • SQL进阶之旅 Day 7:视图与存储过程入门
  • 武汉火影数字VR大空间制作
  • Docker部署项目无法访问,登录超时完整排查攻略
  • (增强)基于sqlite、mysql、redis的消息存储
  • Windows上用FFmpeg推流及拉流的流程概览
  • MFC坦克大战游戏制作
  • Kafka ACK机制详解:数据可靠性与性能的权衡之道
  • VulnStack|红日靶场——红队评估四
  • 数据库 | 时序数据库选型
  • 网络拓扑如何跨网段访问