- 浏览: 259109 次
- 性别:
- 来自: 北京
最新评论
-
hzbook:
Devin.Chenzx 写道书中的源代码 和网址现在不能访问 ...
软件管道规则 -
Devin.Chenzx:
书中的源代码 和网址现在不能访问!你们那里有备份么?
软件管道规则 -
hzbook:
fxllong123456 写道加入了Ext4.0的新特性? ...
ExtJS Web应用程序开发指南(第2版)(针对Ext JS 4.0更新) -
fxllong123456:
加入了Ext4.0的新特性? 在哪里能买到啊
ExtJS Web应用程序开发指南(第2版)(针对Ext JS 4.0更新) -
gundumw100:
感觉这本书<Android应用开发揭秘>很垃圾的. ...
移动开发参考书之Android篇
ClipboardService(CBS)是Android系统中的元老级服务了,自Android 1.0起就支持剪贴功能。在Android 4.0中再遇见它时,此功能已有了长足改进。本节将集中讨论CBS中的权限管理。先来回顾一下CBS中和权限管理相关的函数调用。
//copy方设置ClipData在CBS的setPrimaryClip函数中进行: checkDataOwnerLocked(clip, Binder.getCallingUid()); clearActiveOwnersLocked(); //paste方获取ClipData在CBS的getPrimaryClip函数中进行: addActiveOwnerLocked(Binder.getCallingUid(), pkg);
在分析这3个函数之前,先介绍一下Android系统中的URI权限管理。
1. URI权限管理介绍Android系统的权限管理中有一类是专门针对URI的,先来看一个示例,该例来自package/providers/ContactsProvider,在它的AndroidManifest.xml中有如下声明:
[-->AndroidManifest.xml]
<provider android:name="ContactsProvider2" ...... android:readPermission="android.permission.READ_CONTACTS" android:writePermission="android.permission.WRITE_CONTACTS"> ...... <grant-uri-permission android:pathPattern=".*" /> </provider>
这里声明了一个名为ContactsProvider2的ContentProvider,并定义了几个权限声明,下面对其进行解释。
- readPermission:要求调用query函数的客户端必须声明一个use-permission为READ_CONTACTS的权限。
- writePermission:要求调用update或insert函数的客户端必须声明一个use-permission为WRITE_CONTACTS的权限。
- grant-uri-permission:和授权有关。
初识grant-uri-permission时,会觉得它比较难理解,下面通过举例分析帮助读者加深认识。
- Contacts和ContactProvider这两个APP都是由系统提供的程序,而且二者关系紧密,所以Contacts一定会声明use_Permission为READ_CONTACTS和WRITE_CONTACT的权限。如此,Contacts就可以毫无阻碍地通过ContactsProvider来查询或更新数据库了。
- 假设Contacts新增一个功能,将ContactsProvider中的某条数据复制到剪切板。根据前面已介绍过的知识可以知道,Contacts会向剪切板中复制一个URI类型的数据。
- 另外一个程序从剪切板中粘贴(paste)这条数据,由于是URI类型的,所以此程序会通过ContentResolver来查询该uri所指向的数据。但是这个程序却并未声明READ_CONTACTS的权限,所以它查询数据时必然会失败。
或许有人会问,为什么第三个程序不声明相应权限呢?原因很简单,第三个程序不知道自己该声明怎样的权限(除非这两个程序的开发者能互通信息)。本例ContactsProvider设置的读权限是READ_CONTACTS,以后可能换成READ_CONTACTS_EXTEND,第三个程序不太可能知道其中的变化。为了解决类似问题,Android提供了一套专门针对uri的权限管理机制。以这套机制解决示例中权限声明问题的方法是这样的:当第三个程序从剪切板中粘贴数据时,系统会判断是否需要为这个程序授权。当然,系统不会随意授权,而是需要考虑ContactsProvider的情况。因为ContactsProvider声明了grant-uri-permission,所以只要第三个程序所粘贴的URI匹配其中的pathPattern,授权就能成功。倘若ContactsProvider没有声明grant-uri-permission,或者uri不匹配指定的pathPattern,则授权失败。
有了前面介绍的权限管理机制,相信下面CBS中的权限管理理解起来就比较简单了。
提示 感兴趣的读者可阅读SDK安装目录下/docs/guide/topics/security/security.html中关于uri Permission的说明部分。
2. checkDataOwnerLocked函数分析
checkDataOwnerLocked函数的代码如下:
[-->ClipboardService.java::checkDataDwnerLocked]
private final void checkDataOwnerLocked(ClipData data, int uid) { //第二个参数uid为copy方进程的uid final int N = data.getItemCount(); for (int i=0; i<N; i++) { //为每一个item调用checkItemOwnerLocked checkItemOwnerLocked(data.getItemAt(i), uid); } } // checkItemOwnerLocked函数分析 private final void checkItemOwnerLocked(ClipData.Item item, int uid) { if (item.getUri() != null) {//检查uri checkUriOwnerLocked(item.getUri(), uid); } Intent intent = item.getIntent(); //getData函数返回的也是一个uri,因此这里实际上检查的也是uri if (intent != null && intent.getData() != null) { checkUriOwnerLocked(intent.getData(), uid); } }
权限检查就是针对uri的,因为uri所指向的数据可能是系统内部使用或私密的。例如Setting数据中的Secure表,这里的数据不能随意访问。虽然直接使用ContentResolver访问这些数据时系统会进行权限检查,但是由于目前的剪切板服务也支持URI数据类型,所以这里也需要做检查,否则恶意程序就能轻松读取私密信息。
下边来分析checkUriOwnerLocked函数,其代码如下:
[-->ClipboardService.java::checkUriOwnerLocked]
private final void checkUriOwnerLocked(Uri uri, int uid) { ...... long ident = Binder.clearCallingIdentity(); boolean allowed = false; try { /* 调用ActivityManagerService的checkGrantUriPermission函数, 该函数内部将检查copy方是否能被赋予URI_READ权限。如果不允许, 该函数会抛SecurityException异常 */ mAm.checkGrantUriPermission(uid, null, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (RemoteException e) { } finally { Binder.restoreCallingIdentity(ident); } }
根据前面的知识,这里先要检查copy方是否有读取uri的权限。下面来分析paste方的权限管理。
3. clearActiveOwnersLocked函数分析
clearActiveOwnersLocked函数的代码如下:
[-->ClipboardService.java::clearActiveOwnersLocked]
private final void addActiveOwnerLocked(int uid, String pkg) { PackageInfo pi; try { /* 调用PackageManagerService的getPackageInfo函数得到相关信息 然后做一次安全检查,如果PacakgeInfo的uid信息和当前调用的uid不一致, 则抛出SecurityException。这个很好理解,因为paste方可以传递虚假的 packagename,但uid是没法造假的 */ pi = mPm.getPackageInfo(pkg, 0); if (pi.applicationInfo.uid != uid) { throw new SecurityException("Calling uid " + uid + " does not own package " + pkg); } } ...... } //mActivePermissionOwners用来保存已经通过安全检查的package if (mPrimaryClip != null && !mActivePermissionOwners.contains(pkg)) { //针对ClipData中的每一个Item,都需要调用grantItemLocked来检查权限 final int N = mPrimaryClip.getItemCount(); for (int i=0; i<N; i++) { grantItemLocked(mPrimaryClip.getItemAt(i), pkg); }//保存package信息到mActivePermissionOwners mActivePermissionOwners.add(pkg); } } //grantItemLocked分析 private final void grantItemLocked(ClipData.Item item, String pkg) { if (item.getUri() != null) { grantUriLocked(item.getUri(), pkg); } //和copy方一样,这里仅检查uri的情况 Intent intent = item.getIntent(); if (intent != null && intent.getData() != null) { grantUriLocked(intent.getData(), pkg); } }
再来看grantUriLocked的代码:
[-->ClipboardService.java::grantUriLocked]
private final void grantUriLocked(Uri uri, String pkg) { long ident = Binder.clearCallingIdentity(); try { /* 调用ActivityManagerService的grantUriPermissionFromOwner函数, 注意第二个参数传递的是CBS所在进程的uid。该函数内部也会检查权限。 该函数调用成功后,paste方就被授予了对应uri的读权限 */ mAm.grantUriPermissionFromOwner(mPermissionOwner, Process.myUid(), pkg, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (RemoteException e) { } finally { Binder.restoreCallingIdentity(ident); } }
既然有授权,那么客户端使用完毕后就需要撤销授权,这个工作是在setPrimaryClip函数的clearActiveOwnersLocked中完成的。当为剪切板设置新的ClipData时,自然需要将与旧ClipData相关的权限撤销。读者可自行分析clearActiveOwnersLocked函数。
------------------------------
本文节选自《深入理解Android:卷II》第3章“深入理解SystemServer”第3.7.3节:CBS中的权限管理。
【内容简介】
本书是“深入理解Android”系列的第二本,第一本书上市后得到了广大读者的高度评价,在Android开发者社群内口口相传。本书不仅继承了第一本的优点、改正了其在细微处存在的一些不足,而且还在写作的总体思想上进行了创新,更强调从系统设计者的角度去分析Android系统中各个模块内部的实现原理和工作机制。从具体内容上讲,本书的重点是Android Framework的Java层,对Java层涉及的核心模块和服务进行了深入而细致的分析。通过本书,读者不仅能对Android系统本身有更深入的理解,而且还能掌握分析大型复杂源代码的能力。
全书共8章:第1章介绍了阅读本书所需要做的准备工作,包括Android 4.0源码的下载和编译、Eclipse环境的搭建,以及Android系统进程(system_process)的调试等;第2章对Java Binder和MessageQueue的实现进行了深入分析;第3章详细剖析了SystemServer的工作原理,这些服务包括EntropyService、DropboxManagerService、DiskStatsService、DeviceStorageMonitorService、SamplingProfilerService和ClipboardService;第4章对系统中负责Package信息查询和APK安装、卸载、更新等工作的服务PackageManagerService进行了详细分析;第5章则对Android系统中负责电源管理的核心服务 PowerManagerService的原理进行了一番深入的分析;第6章以ActivityManagerService为分析重点,对它的启动、Activity的创建和启动、BroadcastReceiver的工作原理、Android中的进程管理等内容展开了较为深入的研究;第7章对ContentProvider的创建和启动、SQLite、Cursor query和close的实现等进行了深入分析;第8章以ContentService和AccountManagerService为分析对象,介绍了数据更新通知机制的实现,以及账户管理和数据同步等相关知识。
【作者简介】
邓凡平,资深Android开发工程师和系统工程师,热衷于Android源代码的研究,对Android的架构设计和实现原理有非常深刻的认识和理解,应用开发经验也十分丰富。《深入理解Android:卷I》的作者,同时也是“深入理解Andriod”系列图书的总策划。目前就职于国内领先的Android企业中科创达(ThunderSoft),负责Android Framework的开发和维护。喜欢钻研,乐于分享,活跃于CSDN、51CTO和开源中国等专业技术社区,撰写的Android Framework源码分析的系列文章深受读者欢迎。此外,他对Linux内核、C/C++/Python相关的技术,以及高性能网络服务器和多核并行开发等也有一定的研究。
作者博客:http://blog.csdn.net/Innost
【关于本书的各种网址】
豆瓣网:http://book.douban.com/subject/11542973/
互动网:http://product.china-pub.com/3683060
当当网:http://product.dangdang.com/product.aspx?product_id=22840152
卓越网:http://www.amazon.cn/dp/B008RVQMBK
京东网:http://book.360buy.com/11056661.html
发表评论
-
大规模分布式系统架构与设计实战
2014-03-17 16:22 1417在大数据、云计算如 ... -
设计模式之禅(第2版)
2014-03-12 16:10 1661同样是导演,为什么詹姆斯·卡梅隆、史蒂芬·斯皮尔伯格能够制作 ... -
算法心得:高效算法的奥秘
2014-03-10 11:14 1294写代码总会遇到难题, ... -
享有盛誉的R语言图书
2013-05-29 11:29 1390数据挖掘与R语言 http://book.douba ... -
数据挖掘与R语言
2013-04-23 15:06 1426数据挖掘正在改变着 ... -
程序员度量:改善软件团队的分析学
2013-03-11 17:34 1406《程序员度量:改善软 ... -
加微信/转微博,赢华章经典计算机图书
2013-02-28 13:39 914一、如何获赠图书? 满足下面两个条件之一即有机会获赠华章 ... -
社交网站的数据挖掘与分析
2012-02-19 16:29 933关于本书:【互动网 ... -
计算机经典图书样章免费下载【持续更新中……】
2012-01-31 09:03 1022欲关注持续更新的书单,请移步至: http://blog ... -
Linux服务器的优化
2011-11-11 15:27 868Linux服务器的优化 服务器的优化是我们最小化安装系统时应 ... -
计算机经典图书样章免费下载【持续更新中……】
2011-10-10 17:42 912声明:每本电子书的内容并不完整, 均为试读章节 。 ... -
华章IT图书书讯(2011年第9期)
2011-09-27 18:02 809深入理解Android:卷I 结合实际应用 ... -
IT业魂在何方
2011-09-21 09:09 1179《新机器的灵魂》 ... -
近百本精品图书全部免费赠送——仅面向学生
2011-09-08 14:19 1391华章计算机科学丛书,经典伴你成长:从校园到职场 ... -
深入理解Android
2011-09-01 20:12 1072《深入理解Android: ... -
云计算的基础设施服务
2011-08-03 16:11 1324《云计算:企业实施 ... -
对任何希望深入理解C#的程序员来说,这本书都是不容错过的经典书籍
2011-07-27 17:15 938“ 据我的经验,我敢说每个程序员在读这本书的时候都至少会有一 ... -
你学或不学,Java就在那里,不离不弃
2011-07-26 14:24 927【基础篇】 《Java核心技术卷I:基础知识(原书第8版 ... -
ExtJS Web应用程序开发指南(第2版)(针对Ext JS 4.0更新)
2011-07-21 14:40 1699《ExtJS Web应用程序开发指南(第2 ... -
JavaScript权威指南(第6版)》诚征广大读者参与初译稿审校活动!
2011-07-19 10:52 918《JavaScript权威指南(第6版)》英文 ...
相关推荐
1. CBS精益管理:CBS管理是指Continuous Business System,即持续经营系统,是一种旨在持续提升组织运营效率和效果的管理理念和方法。通过实施CBS精益管理,国瓷材料的经营质量得到了显著改善,实现了业绩的有机增长...
综上所述,CIR和CBS作为QoS策略中的两个核心参数,通过合理设置可以有效地管理网络中的数据传输,保证用户在面对不同类型数据传输需求时,既能享受到高效的服务,又不会对整个网络环境造成负面影响。
总结来说,华为话务台CBS计费系统是运营商在电信服务中不可或缺的一部分,它通过高效、精准的计费管理,助力运营商提升服务质量,增强市场竞争力。对于熟悉并掌握这个系统,无论是对于运营商的运维人员还是对于希望...
CBS App3.0是招商银行为了满足集团、企业财务对于移动财资管理的需求,经过近8个月的打磨,全新推出的一款移动财资管理产品。该应用程序可以实现集团所有银行账户资金信息的即时展示,获得既有宏观又有细部的财资...
“第三方系统对接CBS”是指第三方应用与招商银行的“跨银行现金管理平台”(Cross-Banking Solution, CBS)之间的交互过程,这是一项旨在为跨国公司、集团企业、财政事业单位等客户提供综合化资金管理解决方案的服务...
CBS(Component Based Servicing)日志文件是Windows操作系统中用于记录组件服务操作的重要日志,主要涉及系统更新、修补程序安装、驱动程序升级等过程。这些日志对于诊断和解决与系统更新相关的问题非常关键。 当...
CBS数据备份管理软件介绍(ppt文档).ppt
GX53_CBS设备故障管理模块83页.pptx
标题中的“国瓷材料-300285-CBS精益管理改善大年”表明了这是一个关于国瓷材料公司(股票代码300285)在某一年度实施CBS(Cost-Based Management,基于成本的管理)精益管理改进活动的资料集合。精益管理是一种旨在...
本文将详细解析【CBS公司(行业)薪酬管理制度方案】的主要内容。 首先,【总则】明确了薪酬制度的基本原则和适用范围。薪酬包括职员的工资、福利和津贴,遵循对外竞争性、对内公平性和支持职员发展的原则。所有...
AVB Shaper,即Credit-Based Shaping (CBS),是AVB (Audio Video Bridging) 技术中的一个重要组件,主要用于优化音频和视频数据包的传输,确保数据流的平稳和规律,避免短时间内大量数据包的集中发送和长时间的空闲...
总之,TencentCloud SDK for Python的CBS模块为开发者提供了便利的工具,使得在Python环境中管理腾讯云的云硬盘服务变得更加直观和高效。通过熟练掌握这些知识点,开发者可以更好地利用腾讯云的存储资源,实现高效...
1. 使用IAM角色授权,避免在代码中直接暴露密钥信息。 2. 定期检查并更新SDK,以获取最新的功能和安全修复。 3. 在生产环境中,使用异常处理来优雅地处理错误情况。 4. 对于重要操作,如删除或扩容卷,应在执行前...
标题“Excel导出到CBS”涉及的是将Excel电子表格中的数据转换并导入到CBS(可能是中央业务系统或某种特定的数据管理系统)的过程。这个过程通常在需要整合不同来源的数据,进行集中管理和分析时进行。以下是对这个...
在IT行业中,特别是电信业务领域,UVC、CSP、CBS和OCS是核心系统和服务的缩写,它们对于理解整个计费流程至关重要。以下是对这些概念的详细解释以及相关文件内容的概述: 1. UVC(User Verification and Charging)...
cisco cbs350交换机镜像包
* 自动划拨协议管理:用户可以通过CBS系统管理自动划拨协议,包括协议的签订、协议的修改、协议的撤销等。 CBS系统使用指导手册普通用户版提供了CBS系统的使用指导,涵盖了CBS系统的安装、用户登录、密码修改、账户...
标题中的“cbs”指的是Clipboard Manager,一个用于命令行界面管理剪贴板内容的工具。这个工具主要设计用于Windows和Linux操作系统,它是由Rust编程语言编写的,并且支持异步操作,使得在多任务环境下高效地处理剪贴...