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


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

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

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

    PermissionInfo getPermissionInfo(String name, int flags);        List queryPermissionsByGroup(String group, int flags);        PermissionGroupInfo getPermissionGroupInfo(String name, int flags);        List 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);List getPackagesForOps(in int[] ops);    List getOpsForPackage(int uid, String packageName, in int[] ops);    void setMode(int code, int uid, String packageName, int mode);    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的方式来设置状态,

可以通过包名获取权限

也可以通过权限获取包名


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

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

更多相关文章

  1. Android(安卓)添加Library Dependencies(库依赖)的方法
  2. 通过Intent传递一些二进制数据的方法有哪些?
  3. Android锁屏状态下点亮屏幕并弹窗提醒
  4. Android(安卓)studio NDK成长记录(一)CMake
  5. Android(安卓)Studio中Run按钮是灰色的快速解决方法
  6. Android在代码中设置控件的drawableLeft等
  7. Android(安卓)完全退出应用的四种方法
  8. Android(安卓)Navigation Architecture Component 使用详解
  9. flutter methodchannel调用原生方法,实现原生插件

随机推荐

  1. Jenkins Android gradle只能打包app-rele
  2. Android之Broadcast, BroadcastReceiver(
  3. Android短彩信数据库信息整理
  4. 浅析Android(安卓)手机卫士设备管理权限
  5. Android实现BannerLayout图文轮播功能
  6. android使用service和activity获取屏幕尺
  7. Android 定位当前位置可能出现的问题
  8. android 开发中遇到的问题
  9. Android style 的继承
  10. java android(ios)通用aes加密解密