Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)

文章目录

Android framework修改,禁止指定包名的apk安装到设备上(基于Android10.0.0-r41)

1.新增接口提供给上层调用

pms就是负责apk的安装和卸载,从pms入手

frameworks/base/core/java/android/content/pm/IPackageManager.aidl

java 复制代码
//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中

java 复制代码
    //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,等各种方式安装进系统内。

java 复制代码
        //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

java 复制代码
public void setPkgNamesList(List<String> pkgNames) {
        try {
            Log.w("PackageManager", "pkgNames" + pkgNames);
            mPM.pmList(pkgNames);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

4.测试验证

添加我们需要禁止安装的app的包名

java 复制代码
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的安装

相关推荐
平行云PVT1 小时前
数字孪生信创云渲染技术解析:从混合信创到全国产化架构
linux·unity·云原生·ue5·图形渲染·webgl·gpu算力
hnlgzb1 小时前
常见的Android Jetpack库会有哪些?这些库中又有哪些常用类的?
android·android jetpack
xdscode2 小时前
Linux云服务器安装openclaw,并对接飞书通道
linux·服务器·飞书·openclaw
Percep_gan2 小时前
Linux中安装Redis,很详细
linux·运维·redis
2401_877274243 小时前
从匿名管道到 Master-Slave 进程池:Linux 进程间通信深度实践
linux·服务器·c++
feng_you_ying_li3 小时前
linux之用户的权限详解(4)
linux·运维·服务器
二进制person4 小时前
JavaEE初阶 --网络编程
linux·服务器·网络
Cyber4K4 小时前
【妙招系列】Harbor 镜像私有仓库搭建手册
linux·云原生·容器
钛态5 小时前
Flutter 三方库 http_mock_adapter — 赋能鸿蒙应用开发的高效率网络接口 Mock 与自动化测试注入引擎(适配鸿蒙 HarmonyOS Next ohos)
android·网络协议·flutter·http·华为·中间件·harmonyos
王码码20355 小时前
Flutter for OpenHarmony:Flutter 三方库 algoliasearch 毫秒级云端搜索体验(云原生搜索引擎)
android·前端·git·flutter·搜索引擎·云原生·harmonyos