android permiss manager (安全软件获取权限 禁用 可用 提示状态)

这两天老大发话说要我研究一下安卓安全软件的功能,先抽取了一个小模块,研究权限管理


一开始就去packagemanager 去看发现有几个方法:

就先去看了一下IPackagemanager 里面的方法:

有很多 这里我之列出跟权限有关的

    PermissionInfo getPermissionInfo(String name, int flags);
    
    List<PermissionInfo> queryPermissionsByGroup(String group, int flags);
    
    PermissionGroupInfo getPermissionGroupInfo(String name, int flags);
    
    List<PermissionGroupInfo> getAllPermissionGroups(int flags);

    int checkPermission(String permName, String pkgName);
    
    int checkUidPermission(String permName, int uid);
    
    boolean addPermission(in PermissionInfo info);
    
    void removePermission(String name);

    void grantPermission(String packageName, String permissionName);

    void revokePermission(String packageName, String permissionName);

  String[] getAppOpPermissionPackages(String permissionName);

ParceledListSlice getPackagesHoldingPermissions(in String[] permissions,
            int flags, int userId);
 boolean addPermissionAsync(in PermissionInfo info);
 void setPermissionEnforced(String permission, boolean enforced);

看安全软件上的功能:

通过包名找权限

通过权限找包名

禁用 提示  允许 三种状态

首先:就发现了2个方法:

void removePermission(String name);
void grantPermission(String packageName, String permissionName);


我很高兴的就开始写代码了 测试结果:
java.lang.SecurityException: Can't change android.permission.INTERNET. It is required by the application
一直报这个错
 开始以为是华为手机原因,用小米手机测 也有,我就开始怀疑了,状态有三种 而我出错了 就算对了,也只有两种状态

其实查到了是需要检查权限,源码就不贴了,可以通过hook的方式,猜测把源码修改一下也可以用,目前这种方案先放弃。


还有一个情况就算PackageManager 类中:getPackageInfo方法PackageInfo可以拿到requestedPermissions 所有的申请的权限,而安全软件上的权限只有一部分,我开始以为通过某种方式过滤掉一部分。


测试了一段时间 我就发现可能不是这个原因,肯定是我的思路错了。


我又去网上查了一部分资料:看到这个类AppOpsManager  我就明白了 我找到相应的服务端代码IAppOpsService:

interface IAppOpsService {
    // These first methods are also called by native code, so must
    // be kept in sync with frameworks/native/include/binder/IAppOpsService.h
    int checkOperation(int code, int uid, String packageName);
    int noteOperation(int code, int uid, String packageName);
    int startOperation(IBinder token, int code, int uid, String packageName);
    void finishOperation(IBinder token, int code, int uid, String packageName);
    void startWatchingMode(int op, String packageName, IAppOpsCallback callback);
    void stopWatchingMode(IAppOpsCallback callback);
    IBinder getToken(IBinder clientToken);

    // Remaining methods are only used in Java.
    int checkPackage(int uid, String packageName);
<span style="color:#FF0000;">List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops);</span>
<span style="color:#FF0000;">    List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops);
    void setMode(int code, int uid, String packageName, int mode);</span>
    void resetAllModes(int reqUserId, String reqPackageName);
    int checkAudioOperation(int code, int usage, int uid, String packageName);
    void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);

    void setUserRestrictions(in Bundle restrictions, int userHandle);
    void removeUser(int userHandle);
}
它通过mode的方式来设置状态,

可以通过包名获取权限

也可以通过权限获取包名


更重要的是返回权限不是全部的 会根据级别 系统写好的返回给你

你可以根据权限做个分级,这一切就明朗了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值