android 检测过程,Android 系统对permision的检测过程
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的检测过程相关推荐
- 【手把手AI项目】八、MobileNetSSD通过Ncnn前向推理框架在Android端的使用--Cmake编译(目标检测 objection detection)
一.前言 安装win10+linux-Ubuntu16.04的双系统(超细致) ubuntu16.04+caffe+CUDA10.0+cudnn7.4+opencv2.4.9.1+python2.7 ...
- Android稳定性系列-01-使用 Address Sanitizer检测原生代码中的内存错误
前言 想必大家曾经被各种Native Crash折磨过,本地测试没啥问题,一到线上或者自动化测试就出现各种SIGSEGV.SIGABRT.SIGILL.SIGBUS.SIGFPE异常,而且堆栈还是崩溃 ...
- Android实现红绿灯检测(含Android源码 可实时运行)
Android实现红绿灯检测(含Android源码 可实时运行) 目录 Android实现红绿灯检测(含Android源码 可实时运行) 1. 前言 2. 红绿灯检测数据集说明 3. 基于YOLOv5 ...
- Android开发之虹软人脸识别活体检测基本步骤
首先,我简单说下虹软的人脸识别基本步骤: 1.你的设置好设置视频模式方向用于人脸检测 有如下几个可设置方向 //设置视频模式全方向人脸检测ConfigUtil.setFtOrient(this, Fa ...
- 2D Pose人体关键点实时检测(Python/Android /C++ Demo)
2D Pose人体关键点实时检测(Python/Android /C++ Demo) 目录 2D Pose人体关键点实时检测(Python/Android /C++ Demo) 1.人体关键点数据集 ...
- Android实现蓝牙(BlueTooth)设备检测连接
项目要求实现蓝牙设备搜索连接,Android为蓝牙技术提供了4个工具类,分别是蓝牙适配器BluetoothAdapter.蓝牙设备BluetoothDevice.蓝牙服务端套接字BluetoothSe ...
- android openCV检测图像的基本特征,包括Canny边缘检测、Harris角点检测、霍夫直线检测-基于Android studio
实现平台:windows下的Android studio1.4 依赖库:openCV3.1.0 程序安装平台:Android6.0 实现的功能:从手机中选择一张图片,检测图片的基本特征,通过menu菜 ...
- android 人脸检测 对焦,Android API教程:人脸检测(上)
通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是 android.media.FaceDetector和android.media.FaceDet ...
- android手机系统检测工具下载,手机设备信息检测软件下载-设备信息检测appv1.0 官方版-腾牛安卓网...
设备信息检测app,一款好用的手机测评工具.软件支持硬件信息.系统信息.CPU.GPU以及手机内存等信息查询检测,帮助全方位了解手机性能. 官方简介: 设备信息检测软件是一款对手机基本信息的查看包括硬 ...
最新文章
- 【java开发系列】—— 集合使用方法
- 数据结构(单链表的相关操作)
- 微信小程序中处理 获取用户地址的回调
- fastdfs原理_搭建分布式文件系统FastDFS集群
- SQL 注入竟然把我们的系统搞挂了
- XML与HTML区别
- mac下解压war包
- 目标检测综述(一:历史由来和古典目标检测的出现)
- Java Web基础知识之文件上传:文件上传一窥究竟
- jq插件,图片或者视频懒加载
- hdu-5064(dp)
- CAD2016下载AutoCAD2016下载安装详细教程CAD下载
- 3g无线图传点到点模式与服务器模式比较,4G网络的几个关键技术指标 - 3G和4G LTE网络架构之间的区别...
- 如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据
- MFCXTP库读取和写入XML文件
- using 用法拾忆
- python抢票脚本好用吗_春运到了,带你用python来抢票回家!
- Linux软链接的创建 删除 修改
- codevs 2832 6个朋友 并查集 解题报告
- JS单击/双击编辑功能
热门文章
- 使用带有OAuth2的Web应用程序和使用JWT来调用API – WSO2 API Manager
- Java中的访问者设计模式–示例教程
- 在Apache Hadoop(多节点群集)中运行Map-Reduce作业
- Spring范围代理
- JavaFX 2 GameTutorial第1部分
- mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
- c++ 箭头符号怎么打_老司机怎么测量三极管管型、管脚和性能?三极管测量此中有深意...
- token验证_如何利用 C# 爬取带 Token 验证的网站数据?
- 二分查找算法举例说明C语言,C语言快速排序与二分查找算法示例
- mysqls压力测试怎么用_MySQL压力测试工具使用