文章目录
- Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)
- 1.新增接口提供给上层调用
- 2.在pms中实现新增的接口
- 3.找到preparePackageLI方法。
- 4.测试验证
Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)
1.新增接口提供给上层调用
pms就是负责apk的安装和卸载,从pms入手
frameworks/base/core/java/android/content/pm/IPackageManager.aidl
//qfh add
void pmList(in List<String> pkgNames);
List<String> getPackageInfoList();
//qfh end
自定义两个接口在aidl文件中,pmList主要设置要禁止安装的包名的列表,getPackageInfoList是获取包名列表
2.在pms中实现新增的接口
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
在pms中
//qfh add
private List<String> pkNames;
@Override
public void pmList(List<String> pkNames) {
this.pkNames = pkNames;
Slog.d(TAG, " pkNames " + pkNames);
}
@Override
public List<String> getPackageInfoList(){
return this.pkNames;
}
private boolean refuseInstallationAppList(String packagename){
if(this.pkNames == null || this.pkNames.size() == 0){
return false;
}
for(String pkNameItem : this.pkNames) {
if (pkNameItem.equals(packagename)) {
return true;
}
}
return false;
}
//qfh end
主要是对pmList,getPackageInfoList两个接口的实现,refuseInstallationAppList是判断我们传入的包名是否被列入禁止安装的列表中,
3.找到preparePackageLI方法。
只要是安装apk都会走这个方法,包括adb,以及Android studio,等各种方式安装进系统内。
//qfh add
if(refuseInstallationAppList(pkg.packageName)) {
Log.d("refuseInstallationAppList","refuseInstallationAppList");
throw new PrepareFailure(INSTALL_FAILED_INSTANT_APP_INVALID, "this is a app for refuseInstallationAppList");
}
//qfh end
判断传入的包名是否在禁止安装的列表中,如果在就抛出异常禁止安装。
由于pms是父类,它有一个子类ApplicationPackageManager还需要我们添加一个接口方法,提供给app外界调用
frameworks/base/core/java/android/app/ApplicationPackageManager.java
public void setPkgNamesList(List<String> pkgNames) {
try {
Log.w("PackageManager", "pkgNames" + pkgNames);
mPM.pmList(pkgNames);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
4.测试验证
添加我们需要禁止安装的app的包名
public void createPackageManagerTest(View view) {
Context context = getApplicationContext();
ApplicationPackageManager packageManager = (ApplicationPackageManager) context.getPackageManager();
List<String> pkNames = new ArrayList<>();
pkNames.add("com.example.myapplication6");
packageManager.setPkgNamesList(pkNames);
}
我们可以把包名修改成禁用的包名测试下
使用adb安装,这是我们抛出异常的日志信息,
Androidstuduio直接安装也是被禁止
至此就达到了我们的要求,可以有选择性的禁止一些app的安装