【Android源码 栏目提醒】:网学会员为广大网友收集整理了,Android开发指南-框架主题 - 开发文档,希望对大家有所帮助!
Android开发指南-框架主题 清单文件The AndroidManifest.xml File 每个应用程序都有一个AndroidManifest.xml文件一定是这个名字在它的根目录里。
这个清单文件给
Android系统提供了关于这个应用程序的基本信息系统在能运行任何程序代码之前必须知道这些信息。
AndroidManifest.xml主要包含以下功能 命名应用程序的Java包这个包名用来唯一标识应用程序 描述应用程序的组件-活动服务广播接收者以及组成应用程序的内容提供器对实现每个组件和公布其能力比如能处理哪些意图消息的类进行命名。
这些声明使得
Android系统了解这些组件以及在什么条件下可以被启动 决定应用程序组件运行在哪个进程里面 声明应用程序所必须具备的权限用以访问受保护的部分API以及和其它应用程序交互 声明应用程序其他的必备权限用以组件之间的交互 列举测试设备Instrumentation类用来提供应用程序运行时所需的环境配置及其他信息这些声明只在程序开发和测试阶段存在发布前将被删除 声明应用程序所要求的
Android API的最低版本级别 列举application所需要链接的库 清单文件结构Structure of the Manifest File 下面的图表显示了清单文件的基本结构以及它能包含的所有元素。
每个元素和它所有的属性在一个单独的文件中完整描述。
要查看任何元素的细节信息可在图表下方的以字符序排列的元素列表中点击其元素名称。
ltxml versionquot1.0quot encodingquotutf-8quotgt ltmanifestgt ltuses-permission /gt ltpermission /gt ltpermission-tree /gt ltpermission-group /gt ltinstrumentation /gt ltuses-sdk /gt ltapplicationgt ltactivitygt ltintent-filtergt ltaction /gt ltcategory /gt ltdata /gt lt/intent-filtergt ltmeta-data /gt lt/activitygt ltactivity-aliasgt ltintent-filtergt . . . lt/intent-filtergt ltmeta-data /gt lt/activity-aliasgt ltservicegt ltintent-filtergt . . . lt/intent-filtergt ltmeta-data/gt lt/servicegt ltreceivergt ltintent-filtergt . . . lt/intent-filtergt ltmeta-data /gt lt/receivergt ltprovidergt ltgrant-uri-permission /gt ltmeta-data /gt lt/providergt ltuses-library /gt ltuses-configuration /gt lt/applicationgt lt/manifestgt 所有清单文件中可能出现的元素按字符序排列如下。
只有这些元素是合法的你不能添加自己的元素或属性 ltactiongt ltactivitygt ltactivity-aliasgt ltapplicationgt ltcategorygt ltdatagt ltgrant-uri-permissiongt ltinstrumentationgt ltintent-filtergt ltmanifestgt ltmeta-datagt ltpermissiongt ltpermission-groupgt ltpermission-treegt ltprovidergt ltreceivergt ltservicegt ltuses-configurationgt ltuses-librarygt ltuses-permissiongt ltuses-sdkgt 文件约定File Conventions 下面是一些清单文件中适用于所有元素和属性的约定和规则 元素Elements 在所有的元素中只有ltmanifestgt和ltapplicationgt是必需的且只能出现一次。
很多其他元素可以出现多次甚或一次都没有-尽管如果清单文件想要完成一些有意义的工作必须设置至少其中的一些。
如果一个元素包含点什么那就是包含其他元素。
所有的值必须通过属性来设置而不是元素中的字符数据。
同一级别的元素一般是没有顺序的。
比如ltactivitygt ltprovidergt 和ltservicegt 元素可以以任意顺序混合使用。
ltactivity-aliasgt元素是个例外它必须跟在该别名所指的ltactivitygt后面。
属性Attributes 正规意义上所有的属性都是可选的但实际上有些属性是必须为一个元素指定来完成其目标。
把这篇文档当作一个指南。
对于那些真正可选的属性即使不存在一个规格也会有默认的数值或状态。
除了根元素ltmanifestgt的一些属性所有其他元素属性的名字都是以
android:作为前缀的-比如
android:alwaysRetainTaskState。
因为这个前缀是通用的这篇文档提及属性名称时一般会忽略它。
声明类名Declaring class names 很多对应于Java对象的元素包括应用程序自己ltapplicationgt元素以及它的基础组件-活动ltactivitygt服务ltservicegt广播接收器ltreceivergt以及内容提供器ltprovidergt。
如果你定义一个子类就像你将经常为组件类Activity Service BroadcastReceiver 和ContentProvider所做的那样这个子类通过一个名字属性来声明。
这个名字必须包含完整的包名称。
比如一个服务Service子类可能会声明如下 ltmanifest . . . gt ltapplication . . . gt ltservice
android:namequotcom.example.project.SecretServicequot . . . gt . . . lt/servicegt . . . lt/applicationgt lt/manifestgt 不过作为类名的简写如果这个字符串的第一个字符是一个点号“.”那么这个字符串将被扩展到应用程序包名的后面正如ltmanifestgt元素的package属性所指明的那样。
下面这个赋值和上面效果一样 ltmanifest packagequotcom.example.projectquot . . . gt ltapplication . . . gt ltservice
android:namequot.SecretServicequot . . . gt . . . lt/servicegt . . . lt/applicationgt lt/manifestgt 当启动一个组件时
Android创建了一个命名子类的实例。
如果没有指定一个子类它创建基类的一个实例。
多数值项Multiple values 如果某个元素有超过一个数值这个元素几乎总是需要被重复声明而不能将多个数值项列举在一个属性中。
比如一个意图过滤器可以列举多个动作 ltintent-filter . . . gt ltaction
android:namequotandroid.intent.action.EDITquot /gt ltaction
android:namequotandroid.intent.action.INSERTquot /gt ltaction
android:namequotandroid.intent.action.DELETEquot /gt . . . lt/intent-filtergt 资源项Resource values 一些属性有能显示给用户的数值-比如活动activity的一个标签和图标。
这些属性的值应该被本地化从一个资源或主题中设置。
当需要引用某个资源时采用如下的表述格式 package:type:name 这里package名称可以被忽略要是资源和应用程序在同一个包里的话type是资源的类型-如quotstringquot或quotdrawablequot-而且name是用来标识特定资源的名字。
例如 ltactivity
android:iconquotdrawable/smallPicquot . . . gt 从主题获取的数据以类似的方式表述不过以而不是开头。
package:type:name 字符串值String values 如果属性值是一个字符串则必须使用双反斜杠来表示escape字符第一个反斜杠起转义字符的作用。
比如n表示换行或uxxxx表示一个Unicode字符。
文件特性File Features 下面的章节描述了一些
Android特性如何被映射到清单manifest文件中。
意图过滤器Intent Filters 应用程序的核心组件活动服务和广播接收器通过意图被激活。
意图是描述期望动作的信息包一个Intent 对象-包括要操作的数据执行该动作的组件类别以及其他有关指令。
Android寻找一个合适的组件来响应这个意图如果需要会启动这个组件一个新的实例并传递给这个意图对象。
组件通过意图过滤器intent filters通告它们所具备的能力-能响应的意图类型。
由于
Android系统在启动一个组件前必须知道该组件能够处理哪些意图那么意图过滤器需要在manifest中以ltintent-filtergt元素指定。
一个组件可以拥有多个过滤器每一个描述不同的能力。
一个显式命名目标组件的意图将会激活那个组件过滤器不起作用。
但是一个没有指定目标的意图只在它能够通过组件过滤器任一过滤器时才能激活该组件。
请查看关于意图和意图过滤器的文档以获取更多信息Intents and Intent Filters. 图标和标签Icons and Labels 许多元素有图标icon和标签label属性。
其中一些还有一个描述description属性可以用更长的解释性文字呈现给用户。
比如ltpermissiongt元素有所有这三个属性因此当用户被询问是否授予一个应用程序请求的权限许可时一个代表权限的图标权限的名称和必定伴有的权限描述会全部被显示给用户。
所有的情况中设置在一个包含元素里的图标和标签会成为该容器所有子元素的缺省设置。
这样在ltapplicationgt元素中设置的图标和标签就是该应用程序每个组件的缺省图标和标签。
类似的为一个组件设置的图标和标签-比如一个ltactivitygt元素-是这个组件ltintent-filtergt元素的缺省值。
如果一个ltapplicationgt元素设置了一个图标但活动及其意图过滤器没有那么程序标签被当作活动和意图过滤器的标签。
当呈现给用户的组件实现一个意图过滤器公告的函数时为这个过滤器设置的图标和标签将被用来代表这个组件。
比如一个设置了quotandroid.intent.action.MAINquot和quotandroid.intent.category.LAUNCHERquot的过滤器公告了一个活动来初始化应用程序-也就是会被显示在应用程序启动器中。
因此设置在过滤器中的图标和标签也就是显示在启动器里的那些图标和标签。
许可Permissions 一个许可permission是代码对设备上数据的访问限制。
这个限制被引入来保护可能会被误用而曲解或破坏用户体验的关键数据和代码。
每个许可被一个唯一的标签所标识。
这个标签常常指出了受限的动作。
例如下面是一些
Android定义的许可
android.permission.CALL_EMERGENCY_NUMBERS
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.DEVICE_POWER 一个功能feature最多只能被一个权限许可保护。
如果一个应用程序需要访问一个需要特定权限的功能它必须在manifest文件中使用ltuses-permissiongt元素来声明这一点。
这样当应用程序安装到设备上时安装器可以通过检查签署应用程序认证的机构来决定是否授予请求的权限在某些情况下会询问用户。
如果权限已被授予那应用程序就能够访问受保护的功能特性。
如果没有访问将失败但不会给用户任何通知。
应用程序还可以通过权限许可来保护它自己的组件活动服务广播接收器和内容提供器。
它可以利用
Android已经定义列在
android.Manifest.permission里或其他应用程序已声明的权限许可。
或者定义自己的许可。
一个新的许可通过ltpermissiongt元素声明。
比如一个活动可以用下面的方式保护 ltmanifest . . . gt ltpermission
android:namequotcom.example.project.DEBIT_ACCTquot . . . /gt . . . ltapplication . . .gt ltactivity
android:namequotcom.example.project.FreneticActivityquot . . . gt
android:permissionquotcom.example.project.DEBIT_ACCTquot . . . gt . . . lt/activitygt lt/applicationgt . . . ltuses-permission
android:namequotcom.example.project.DEBIT_ACCTquot /gt . . . lt/manifestgt 注意在这个例子里这个DEBIT_ACCT 许可并非仅仅在ltpermissiongt元素中声明它同样声明在ltuses-permissiongt元素里。
为了应用程序的其他组件可以启动这个受保护的活动必须请求它的使用use即使这个保护是应用程序自己引入的。
如果就在这个例子里这个permission 属性被设置为在其他地方声明的权限许可例如
android.permission.CALL_EMERGENCY_NUMBERS它将不需要再次声明它但是它仍然需要通过ltuses-permissiongt来请求它的使用。
这个ltpermission-treegt 元素为一组想在代码中定义的权限许可声明了一个命名空间。
而ltpermission-groupgt 元素为一系列许可定义了一个标签用ltpermissiongt元素定义在manifest中的以及其他地方声明的。
它仅仅影响这些权限许可在显示给用户时如何分组。
ltpermission-groupgt 元素并不指明哪个权限属于这个分组它只是给这个组命名。
一个权限许可通过给ltpermissiongt元素的permissionGroup属性赋予这个组名来放置到这个权限组中。
库Libraries 每个应用程序都链接到缺省的
Android库这个库包含了基础应用程序开发包实现了基础类如活动服务意图视图按钮应用程序内容提供器等等 然而一些包处于它们自己的库中。
如果你的应用程序使用了其他开发包中的代码它必须显式的请求链接到它们。
这个manifest必须包含一个单独的ltuses-librarygt元素来命名每一个库。
安全和许可Security and Permissions
Android是一个多进程系统每个应用程序以及系统的部分运行在它自己的进程里。
大多数程序和系统之间的安全性通过基础的Linux机制在进程级别进行支持如分配给应用程序的用户和群组IDs。
更多细化的安全特性通过“许可”机制来提供它实施对一个进程能够执行的特定操作方面的限制和对于每个URI的特定数据段的特许访问的授权。
安全架构Security Architecture
Android安全架构中的一个设计要点是在默认情况下应用程序没有权限执行对其它应用程序、操作系统或用户有害的操作。
这些操作包括读/写用户的隐私数据例如联系方式或e-mail读/写其它应用程序的文件执行网络访问保持设备激活等等。
应用程序的进程是一个安全的沙箱。
它不能干扰其它应用程序除非明确声明它需要额外的基本的沙箱不能提供的功能的许可权。
这些许可权请求能够被不同方式的操作所处理常见的是基于证书和用户提示的自动允许或禁止。
应用程序的权限请求被声明为静态的这样后面在安装时能够知道它们而且不会被改变。
应用程序签名Application Signing 所有的
Android应用程序.apk文件必须用证书进行签名认证而这个证书的私钥是由开发者保有的。
该证书可以用以识别应用程序的作者。
该证书也不需要被认证机构签名。
Android应用程序完全允许而且一般也都是使用自签名self-signed证书。
证书是用于在应用程序之间建立信任关系而不是用于控制程序是否可以安装。
签名影响安全性的最重要的方式是通过决定谁可以进入基于签名的许可以及谁可以共享用户IDs。
用户IDs和文件访问User IDs and File Access 每一个
Android应用程序.apk文件都会在安装时就分配一个独有的Linux用户ID这就为它建立了一个沙盒使其不能与其他应用程序进行接触也不会让其它应用程序接触它。
这个用户ID会在安装时分配给它并在该设备上一直保持同一个数值。
由于安全性限制措施是发生进程级所以两个package中的代码不会运行在同一个进程当中他们要作为不同的Linux用户出现。
我们可以通过使用AndroidManifest.xml文件中的manifest标签中的sharedUserId属性来使不同的package共用同一个用户ID。
通过这种方式这两个package就会被认为是同一个应用程序拥有同一个用户ID实际不一定并且拥有同样的文件存取权限。
注意为了保持安全只有当两个应用程序被同一个签名签署的时候并且请求了同一个sharedUserId才会被分配同样的用户ID. 所有存储在应用程序中的数据都会赋予一个属性-该应用程序的用户ID这使得其他package无法访问这些数据。
当通过这些方法getSharedPreferencesString int openFileOutputString int 或者openOrCreateDatabaseString int SQLiteDatabase.CursorFactory来创建一个新文件时你可以通过使用MODE_WORLD_READABLE与/或MODE_WORLD_WRITEABLE标志位来设置是否允许其他package来访问读写这个文件。
当设置这些标志位时该文件仍然属于该应用程序但是它的全局读写权限已经被设置使得它对于其他任何应用程序都是可见的。
使用许可Using Permissions 一个基本的
Android程序通常是没有任何许可与之关联的这就是说它不能做任何扰乱用户或破坏数据的勾当。
那么为了使用设备被保护的特性我们就必须在AndroidManifest.xml添加一个或多个ltuses-permissiongt标签用以声明你的应用程序需要的许可。
例如一个想要监控接收短消息的应用程序需要指定 ltmanifest xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot packagequotcom.
android.app.myappquot gt ltuses-permission
android:namequotandroid.permission.RECEIVE_SMSquot /gt lt/manifestgt 在应用程序安装时该应用程序请求的权限许可是通过package installer来授予的。
package installer是通过检查该应用程序的签名和/或用户的交换结果来确定是否给予该程序request的权限。
在用户使用过程中不会去检查权限也就是说要么在安装的时候就批准该权限使其按照设计可以使用该权限要么就不批准这样用户也就根本无法使用该feature也不会有任何提示告知用户尝试失败。
很多时候 一个许可失败会导致一个SecurityException被抛回该应用程序. 但是
Android并不保证这种情况会处处发生。
例如当数据被deliver到每一个receiver的时候sendBroadcastIntent 方法会去检查permissions在这个方法调用返回之后你也不会收到任何exception。
几乎绝大多数情况一个permission failure都会打印到log当中。
Android系统定义的权限可以在Manifest.permission中找到。
任何一个程序都可以定义并强制执行自己独有的permissions因此Manifest.permission中定义的permissions并不是一个完整的列表即有肯能有自定义的permissions。
一个特定的许可可能会在你的程序操作过程中的很多地方都被实施 当系统有来电的时候用以阻止程序执行其它功能。
当启动一个活动activity的时候会阻止应用程序启动其它应用程序的Acitivity。
在发送和接收广播的时候去控制谁可以接收你的广播或谁可以发送广播给你。
当进入并操作一个内容提供器content provider的时候 当绑定或起动一个服务service的时候 声明和实施许可Declaring and Enforcing Permissions 为了实施你自己的permissions你必须首先在AndroidManifest.xml文件中声明该permissions.通常我们通过使用一到多个ltpermissiongt tag来进行声明。
例如一个应用程序想要控制谁能启动它的活动可以为该操作声明许可如下 ltmanifest xmlns:androidquothttp://schemas.
android.com/apk/res/androidquot packagequotcom.me.app.myappquot gt ltpermission
android:namequotcom.me.app.myapp.permission.DEADLY_ACTIVITYquot
android:labelquotstring/permlab_deadlyActivityquot
android:descriptionquotstring/permdesc_deadlyActivityquot
android:permissionGroupquotandroid.permission-group.COST_MONEYquot
android:protectionLevelquotdangerousquot /gt lt/manifestgt 这里ltprotectionLevelgt属性是必需的通过声明该属性我们就可以告知系统如何去通知用户哪些应用程序需要这个许可或者谁可以拥有该许可。
具体请参看链接的文档。
ltpermissionGroupgt属性是可选的只是用于帮助系统显示许可permission给用户实际是告知系统该许可是属于哪个许可组permission group的。
你通常会选择使用标准的system group来设定该属性或者更为少见的用你自己定义的group。
推荐使用一个已经存在的group因为这样UI给用户显示许可的时候会更简单。
需要注意的是标签label和描述description都是需要为许可提供的。
这些都是字符串资源当用户去看许可列表
android:label或者某个许可的详细信息
android:description时这些字符串资源就可以显示给用户。
label应当尽量简短之需要告知用户该许可是在保护什么功能就行。
而description可以用于具体描述获取该许可的程序可以做哪些事情实际上让用户可以知道如果他们同意程序获取该权限的话该程序可以做什么。
我们通常用两句话来描述许可第一句描述该许可第二句警告用户如果批准该权限会可能有什么不好的事情发生。
下面是一个描述CALL_PHONE 许可的label和description的例子 ltstring namequotpermlab_callPhonequotgtdirectly call phone numberslt/stringgt ltstring namequotpermdesc_callPhonequotgtAllows the application to call phone numbers without your intervention. Malicious applications may cause unexpected calls on your phone bill. Note that this does not allow the application to call emergency numbers.lt/stringgt.
上一篇:
Android版代码走查情况报告
下一篇:
论坛系统net_sql2008