android p 权限控制,android 权限控制

android6 的权限分为几个级别,普通的第三方应用一般会用到 normal dangerous 。系统应用可能会用到 signature|system signature|privileged signature,详细的信息在Manifest中定义

vim frameworks/base/core/res/AndroidManifest.xml

其中,只有定义为dangerous 的才会要求”检查权限”,normal级别的,只要在应用的Manifest中有声明,就会自动允许。所以一般开发者要重地关注dangerous的权限.

“检查权限” 是这样的,

1,如果设备运行的是 Android 5.1(API 级别 22)或更低版本,并且应用的 targetSdkVersion 是 22 或更低版本,则系统会在安装时要求用户授予权限

2,targetSdkVersion>=23 && 设备系统是android6+。需要动态申请

3,动态申请 之后,用户会允许或者拒绝,拒绝的话,就不能使用相关功能,强行调用的话,会抛出SerurityException

dangerous的权限有:

权限组

权限

CALENDAR

READ_CALENDAR 、WRITE_CALENDAR

CAMERA

CAMERA

CONTACTS

READ_CONTACTS、WRITE_CONTACTS、GET_ACCOUNTS

LOCATION

ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION

MICROPHONE

RECORD_AUDIO

PHONE

READ_PHONE_STATE、CALL_PHONE、READ_CALL_LOG、WRITE_CALL_LOG、ADD_VOICEMAIL、USE_SIP、PROCESS_OUTGOING_CALLS

SENSORS

BODY_SENSORS

SMS

SEND_SMS、RECEIVE_SMS、READ_SMS、RECEIVE_WAP_PUSH、RECEIVE_MMS

STORAGE

READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE

好了,游戏规则就是这样。从应用开发者来说,github上也有不少辅助的第三方库,直接拿来用就可以了。颗粒度的控制权限,当然对用户来说是好事。

背景介绍完

不过每开一个app就要弹窗授权什么的,我觉得有点麻烦,所以先看看源码,改一下这个部分的功能。

以静默安装应用为例

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

@Override

public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer,

int installFlags, String installerPackageName, VerificationParams verificationParams,

String packageAbiOverride, int userId) {

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);

final int callingUid = Binder.getCallingUid();

enforceCrossUserPermission(callingUid, userId, true, true, "installPackageAsUser");

// ...

}

enforceCrossUserPermission 里面调用了

mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, message);

绕了几圈,最后是在ActivityManager.java 中落地

vim ./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.

final int appId = UserHandle.getAppId(uid);

if (appId == Process.ROOT_UID || appId == 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;

}

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

@Override

public int checkUidPermission(String permName, int uid) {

final int userId = UserHandle.getUserId(uid);

if (!sUserManager.exists(userId)) {

return PackageManager.PERMISSION_DENIED;

}

synchronized (mPackages) {

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

if (obj != null) {

final SettingBase ps = (SettingBase) obj;

final PermissionsState permissionsState = ps.getPermissionsState();

if (permissionsState.hasPermission(permName, userId)) {

return PackageManager.PERMISSION_GRANTED;

}

// Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION

if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState

.hasPermission(Manifest.permission.ACCESS_FINE_LOCATION, userId)) {

return PackageManager.PERMISSION_GRANTED;

}

} else {

ArraySet perms = mSystemPermissions.get(uid);

if (perms != null) {

if (perms.contains(permName)) {

return PackageManager.PERMISSION_GRANTED;

}

if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && perms

.contains(Manifest.permission.ACCESS_FINE_LOCATION)) {

return PackageManager.PERMISSION_GRANTED;

}

}

}

}

return PackageManager.PERMISSION_DENIED;

}

细节代码完

弄通了之后就动手改一下,一开始改的是frameworks/base/core/res/AndroidManifest.xml 一开始,改掉了 STORAGE ,把READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE 的级别都变成了normal,然后存储权限就默认赋予了(PERMISSION_GRANTED), 之后就不会弹窗了。

再改了 SMS 然后系统就起不来了

adb connect 192.168.0.67 && adb shell logcat

报这个错误

09-20 16:16:25.907 5653 5653 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main

09-20 16:16:25.907 5653 5653 E AndroidRuntime: java.lang.SecurityException: Permission android.permission.READ_SMS is not a changeable permission type

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.pm.PackageManagerService.enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(PackageManagerService.java:3468)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.pm.PackageManagerService.grantRuntimePermission(PackageManagerService.java:3501)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.pm.DefaultPermissionGrantPolicy.grantRuntimePermissionsLPw(DefaultPermissionGrantPolicy.java:828)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.pm.DefaultPermissionGrantPolicy.grantDefaultPermissionsToDefaultSmsAppLPr(DefaultPermissionGrantPolicy.java:616)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.grantDefaultPermissionsToDefaultSmsApp(PackageManagerService.java:17006)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.telecom.TelecomLoaderService$TelecomServiceConnection.onServiceConnected(TelecomLoaderService.java:86)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1223)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1240)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at android.os.Looper.loop(Looper.java:148)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:283)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:168)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)

09-20 16:16:25.907 5653 5653 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)

目测是 PackageManagerService.java 抛异常,SystemServer起不来,然后就不停的重启。

待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/426366.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机操作系统(2):OS的发展过程

1.2 OS的发展过程 20世纪50年代中期,第一个简单的批处理系统 60年代中期,多道程序批处理系统,随后出现分时系统 上世纪80年代开始至21世纪初,微型机、多处理机、计算机网络大发展年代→微机OS、多处理机OS和网络OS的形成和大发展…

创建好centos7虚拟机之后连xshell连不上虚机

创建好虚拟机之后配置都已经配置完成了selinux,防火墙都关了准备用xshell 连接虚拟机报出 然后在网上着了各种资料还是不行,最后将网卡修改为: 修改之后就可以连上了。 当然修改之后会出现两个ip 必须得使用圈起来的ip连才可以,用…

android滑动开关框架,Android之实现滑动开关组件

由于Android并未提供滑动开关之类的组件,所以我们需要自己去实现一个自定义的视图组件来实现滑动开关效果。这里有一个示例代码,它包括三个类:开关组件视图、状态监听接口、MainActivity我们先来看看整个demo的效果图:我们先来看看…

计算机操作系统(3):操作系统的基本特征

1.3 操作系统的基本特征 1.3.1 并发(Concurrence) 并行与并发: 并行性——两个或多个事件在同一时刻发生 并发性——两个或多个事件在同一时间间隔内发生 在多道程序环境下,并发性是指在一段时间内,宏观上有多…

最简单的docker教程:在docker里运行nginx服务器

命令行docker search nginx搜索名为nginx的docker image,返回结果的第一个,github上有10293个star,这就是我们想要搜索的结果: 使用命令docker pull把这个镜像拖下来: docker pull nginx 然后以detach模式运行这个镜像…

okhttp3 请求html页面,OkHttp3源码详解(二) 整体流程

1.简单使用同步:Override public Response execute() throws IOException {synchronized (this) {if (executed) throw new IllegalStateException("Already Executed");executed true;}try {client.dispatcher().executed(this);Response result getRe…

H5实现轮播

页面代码&#xff1a; <div id"body_wrapper" class"container"><article><section id"lunbotu"><div class"wrap"><div id"slide-holder"><div id"slide-runner"><a hre…

计算机操作系统(4):操作系统的重要功能

1.4 操作系统的主要功能 处理机管理功能 存储器管理功能 设备管理功能 文件管理功能 用户接口 1处理机管理功能 也可称为进程管理在传统的多道程序设计系统中&#xff0c;处理机的分配和运行&#xff0c;都是以进为基本单位的&#xff0c;因而对处理机的管理&#xff0…

html5本地存储论坛,Web Storage--HTML5本地存储

什么是Web StorageWeb Storage是HTML5里面引入的一个类似于cookie的本地存储功能&#xff0c;可以用于客户端的本地存储&#xff0c;其相对于cookie来说有以下几点优势&#xff1a;存储空间大&#xff1a;cookie只有4KB的存储空间&#xff0c;而Web Storage在官方建议中为每个网…

计算机操作系统(5):操作系统的结构设计

1.5 操作系统的结构设计 OS的结构经历了四代变革&#xff1a; 微内核OS结构——现代OS结构 微内核结构能有效地支持多处理机运行&#xff0c;故非常使用于分布式系统环境。 Windows NT采用微内核结构 在与微内核技术发展的同时&#xff0c;客户/服务器技术、面向对象技术…

Linux软链接和硬链接

Linux软链接和硬链接 1. 软链接link 定义&#xff1a;就是windows系统的快捷方式 作用&#xff1a;可以对硬盘空间进行合理分配 具体设置&#xff1a; ln -s 源文件 软链接 1.1 软链接使用注意 ① 设置软链接&#xff0c;如果软链接和源文件不在同一级目录&#xff0c;原…

编写HTML提高编写代码的效率,优化innerHTML操作(提高代码执行效率)

例子&#xff1a;我们要实现的效果是当用户点击鼠标的时候&#xff0c;就在旧数据上追加若干新数据。如果使用标准DOM的话&#xff0c;完整代码如下&#xff1a;testdatadocument.onmousedown function() {for (var i 0; i < 10; i) {var p document.createElement("…

计算机操作系统(6):练习题

1&#xff0e;计算机操作系统的功能是 d 。 A. 把源程序代码转换为目标代码 B. 实现计算机用户之间的相互交流 C. 完成计算机硬件与软件之间的转换 D. 控制、管理计算机系统的资源和程序的执行 2&#xff0e;____a__不是分时系统的特点。 A&#xff0e;多个用户是…

router锚点和html锚点,hash模式下Vue-router页面返回锚点(scroll behavior)实现

在普通页面中&#xff0c;点击浏览器的返回按钮&#xff0c;在返回到上一页时会处在上次浏览的位置。单页面应用中&#xff0c;由于始终是同一个页面&#xff0c; 因此需要自行实现页面返回时的锚点。Vue-router的Scroll Behavior可以用于解决这个问题&#xff0c;但是只能应用…

医疗:OA(6)

办公自动化&#xff08;Office Automation&#xff0c;简称OA&#xff09;&#xff0c;是将计算机、通信等现代化技术运用到传统办公方式&#xff0c;进而形成的一种新型办公方式。办公自动化利用现代化设备和信息化技术&#xff0c;代替办公人员传统的部分手动或重复性业务活动…

高中计算机教师招聘试题,中小学信息技术教师招聘考试真题及答案.doc

中小学信息技术教师招聘考试真题及答案一、选择题(60个)1、网页都是按照一种描述文档的标记规则编写而成的&#xff0c;这套标记规则叫做&#xff1a;CA、URLB、HTTPC、HTMLD、FTP2、Basic语言属于&#xff1a;CA、机器语言B、汇编语言C、高级语言D、低级语言3、下列哪一个控件…

项目管理(3):备战pmp

1组织结构与项目管理 2职能型组织的优缺点 优点 简单对专家更易于管理&#xff0c;管理更具灵活性只向一个上司汇报项目人员有“家”——他们在部门里工作&#xff0c;部门给予相应的技术支持员工可以不断得到提高缺点 项目经理没有足够的权力没有明确的责任人客户可能找不到专…

【leetcode】16 3Sum Closest

描述 给定一个数字集合 S 以及一个数字 target&#xff0c;需要从集合中找出3个数字的和与这个 target的值最接近&#xff08;绝对值最小&#xff09; 样例 Input: S [-1, 2, 1, -4], target 1Output: 2 思路 首先排序&#xff0c;之后确定一个数字的前提下&#xff0c;再利用…

计算机组装维护教学总结,计算机组装与维护教学总结.doc

计算机组装与维护教学总结《计算机组装与维修》教学总结《计算机组装与维修》是职业学校计算机应用专业的一门主干专业课程.本课程是实践性较强的理论课程,其主要任务是使学生了解计算机各部件的分类、性能、选购方法,理解各主要部件的硬件结构、相互联系和作用,使学生掌握计算…

项目管理(4):备战pmp

1单个项目管理过程 如何实现项目管理&#xff1f; 通过“过程”processes实现 大多数情况下&#xff0c;大多数项目都有共同的项目管理过程 项目管理知识提供的是good practice 应用这些过程能大大提高项目成功的机会 项目经理与项目团队的责任 确定哪些过程适用于具体给…