本文目的主要是记录自己系统(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;
}
到此就完成了黑白名单功能,我也是刚刚接触这块有什么问题或者建议欢迎大家多多留言。