系统开发之应用黑白名单

本文目的主要是记录自己系统(Android7.1系统)开发实现代码,以便后期通用的功能可以直接使用,不需要再去通过搜索然后筛选再验证的繁琐流程,大大减小自己的开发时间。

 

        我实现思路是在系统内新增自己的数据库用来记录黑白名单开关状态以及黑白名单列表。为了是系统兼容性更强APP实现难度更低,才有的是通过自定义广播来实现,通过广播进行通知开关以及数据传送。

1、在Y:\rk3288\frameworks\base\core\java\com\android\server目录下的BootReceiver内新增自定义广播:

private static final String White = "android.intent.action.HUALI_TABLE_WHITE"; // 白名单新增
private static final String White2 = "android.intent.action.HUALI_TABLE_WHITE_DELETE"; // 白名单删除
private static final String Black = "android.intent.action.HUALI_TABLE_BLACK"; // 黑名单新增
private static final String Black2 = "android.intent.action.HUALI_TABLE_BLACK_DELETE";// 黑名单删除
private static final String WhiteStatus = "android.intent.action.HUALI_TABLE_WHITE_STATUS"; // 白名单状态
private static final String BlackStatus = "android.intent.action.HUALI_TABLE_BLACK_STATUS"; // 黑名单状态

2、修改黑白名单状态以及列表数据的新增和删除;

    String action = intent.getAction();HLDatabaseHelper dbHelper = new HLDatabaseHelper(context);if (dbHelper.getListStatusDataSize() == 0) { //初始化名单状态表dbHelper.initListStatusData();}if (action.equals(White)) {ArrayList<String> whiteList = intent.getStringArrayListExtra("whiteList");for (String packageName : whiteList) {Log.d(TAG, "新增的白名单包名:" + packageName);dbHelper.addWhiteData(packageName);}Log.d(TAG, "当前白名单包名大小:" + dbHelper.getWhiteData().getCount());} else if (action.equals(White2)) {String packageName = intent.getStringExtra("whiteDelete");Log.d(TAG, "删除的白名单包名:" + packageName);dbHelper.deleteWhiteData(packageName);} else if (action.equals(Black)) {ArrayList<String> whiteList = intent.getStringArrayListExtra("blackList");for (String packageName : whiteList) {Log.d(TAG, "新增黑名单包名:" + packageName);dbHelper.addBlackData(packageName);}} else if (action.equals(Black2)) {String packageName = intent.getStringExtra("blackDelete");Log.d(TAG, "删除黑名单包名:" + packageName);dbHelper.deleteBlackData(packageName);} else if (action.equals(WhiteStatus)) {boolean status = intent.getBooleanExtra("whiteStatus", false);Log.d(TAG, "接收到更新白名单状态通知:" + status);dbHelper.updateData(0, status);Log.e(TAG, "当前名单状态: " + dbHelper.getTableStatus(0));} else if (action.equals(BlackStatus)) {boolean status = intent.getBooleanExtra("blackStatus", false);Log.d(TAG, "接收到更新黑名单状态通知:" + status);dbHelper.updateData(1, status);} 

3、在frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java内实现黑白名单判断

      // start app installer white filter listHLDatabaseHelper dbHelper = new HLDatabaseHelper(mContext);if (dbHelper.getTableStatus(0) || dbHelper.getTableStatus(1)) {if (!isWhiteInstall(pkg.packageName) && !isBlackInstall(pkg.packageName, mContext)) {Slog.d(TAG, "不是白名单或者是黑名单,取消安装: " + pkgName);res.setError(PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE, "app is not in the whitelist. packageName:" + pkg.packageName);return;}}// end app installer white filter list// Get rid of all references to package scan path via parser.pp = null;

黑白名单获取方法

    // 白名单判断private boolean isWhiteInstall(String pkgName) {HLDatabaseHelper dbHelper = new HLDatabaseHelper(mContext);Cursor cursor = dbHelper.getWhiteData();if (cursor.moveToFirst()) {do {int idIndex = cursor.getColumnIndex("id");int nameIndex = cursor.getColumnIndex("name");if (idIndex != -1 && nameIndex != -1) {int id = cursor.getInt(idIndex);String name = cursor.getString(nameIndex);// 输出数据或用于其他操作Slog.d(TAG, "ID: " + id + ", Name: " + name + ", 安装: " + pkgName);if (pkgName.equals(name)) {return true;}} else {// 处理列不存在的情况Slog.e(TAG, "Error One or more columns not found in the cursor.");}} while (cursor.moveToNext());}cursor.close();if (pkgName.equals("com.huali.appmanage")) { //默认授权管理APP安装return true;}return false;}// 黑名单判断private boolean isBlackInstall(String pkgName, Context context) {HLDatabaseHelper dbHelper = new HLDatabaseHelper(context);Cursor cursor = dbHelper.getBlackData();if (cursor.moveToFirst()) {do {int idIndex = cursor.getColumnIndex("id");int nameIndex = cursor.getColumnIndex("name");if (idIndex != -1 && nameIndex != -1) {int id = cursor.getInt(idIndex);String name = cursor.getString(nameIndex);// 输出数据或用于其他操作Slog.d(TAG, "ID: " + id + ", Name: " + name + ", 安装黑名单: " + pkgName);if (pkgName.equals(name)) {return true;}} else {// 处理列不存在的情况Slog.e(TAG, "Error One or more columns not found in the cursor.");}} while (cursor.moveToNext());}cursor.close();return false;}

到此就完成了黑白名单功能,我也是刚刚接触这块有什么问题或者建议欢迎大家多多留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/387206.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Bugku] web-CTF靶场详解!!!

平台为“山东安信安全技术有限公司”自研CTF/AWD一体化平台&#xff0c;部分赛题采用动态FLAG形式&#xff0c;避免直接抄袭答案。 平台有题库、赛事预告、工具库、Writeup库等模块。 ------------------------------- Simple_SSTI_1 启动环境&#xff1a; 页面提示传入参数f…

【Linux】make/Makefile的理解

1.make是一个命令&#xff0c;makefile是一个文件, 依赖关系和依赖方法. a.快速使用一下 i.创建一个Makefile文件(首字母也可以小写) b.依赖关系和依赖方法 i.依赖关系: 我为什么要帮你? mybin:mytest.c ii.依赖方法: 怎么帮? gcc -o mybin mytest.c make之前要注意先创建…

2024电赛H题参考方案(+视频演示+核心控制代码)——自动行驶小车

目录 一、题目要求 二、参考资源获取 三、TI板子可能用到的资源 1、环境搭建及工程移植 2、相关模块的移植 四、控制参考方案 1、整体控制方案视频演示 2、视频演示部分核心代码 五、总结 一、题目要求 小编自认为&#xff1a;此次控制类类型题目的H题&#xff0c;相较于往年较…

Snowflake 集成模式:Apache Kafka 与零 ETL 和反向 ETL

Snowflake 是领先的云原生数据仓库。集成模式包括批量数据集成、零 ETL 和使用 Apache Kafka 的近乎实时的数据摄取。这篇博文探讨了不同的方法&#xff0c;并发现了它们的利弊。根据行业建议&#xff0c;建议避免使用反向 ETL 等反模式&#xff0c;而是使用数据流来增强企业架…

MySQL基础练习题12-使用唯一标识码替换员工ID

题目&#xff1a;展示每位用户的 唯一标识码&#xff08;unique ID &#xff09;&#xff1b;如果某位员工没有唯一标识码&#xff0c;使用 null 填充即可。 准备数据 分析数据 题目&#xff1a;展示每位用户的 唯一标识码&#xff08;unique ID &#xff09;&#xff1b;如果…

Vue2从基础到实战(指令篇)

案例&#xff1a;动态切换图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Vue.js 示例</ti…

划重点!「2024观测云发布会」亮点速览

在刚刚落幕的「2024观测云发布会」上&#xff0c;CEO蒋烁淼及其团队以「ENDLESS EVOLUTION」为主题&#xff0c;向大家展示了观测云近两年的革新之旅。不仅深入回顾了观测云在产品创新、技术突破上的持续追求&#xff0c;更以远见卓识&#xff0c;描绘了一幅充满潜力与创新的未…

ChatGPT小狐狸AI付费创作系统v3.0.3+前端

小狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#xff0c;小狐狸…

【C语言】整数类型及其数值范围(截断+数据)

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html ⚙️操作环境:Visual Studio 2022 目录 一、介绍 二、整数类型表 1.分析 2.小结 三、截断 1.什么是截断&#xff1f; 2.为什么需要截断…

为什么要做边界值测试?

边界值测试的理解 边界值测试&#xff08;Boundary Value Testing&#xff09;是一种常用的软件测试方法&#xff0c;它侧重于测试输入值的边缘或临界条件。这些边缘条件通常包括最小值、最大值以及接近这些最小值和最大值的值。边界值测试的基本思想是&#xff0c;许多软件错…

WEB前端开发中如何实现大文件上传?

大文件上传是个非常普遍的场景&#xff0c;在面试中也会经常被问到&#xff0c;大文件上传的实现思路和流程。在日常开发中&#xff0c;无论是云存储、视频分享平台还是企业级应用&#xff0c;大文件上传都是用户与服务器之间交互的重要环节。随着现代网络应用的日益复杂化&…

贪心算法-买卖股票问题

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最好或最优的算法。贪心算法并不保证总是能得到全局最优解&#xff0c;但它通常能得到不错的解…

【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析

前言&#xff1a; 接上篇&#xff0c;排序算法除了选择排序&#xff08;希尔排序&#xff09;和插入排序&#xff08;堆排序&#xff09;之外&#xff0c;还用交换排序&#xff08;冒泡排序、快速排序&#xff09;和归并排序已经非比较排序&#xff0c;本篇来深层解析这些排序算…

Java 基础 and 进阶面试知识点(超详细)

一个 Java 文件中是否可以存在多个类&#xff08;修饰类除外&#xff09;&#xff1f; 一个 Java 文件中是可以存在多个类的&#xff0c;但是一个 Java 文件中只能存在一个 public 所修饰的类&#xff0c;而且这个 Java 文件的文件名还必须和 public 所修饰类的类名保持一致&a…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

C++入门基础:C++中的循环语句

循环语句是编程语言中用来重复执行一段代码直到满足特定条件的一种控制结构。它们对于处理需要重复任务的场景非常有用&#xff0c;比如遍历数组、累加数值、重复执行某项操作直到满足条件等。 但是在使用循环语句的时候需要注意下哈&#xff0c;有时候一不小心会构成死循环或者…

centos安装kubernetes

本章程安装k8s 1.30版本为例。 1、环境配置 k8s 自1.24版本起&#xff0c;移除了dockershim了&#xff0c;1.30使用了containerd运行部署&#xff0c;containerd部署文档参考centos安装containerd-CSDN博客 k8s部署环境可参考容器运行时 | Kubernetes 1.1、修改主机名称 #…

【Django5】模型定义与使用

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…

MacOS 使用DBeaver连接MySQL数据库 以及常见的问题

文章目录 1 DBeaver介绍2 下载安装3 连接MySQL4 DBeaver使用中的常见问题1 DBeaver驱动无法下载2 连接mysql时报错 Public Key Retrieval is not allowed3 mysql出现错误提示&#xff1a;connection refused: Communications link failure The last packet sent successfully t…

【JavaScript】详解Day.js:轻量级日期处理库的全面指南

文章目录 一、Day.js简介1. 什么是Day.js&#xff1f;2. 安装Day.js 二、Day.js的基本用法1. 创建日期对象2. 格式化日期3. 解析日期字符串4. 操作日期5. 比较日期 三、Day.js的高级功能1. 插件机制2. 国际化支持 四、实际应用案例1. 事件倒计时2. 日历应用 在JavaScript开发中…