修改意图:
强制 限制 某些apk 在机器上使用
思路:
在framework层 PackageManagerService.java
中的 private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res) 方法来修改:
下面是直接写死某些apk ,不让其安装 ,也支持动态 添加 和删除 包名的 操作
if (parsedPackage != null) {
String installAppStr = "ru.andr7e.deviceinfohw;com.abs.cpu_z_advance;com.specdevice;mark.fakedevicetest;com.inpocketsoftware.andTest";
List<String> appList = new ArrayList<String>();
if(!TextUtils.isEmpty(installAppStr)){
appList = Arrays.asList(installAppStr.split(";"));
if(appList.size()>0){
String currentPkgName = parsedPackage.getPackageName();
// if((installMode == 1 && appList.contains(currentPkgName)) || (installMode == 2 && !appList.contains(currentPkgName)){
if(appList.contains(currentPkgName)){
res.setError(INSTALL_FAILED_INTERNAL_ERROR, "Restrict installation applications:" + currentPkgName);
}
}
}
} else {
Log.d("fyTest", "Secure check install_app_white_Black_list is NULL");
}
还有些客户 要求 能通过 自己的后台 来控制 安装与否
if(JTY_YWG_APP_INSTALL_SWITCH){
if (parsedPackage != null) {
int installMode = android.provider.Settings.System.getInt(mContext.getContentResolver(), "install_app_mode",0);
if(installMode == 0) {
res.setError(INSTALL_FAILED_INTERNAL_ERROR, "Restrict installation applications:");
mUiHandler.post(() -> {
AlertDialog d = new BaseErrorDialog(mUiContext);
d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
d.setCancelable(false);
d.setTitle(mUiContext.getText(R.string.error_message_title));
d.setMessage(mUiContext.getText(R.string.stop_install_apk));
d.setButton(DialogInterface.BUTTON_POSITIVE,
mUiContext.getText(R.string.ok),
mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d));
d.show();
Message msg = mUiHandler.obtainMessage(DISMISS_DIALOG_UI_MSG, d);
msg.setAsynchronous(true);
mUiHandler.sendMessageDelayed(msg, 3000);
});
}
}
}
思路是一样的 。上面的列子 还添加了一个提示框。