Android 系统对permision的检测过程

RK3288 5.1 中以太网设置静态IP 对permission的检测

简略的调用过程如下:

frameworks\opt\net\ethernet\java\com\android\server\ethernet\EthernetServiceImpl.java

public void setConfiguration(IpConfiguration config) {

if (!mStarted.get()) {

Log.w(TAG, "System isn't ready enough to change ethernet configuration");

}

enforceChangePermission();

enforceConnectivityInternalPermission();

synchronized (mIpConfiguration) {

mEthernetConfigStore.writeIpAndProxyConfigurations(config);

// TODO: this does not check proxy settings, gateways, etc.

// Fix this by making IpConfiguration a complete representation of static configuration.

if (!config.equals(mIpConfiguration)) {

mIpConfiguration = new IpConfiguration(config);

mTracker.stop();

mTracker.start(mContext, mHandler);

}

}

}

private void enforceConnectivityInternalPermission() {

mContext.enforceCallingOrSelfPermission(

android.Manifest.permission.CONNECTIVITY_INTERNAL,

"ConnectivityService");

}

frameworks\base\core\java\android\app\ContextImpl.java

public void enforceCallingOrSelfPermission(

String permission, String message) {

enforce(permission,

checkCallingOrSelfPermission(permission),

true,

Binder.getCallingUid(),

message);

通过Binder这个类,可以获得调用服务的应用的ID,通过这个ID,可以获得应用的相关信息;

@Override

public int checkCallingOrSelfPermission(String permission) {

if (permission == null) {

throw new IllegalArgumentException("permission is null");

}

return checkPermission(permission, Binder.getCallingPid(),

Binder.getCallingUid());

}

@Override

public int checkPermission(String permission, int pid, int uid) {

if (permission == null) {

throw new IllegalArgumentException("permission is null");

}

try {

return ActivityManagerNative.getDefault().checkPermission(

permission, pid, uid);

} catch (RemoteException e) {

return PackageManager.PERMISSION_DENIED;

}

}

frameworks\base\services\core\java\com\android\server\ActivityManagerService.java

@Override

public int checkPermission(String permission, int pid, int uid) {

if (permission == null) {

return PackageManager.PERMISSION_DENIED;

}

return checkComponentPermission(permission, pid, UserHandle.getAppId(uid), -1, true);

}

int checkComponentPermission(String permission, int pid, int uid,

int owningUid, boolean exported) {

if (pid == MY_PID) {

return PackageManager.PERMISSION_GRANTED;

}

return ActivityManager.checkComponentPermission(permission, uid,

owningUid, exported);

}

frameworks\base\core\java\android\app\ActivityManager.java

/** @hide */

public static int checkComponentPermission(String permission, int uid,

int owningUid, boolean exported) {

// Root, system server get to do everything.

if (uid == 0 || uid == Process.SYSTEM_UID) {

return PackageManager.PERMISSION_GRANTED;

}

// Isolated processes don't get any permissions.

if (UserHandle.isIsolated(uid)) {

return PackageManager.PERMISSION_DENIED;

}

// If there is a uid that owns whatever is being accessed, it has

// blanket access to it regardless of the permissions it requires.

if (owningUid >= 0 && UserHandle.isSameApp(uid, owningUid)) {

return PackageManager.PERMISSION_GRANTED;

}

// If the target is not exported, then nobody else can get to it.

if (!exported) {

/*

RuntimeException here = new RuntimeException("here");

here.fillInStackTrace();

Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid,

here);

*/

return PackageManager.PERMISSION_DENIED;

}

if (permission == null) {

return PackageManager.PERMISSION_GRANTED;

}

try {

return AppGlobals.getPackageManager()

.checkUidPermission(permission, uid);

} catch (RemoteException e) {

// Should never happen, but if it does... deny!

Slog.e(TAG, "PackageManager is dead?!?", e);

}

return PackageManager.PERMISSION_DENIED;

}

对于普通应用将通过PackageManagerService中保持的信息进行判断是否具有相应的权限;

base/services/core/java/com/android/server/pm/PackageManagerService.java

@Override

public int checkUidPermission(String permName, int uid) {

synchronized (mPackages) {

Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));

if (obj != null) {

GrantedPermissions gp = (GrantedPermissions)obj;

if (gp.grantedPermissions.contains(permName)) {

return PackageManager.PERMISSION_GRANTED;

}

} else {

ArraySet perms = mSystemPermissions.get(uid);

if (perms != null && perms.contains(permName)) {

return PackageManager.PERMISSION_GRANTED;

}

}

}

return PackageManager.PERMISSION_DENIED;

}

每次开机系统PackageManagerService都会还原现有app的安装信息,这些信息被放在/data/system/packages.xml里,由mSettings管理。另外/data/system/packages.list记录了app的uid和数据路径等信息。

android 检测过程,Android 系统对permision的检测过程相关推荐

  1. 【手把手AI项目】八、MobileNetSSD通过Ncnn前向推理框架在Android端的使用--Cmake编译(目标检测 objection detection)

    一.前言 安装win10+linux-Ubuntu16.04的双系统(超细致) ubuntu16.04+caffe+CUDA10.0+cudnn7.4+opencv2.4.9.1+python2.7 ...

  2. Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误

    前言 想必大家曾经被各种Native Crash折磨过,本地测试没啥问题,一到线上或者自动化测试就出现各种SIGSEGV.SIGABRT.SIGILL.SIGBUS.SIGFPE异常,而且堆栈还是崩溃 ...

  3. Android实现红绿灯检测(含Android源码 可实时运行)

    Android实现红绿灯检测(含Android源码 可实时运行) 目录 Android实现红绿灯检测(含Android源码 可实时运行) 1. 前言 2. 红绿灯检测数据集说明 3. 基于YOLOv5 ...

  4. Android开发之虹软人脸识别活体检测基本步骤

    首先,我简单说下虹软的人脸识别基本步骤: 1.你的设置好设置视频模式方向用于人脸检测 有如下几个可设置方向 //设置视频模式全方向人脸检测ConfigUtil.setFtOrient(this, Fa ...

  5. 2D Pose人体关键点实时检测(Python/Android /C++ Demo)

    2D Pose人体关键点实时检测(Python/Android /C++ Demo) 目录 2D Pose人体关键点实时检测(Python/Android /C++ Demo) 1.人体关键点数据集 ...

  6. Android实现蓝牙(BlueTooth)设备检测连接

    项目要求实现蓝牙设备搜索连接,Android为蓝牙技术提供了4个工具类,分别是蓝牙适配器BluetoothAdapter.蓝牙设备BluetoothDevice.蓝牙服务端套接字BluetoothSe ...

  7. android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio

    实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...

  8. android 人脸检测 对焦,Android API教程:人脸检测(上)

    通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是    android.media.FaceDetector和android.media.FaceDet ...

  9. android手机系统检测工具下载,手机设备信息检测软件下载-设备信息检测appv1.0 官方版-腾牛安卓网...

    设备信息检测app,一款好用的手机测评工具.软件支持硬件信息.系统信息.CPU.GPU以及手机内存等信息查询检测,帮助全方位了解手机性能. 官方简介: 设备信息检测软件是一款对手机基本信息的查看包括硬 ...

最新文章

  1. 【java开发系列】—— 集合使用方法
  2. 数据结构(单链表的相关操作)
  3. 微信小程序中处理 获取用户地址的回调
  4. fastdfs原理_搭建分布式文件系统FastDFS集群
  5. SQL 注入竟然把我们的系统搞挂了
  6. XML与HTML区别
  7. mac下解压war包
  8. 目标检测综述(一:历史由来和古典目标检测的出现)
  9. Java Web基础知识之文件上传:文件上传一窥究竟
  10. jq插件,图片或者视频懒加载
  11. hdu-5064(dp)
  12. CAD2016下载AutoCAD2016下载安装详细教程CAD下载
  13. 3g无线图传点到点模式与服务器模式比较,4G网络的几个关键技术指标 - 3G和4G LTE网络架构之间的区别...
  14. 如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据
  15. MFCXTP库读取和写入XML文件
  16. using 用法拾忆
  17. python抢票脚本好用吗_春运到了,带你用python来抢票回家!
  18. Linux软链接的创建 删除 修改
  19. codevs 2832 6个朋友 并查集 解题报告
  20. JS单击/双击编辑功能

热门文章

  1. 使用带有OAuth2的Web应用程序和使用JWT来调用API – WSO2 API Manager
  2. Java中的访问者设计模式–示例教程
  3. 在Apache Hadoop(多节点群集)中运行Map-Reduce作业
  4. Spring范围代理
  5. JavaFX 2 GameTutorial第1部分
  6. mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
  7. c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...
  8. token验证_如何利用 C# 爬取带 Token 验证的网站数据?
  9. 二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例
  10. mysqls压力测试怎么用_MySQL压力测试工具使用