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起不来,然后就不停的重启。

待续

android p 权限控制,android 权限控制相关推荐

  1. android p 权限流程,Android native 权限控制流程

    关联文章: 前言: 在 Android Runtime Permission 详解 中详细的说明了permission 在Android 6.0 前后的区别,对于M 以后应用可以通过checkPerm ...

  2. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...

    QtScrcpy QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备,并进行显示和控制.不需要root权限. 单个应用程序最多支持16个安卓设备同时连接. 同时支持GNU/Li ...

  3. 蓝牙权限管理android,基于蓝牙与Android设备的控制系统设计

    3 Android设备软件设计本文引用地址:http://www.eepw.com.cn/article/264461.htm Android2.2版本以上才能很好的支持蓝牙功能,Android上的应 ...

  4. 【android】五种控制Android应用的权限的方法

    转自:http://www.cnbeta.com/articles/181913.htm 1  为什么Android总是事无巨细地告诉你应用索取的每一项权限? 相比Apple,Microsoft严格控 ...

  5. 五种控制Android应用的权限的方法

     这篇文章目的在于介绍Android系统上控制权限的方法,读者只要使用过Android,或是对智能机平台有所了解,就能看懂,不需要专门的编程知识. 1  为什么Android总是事无巨细地告诉你应 ...

  6. Android 在运行时请求权限

    2019独角兽企业重金招聘Python工程师标准>>> 从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予.此方法可以简化 ...

  7. Android pms权限管理,Android权限机制

    为什么有权限机制 我们知道 Android 应用程序是沙箱隔离的,每个应用都有一个只有自己具有读写权限的专用数据目录.但是如果应用要访问别人的组件或者一些设备上全局可访问的资源,这时候权限机制就能系统 ...

  8. Android应用程序获得root权限

    我在博文<Android程序的安全系统>中提到两种让root权限的办法.最近在网上发现很多朋友转载那篇文章,但是对那篇文章中提到的第一种方法怎样实现,不是很明白.本文将会以一个例子实现来演 ...

  9. 使用adb命令控制Android

    adb shell input text hello //把hello这个内容传到有焦点的EditText之类的控件上 adb shell input keyevent 3 //相当于按下home键, ...

最新文章

  1. java编程赋值运算符_跟我学java编程—简单赋值运算符“=”
  2. 自动刷新获取wifi信号强度,android
  3. Hive:表1inner join表2结果group by优化
  4. Lambda省略格式Lambda使用前提
  5. Leecode15. 三数之和——Leecode大厂热题100道系列
  6. 【LINQ】LINQ 简介
  7. 第三代搜索推出的专题是什么?
  8. 如何解决Maple的应用在数学中
  9. svnserver 重新启动
  10. Mac下修改HD3000显存到1GB
  11. Django之验证码(十七)
  12. 厦门大学研究生计算机复试分数线,关于2018厦门大学研究生考试复试分数线的一些公告...
  13. win7上安装DDK,SDK。。
  14. iptables实现华为云服务器无公网IP上网
  15. 实验吧-CTF-web-头有点大貌似有点难看起来有点难(学习笔记)
  16. 网络基础知识问答梳理
  17. 羡青山有思,白鹤忘机。—第四十八天
  18. sharepoint 2010 如何给讨论板(Discussion)话题添加回复(Reply)信息(Message)
  19. 南京理工大学matlab怎么弄,基于MATLAB/SimDriveline 的某型军用车辆 起步过程仿真研究...
  20. 职业精神:薪水到底谁来决定

热门文章

  1. VM虚拟机不能上网的问题解决
  2. 【iOS开发每日小笔记(二)】gitHub上的开源“瀑布流”使用心得
  3. 批量下载baidu音乐主页的歌曲
  4. Zend Framework(一)概述介绍
  5. avi和音频合成 ffmpeg_使用Java和ffmpeg把音频和视频合成视频的操作方法
  6. 地贝扫地机器人维修_扫地机器人常见故障及维修方法
  7. MacOS 升级后出现 xcrun: error: invalid active developer path, missing xcrun
  8. Stack Overflow
  9. linux 以某个用户执行,Linux root用户肿么以制定的用户去执行某个程序。
  10. c语言mergesort 参数,归并排序C语言兑现MergeSort