Android 8.1.0 源码修改之 - 给自己预置到系统的预置应用添加一些默认权限

        因为项目中需要预置很多第三方应用,每当刷机完成之后,这些第三方应用进程只要启动,就会弹一些弹窗请求权限(比如某度输入法需要定位权限、读取联系人、访问SD卡等等权限,暂且不说他们是不是没必要请求这些权限,当系统启动起来弹一些这些东西,用户体验很不好。所以当前需要把这些权限的东西都给他们默认赋上,优化用户体验)。基于以上,我们需要在预置这些应用到系统之后,在framework对应的包中做一些修改。

        其实只需要修改一个类就可以了,这个包所在的位置:

folder\frameworks\base\services\core\java\com\android\server\pm\DefaultPermissionGrantPolicy.java

        首先找到这个类的方法 grantDefaultSystemHandlerPermissions(int userId) ,看这个方法的名字就很清楚了,这个方法是给系统默认的应用(用户)授权的。那在这个方法中命名并添加我们自己的方法  grantPermissionsToCustomApp(int userId),并模仿这个方法中授权的方式,给我们自己的应用授权:

    //声明百度输入法的包名
    private static final String PCK_NAME_BAIDU_INPUT = "com.baidu.input";

    /**
    *
    *给自己的自定义的应用授予一些权限
    */
    private void grantPermissionsToCustomApp(int userId){
        try{
            //add permission to baidu input method.
            PackageParser.Package customPackage = getPackageLPr(PCK_NAME_BAIDU_INPUT);

            if ((customPackage != null) && doesPackageSupportRuntimePermissions(customPackage)) {
                grantRuntimePermissionsLPw(customPackage, LOCATION_PERMISSIONS, userId);
                grantRuntimePermissionsLPw(customPackage, STORAGE_PERMISSIONS, userId);
                grantRuntimePermissionsLPw(customPackage, CONTACTS_PERMISSIONS, userId);
                grantRuntimePermissionsLPw(customPackage, PHONE_PERMISSIONS, userId);
                grantRuntimePermissionsLPw(customPackage, MICROPHONE_PERMISSIONS, userId);}
           
            
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

        这样就给了当前 user (默认的是 owner。其实只要是在这里授予了权限,其他无论 owner 创建其他的什么访客或者什么 user,在开机之后,这个预置应用都被授予了一些权限了)设置了这个应用所需的一些权限,优化了用户体验。

        当然有一点需要注意,这个方法要放到 grantDefaultSystemHandlerPermissions(int userId) 的    mService.mSettings.onDefaultRuntimePermissionsGrantedLPr(userId); 方法之前调用执行。

 

 

 

你可能感兴趣的:(Android 8.1.0 源码修改之 - 给自己预置到系统的预置应用添加一些默认权限)