系统开发之应用黑白名单

news2024/9/9 0:25:14

本文目的主要是记录自己系统(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 list
        HLDatabaseHelper 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.coloradmin.cn/o/1958415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言代码运行不成功,如何解决?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

GEE数据:Sentinel-2数据更新新增两个云和雪波段(MSK_CLDPRB和MSK_SNWPRB)

目录 简介 数据时间 数据提供者 Collection Snippet 波段名称 Class Table: SCL 影像属性 代码 结果 简介 2022年1月25日之后&#xff0c;PROCESSING_BASELINE为“04.00”或以上的Sentinel-2场景的DN&#xff08;值&#xff09;范围移动了1000。HARMONIZED集合将新场…

【C++】std::shared_ptr智能指针详解和示例

在C中&#xff0c;智能指针是一种用于自动管理动态分配内存的机制&#xff0c;旨在减少内存泄漏和野指针的风险。std::shared_ptr 是C标准库提供的几种智能指针之一&#xff0c;它通过共享所有权的机制来管理动态分配的对象。本文将详细解析 std::shared_ptr 的工作原理、特性&…

【电路笔记】-共源JFET放大器

共源JFET放大器 文章目录 共源JFET放大器1、概述2、共源JFET放大器3、JFET放大器电流和功率增益共源JFET放大器使用结场效应晶体管作为其主要有源器件,提供高输入阻抗特性。 1、概述 普通源JFET放大器与共射极BJT放大器相比有一个重要优点,即FET具有极高的输入阻抗,再加上低…

工业三防平板,高效能与轻便性的结合

在当今数字化、智能化的工业时代&#xff0c;工业三防平板作为一种创新的设备&#xff0c;正以其独特的优势在各个领域发挥着重要作用。它不仅具备高效能的处理能力&#xff0c;还拥有出色的轻便性&#xff0c;为工业生产和管理带来了前所未有的便利。 一、高效能的核心动力 工…

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算作为新一代信息技术的核心&#xff0c;正逐步渗透到各行各业&#xff0c;成为推动数字化转型的重要力量。为了适应这一趋势&#xff0c;中职教育作为技能型人才培养的重要阵地&#xff0c;亟需加强云计算实验室建设与云计算实训平台的…

web,apache,nginx

web基本概念和常识 Web:为用户提供的一种在互联网上浏览信息的服务&#xff0c;Web 服务 是动态的、可交 互的、跨平台的和图形化的。 Web 服务为用户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物、学习…

泰迪智能科技大数据实验室——陕西省高校合作成功案例

近年来&#xff0c;陕西省紧跟国家大数据发展战略&#xff0c;积极推进大数据产业发展。在政策扶持、产业布局、技术创新等方面取得显著成效。泰迪智能科技大数据实验室立足陕西&#xff0c;携手西安邮电大学、西安财经大学、陕西科技大学镐京学院、宝鸡文理学院、渭南师范学院…

编译期链接时共享库搜索路径优先级实验

编译期链接时共享库搜索路径优先级实验 前言实验环境目录说明准备工作单独测试不配置路径默认路径LIBRARY_PATH-L 优先级测试默认路径和LIBRARY_PATH-L和默认路径 DEBUG模式编译器配置详细信息链接器详细信息DEBUG总结验证 默认路径>LIBRARY_PATH原因附录库文件源码主程序源…

bugku-web-ctf-变量1

<?php error_reporting(0); include "flag1.php"; highlight_file(__file__); if(isset($_GET[args])){$args $_GET[args];if(!preg_match("/^\w$/",$args)){die("args error!");}eval("var_dump($$args);"); } ?> error_r…

Apache、nginx

一、Web 1、概述 Web&#xff1a;为⽤户提供的⼀种在互联⽹上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 Web 服务为⽤户提供各种互联⽹服务&#xff0c;这些服务包括信息浏览服务&#xff0c;以及各种交互式服务&#xff0c;包括聊天、购物…

React基础知识 精简全面 推荐

这篇博文主要对一些刚入门react框架的同学&#xff0c;以及对react基本知识进行巩固的&#xff0c;最后就是精简一下基本知识&#xff0c;以方便自己查看&#xff0c;感谢参考&#xff0c;有问题评论区交流&#xff0c;谢谢。 目录 1.JSX 2.Props 和 State 3.组件生命周期…

“八股文”在实际工作中是助力、阻力还是空谈?

程序员面试中的“八股文”&#xff1a;助力、阻力还是空谈&#xff1f; 在当前的技术行业&#xff0c;程序员的招聘面试过程中频繁出现对“八股文”的考核。“八股文”通常指的是关于编程知识的标准化回答&#xff0c;这些问题在网络上大量流传&#xff0c;并被求职者反复背诵…

Socket通信(C++)

文章目录 什么是SocketSocket通信过程C Socket通信APIint socket(int domain, int type, int protocol);int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);struct sockaddrstruct sockaddr_unstruct sockaddr_in / struct sockaddr_in6 int connect(int …

IP Fabric三层路由

IP Fabric指的是在IP网络基础上建立起来的Overlay隧道技术。即为基于胖树的SpineLeaf拓扑结构的IP Fabric组网图。 在这种组网方式中&#xff0c;任何两台服务器间的通信不超过3台设备&#xff0c;每个Spine和Leaf节点全互连&#xff0c;可以方便地通过扩展Spine节点来实现网络…

Godot学习笔记6——数组和for

一、定义一个数组 在Godot中&#xff0c;定义一个数组的关键字也是“var”&#xff0c;数组里面的内容使用方括号括起来。在没有限定类型时&#xff0c;我们可以放入任何类型的数据&#xff1a; 我们甚至可以将另一个数组放入此数组中&#xff1a; 和其他类型的变量类似&#…

【数据结构】包装类泛型

1.包装类 在 Java 中&#xff0c;由于基本类型不是继承自 Object &#xff0c;为了在泛型代码中可以支持基本类型&#xff0c; Java 给每个基本类型都对应了 一个包装类型。 1.1.基本的数据类型对应的包装类 1.2装箱和拆箱 //装箱int a10;Integer cInteger.valueOf(a);System.…

鸿蒙应用框架开发【简单时钟】 UI框架

简单时钟 介绍 本示例通过使用ohos.display接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * Math.PI / …

Synchronized的锁升级过程是怎样的?

文章目录 一、Synchronized的使用1、修饰实例方法2、修饰静态方法3、修饰代码块4、总结&#xff1a; 二、Monitor1、Java对象头1.1 32 位虚拟机的对象头1.2 64位虚拟机的对象头 2、Mark Word 结构3、Moniter4、Synchronized 字节码5、轻量级锁6、锁膨胀7、自旋优化8、偏向锁9、…

Python for循环迭代原理(迭代器 Iterator)

在使用Python时&#xff0c;我们经常会使用for循环来访问容器对象&#xff08;列表、字符、字典等&#xff09;中的元素。其幕后实际是通过迭代协议来完成的&#xff0c;迭代是一种依次访问对象中元素的方式&#xff0c;for循环在对象上调用iter()函数生成一个迭代器&#xff0…