本文目的主要是记录自己系统(Android7.1系统)开发实现代码,以便后期通用的功能可以直接使用,不需要再去通过搜索然后筛选再验证的繁琐流程,大大减小自己的开发时间。
我实现思路是在系统内新增自己的数据库用来记录禁止卸载应用名单开关状态以及禁止卸载应用名单列表。为了使系统兼容性更强APP实现难度更低,采用的是通过自定义广播来实现,通过广播进行开关控制以及名单数据传输。
1、在rk3288\frameworks\base\core\java\com\android\server目录下的BootReceiver内新增自定义广播:
private static final String Uninstall = "android.intent.action.HUALI_TABLE_UNINSTALL"; //新增禁止卸载应用名单
private static final String Uninstall2 = "android.intent.action.HUALI_TABLE_UNINSTALL_DELETE"; //删除禁止卸载应用名单
private static final String UninstallStatus = "android.intent.action.HUALI_TABLE_UNINSTALL_STATUS"; // 禁止卸载应用名单状态
2、修改禁止卸载应用名单状态以及列表数据的新增和删除;
String action = intent.getAction();
HLDatabaseHelper dbHelper = new HLDatabaseHelper(context);
if (dbHelper.getListStatusDataSize() == 0) { //初始化名单状态表
dbHelper.initListStatusData();
}
if (action.equals(Uninstall)) {
ArrayList<String> whiteList = intent.getStringArrayListExtra("uninstallList");
int type = intent.getIntExtra("dataListType", 1);
for (String packageName : whiteList) {
Log.d(TAG, "新增禁止卸载名单包名:" + packageName + " 类型:" + type);
dbHelper.addUninstallData(packageName, type);
}
} else if (action.equals(Uninstall2)) {
String packageName = intent.getStringExtra("uninstallDelete");
Log.d(TAG, "删除禁止卸载名单包名:" + packageName);
dbHelper.deleteUninstallData(packageName);
}else if (action.equals(UninstallStatus)) {
boolean status = intent.getBooleanExtra("uninstallStatus", false);
Log.d(TAG, "接收到更新禁止卸载名单状态通知:" + status);
dbHelper.updateData(2, status);
}
3、在 rk3288\frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java 中实现卸载拦截功能
private int deletePackageX(String packageName, int userId, int deleteFlags) {
......
if (isPackageDeviceAdmin(packageName, removeUser)) {
Slog.w(TAG, "Not removing package " + packageName + ": has active device admin");
return PackageManager.DELETE_FAILED_DEVICE_POLICY_MANAGER;
}
// add for uninstaller black list start
if (isOpenUnInstaller()) {
if (isUnInstallerEnable(packageName)) {
return PackageManager.DELETE_FAILED_INTERNAL_ERROR;
}
}
// add for uninstaller black list end
PackageSetting uninstalledPs = null;
......
}
// add for uninstaller black list start
private boolean isUnInstallerEnable(String packagename) {
HLDatabaseHelper dbHelper = new HLDatabaseHelper(mContext);
return dbHelper.checkUninstallList(packagename);
}
// add for uninstaller black list end
// add 2024-7-10 start
private boolean isOpenUnInstaller() {
HLDatabaseHelper dbHelper = new HLDatabaseHelper(mContext);
return dbHelper.getTableStatus(2);
}
// add 2024-7-10 end
到此就完成修改了,有疑问的欢迎留言,有什么优化建议的也欢迎留言。