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

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

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); 方法之前调用执行。



    推荐阅读