系统开发之应用黑白名单

本文目的主要是记录自己系统(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;
    }

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

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

panyingdao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值