Android - AndroidManifest.xml - Provider

本文详细介绍了Android中内容提供器的配置与使用方法,包括其语法、被包含元素、属性等,帮助开发者更好地理解如何在Android应用中声明及使用内容提供器。

摘自:http://blog.youkuaiyun.com/think_soft/article/details/7582340


语法(SYNTAX):

<providerandroid:authorities="list"
          
android:enabled=["true" | "false"]
          
android:
exported=["true" | "false"]
          
android:
grantUriPermissions=["true" | "false"]
          
android:
icon="drawable resource"
          
android:initOrder="integer"
          
android:label="string resource"
          
android:multiprocess=["true" | "false"]
          
android:
name="string"
          
android:permission="string"
          
android:process="string"
          
android:readPermission="string"
          
android:syncable=["true" | "false"]
          
android:
writePermission="string">
    . . .
</provider>

被包含于(CONTAINED IN):

<application>

能够包含的元素(CAN CONTAIN):

<meta-data>

<grant-uri-permission>

<path-permission>

说明(DESCRIPTION):

这个元素用于声明一个内容提供器,它对应一个ContentProvider类的子类。它提供了对由应用程序管理的数据的结构化的访问。应用程序使用的所有的内容提供器都必须在其清单文件中由<provider>元素来声明。对于那些没有在清单中声明的内容提供器,系统看不到,也不会运行。(只需要声明那些作为该应用程序一部分的来开发的那些内容提供器,而不是那些由应用程序使用的由其他人开发本应用之外的那些内容提供器)。

Android系统通过content:URI的授权部分来识别内容提供器。例如,假设下列的URI要传递给ContentResolver.query()方法:

content://com.example.project.healthcareprovider/nurses/rn

content:表示数据是属于内容提供器的,授权(com.example.project.healthcareprovider):标识着一个具体的提供器。因此授权必须唯一的。通常,就像这个例子一样,授权是一个完整的ContentProvider子类的名称。URI的路径部分被内容提供器用来标识具体的数据子集,但是那些路径没有被声明在清单文件中。

关于使用可开发内容提供器的更多信息,请看内容提供的文档()。

http://blog.youkuaiyun.com/fireofstar/article/details/7307402

属性(ATTRIBUTES):

android:authorities

标识内容提供器范围内的数据URI的授权列表,有多个授权时,要用分号来分离每个授权。为了避免冲突,授权名应该使用Java样式的命名规则(如:com.example.provider.cartoonprovider)。通常,用ContentProvider子类名称来设定这个属性。

这个属性没有默认值,至少要指定一个授权。

android:enabled

这个属性用于指定这个内容提供器是否能够被系统安装。设置为true,则可以安装;否则不能安装。默认值是true。

<application>元素有它自己的enabled属性,这个属性会应用给所有的应用程序组件,包括内容提供器。<application>和<provider>的enabled属性都必须设置为true(它们的默认值都是true)。如果有一个设置为false,那么提供器就被禁止安装。

android:exported

这个属性用于指定该内容提供器是否能够被其他的应用程序组件使用。如果设置为true,则可以被使用,否则不能被使用。如果设置为false,该提供器只对同名的应用程序或有相同用户ID的应用程序有效。默认值是true。

虽然能够使用这个属性来公开内容提供器,但是依然还要用permission属性来限制对它的访问。

android:grantUriPermission

这个属性用于设定那些对内容提供的数据没有访问权限的访问者,是否能够被授予访问的权限,这个权限是临时性的,它会克服由readPermission、writePermission和permission属性的设置限制。如果这个属性设置为true,那么权限就可以授予访问者,否则不会授予没有访问权限的访问者。如果设置为true,则权限可以临时被授予内容提供器的任何数据。如果设置为false,则权限只能被授予<gran-uri-permission>子元素中所列出的数据子集。默认值是false。

这种授权是应用程序提供了一种一次性访问被权限所保护的数据的方法。例如,当一个e-mail包含了一个附件时,mail应用程序就可以调用适当的浏览器来打开附件,即使这个浏览器没有查看所有内容提供器数据的权限。

在这样的场景中,权限是通过激活组件的Intent对象中的FLAG_GRANT_READ_URI_PERMISSION和FLAG_GRANT_WRITE_URI_PERMISSION标记来授予的。例如,mail应用程序可以把FLAG_GRANT_READ_URI_PERMISSION标记放到传递给Context.startActivity()方法的Intent参数中。这样权限就被授予了Intent对象中所指定的URI。

如果要启用这个功能,既可以通过把这个属性设置为true来完成,也可以通过定义<grant-uri-permission>子元素来实现,在切换RUI时,必须调用Context.revokeUriPermission()方法从提供器把权限删除。

android:icon

这个属性用于定义一个代表内容提供器的图标。它必须要引用一个包含图片定义的可绘制资源。如果这个属性没有设置,那么就会使用应用程序的<application>元素的icon属性值来代替。

android:initOrder

这个属性用于定义内容提供器应该被实例化的顺序,这个顺序是相对与相同进程所拥有的其他内容提供器的。当内容提供器间有相互的依赖时,就需要设置这个属性,以确保它们能够按照其依赖的顺序被创建。这个属性值是一个简单的整数,大的数字要被优先初始化。

Android:label

这个属性用于给内容提供器定义一个用户可读的标签。如果这个属性没有设置,那么它会使用<application>元素的label属性值来代替。

这个标签应该引用一个字符串资源来设置,以便它能够像其他的用户界面中的字符串一样被本地化。但是为了方便应用程序的开发,也能够使用原生的字符串来设置这个属性,但正式发布时一定要引用字符串资源。

android:multiprocess

这个属性用于设定是否能够在每个使用该内容提供器的客户端进程中都创建一个内容提供器的实例,如果设置为true,这个能够在其每个客户端进程中创建一个实例,否则不可以。默认值是false。

通常,内容提供器是在定义它的应用程序的进程中被实例化的。但是,如果这个属性被设置为true,系统就能够在每个要与该内容提供器进行交互的客户端进程中创建一个内容提供器的实例,这样就避免了进程间通信的开销。

android:name

这个属性用于定义内容提供器的实现类的名称,它是ContentProvider类的一个子类。这个属性应该使用完整的Java类名来设定(如:com.example.project.TransportationProvider)。但是也可以使用简写(如:.TransporttationProvider),这时系统会使用<manifest>元素中指定的包名跟这个简写名称的组合来识别内容提供器。

这个属性没有默认值,必须要给这个属性设定一个名称。

android:permission

这个属性用于设定客户端在读写内容提供器的数据时必须要有的权限的名称。这个属性为同时设置读写权限提供了一种便利的方法。但是readPermission和writePermission属性的优先级要比这个属性高。如果readPermission属性也被设置了,那么它就会控制对内容提供器的查询访问。如果writePermission属性被设置,它就会控制对内容提供器数据的修改访问。

android:process

这个属性用于定义内容提供器应该运行在那个进程中的进程名称。通常,应用程序的所有组件都运行在给应用程序创建的默认进程中。它有与应用程序包相同的名称。<application>元素的process属性能够给其所有的组件设置一个不同的默认进程。但是每个组件都能够用它们自己的process属性来覆盖这个默认设置,从而允许把应用程序分离到不同的多个进程中。

如果这个属性值是用“:”开头的,那么在需要这个提供器的时候,系统就会给这个应用程序创建一个新的私有进程,并且对应的Activity也要运行在那个私有进程中。如果用小写字母开头,那么Activity则会运行在一个用这个属性值命名的全局进程中,它提供了对内容提供器的访问权限。这样就允许不同应用程序的组件能够共享这个进程,从而减少对系统资源的使用。

android:readPermission

这个属性用于设置查询内容提供器的数据时,客户端所必须要有的权限。

android:syncable

这个属性用于设定内容提供器控制下的数据是否要与服务器上的数据进行同步,如果设置为true,则要同步,否则不需要同步。

android:writePermission

这个属性用于设置修改内容提供器的数据时,客户端所必须要有的权限。

被引入的版本(INTRODUCED IN):

API Level 1


<think>我们正在处理关于AndroidManifest-bin-in.xml文件的问题。根据用户提供的引用,特别是引用[1]和引用[3],我们可以推断出: - AndroidManifest-bin-in.xml 是一个二进制格式的Android清单文件(通常,AndroidManifest.xml在打包过程中会被编译成二进制格式)。 - 引用[1]中提到了一个工具(xml2axml.jar)可以将这种二进制格式的文件解码(d)为可读的XML文件(即AndroidManifest-readable-out.xml)。 - 引用[3]则提供了另一种工具(AXMLPrinter2.jar)来将二进制的AndroidManifest.xml转换成文本格式(AndroidManifest.txt)。 因此,我们可以这样回答用户: AndroidManifest-bin-in.xml文件是Android应用程序的清单文件(AndroidManifest.xml)的二进制格式版本。在Android应用构建过程中,原始的XML格式的清单文件会被编译成二进制格式,以减小文件大小并提高解析效率。这种二进制文件通常出现在构建过程的中间文件中,或者是在反编译APK时得到的文件。 用户可能需要查看或编辑这个二进制文件的内容,此时需要将其转换为可读的XML格式。有两种常用方法: 1. 使用xml2axml.jar工具进行解码(如引用[1]所示): ``` java -jar xml2axml.jar d AndroidManifest-bin-in.xml AndroidManifest-readable-out.xml ``` 这将生成一个可读的XML文件。 2. 使用AXMLPrinter2.jar工具(如引用[3]所示): ``` java -jar AXMLPrinter2.jar AndroidManifest-bin-in.xml > AndroidManifest.txt ``` 这将把二进制文件的内容转换成文本格式并输出到AndroidManifest.txt文件中。 另外,引用[2]中提到了一个构建错误,错误信息提示在合并清单文件时出现了属性冲突,并建议使用`tools:replace="android:authorities"`来覆盖冲突。这提醒我们,在处理清单文件时可能会遇到合并冲突,需要根据错误信息调整清单文件。 因此,我们可以为用户总结如下: </think>### AndroidManifest-bin-in.xml 文件介绍 **AndroidManifest-bin-in.xml** 是 Android 应用打包构建过程中生成的 **二进制格式的清单文件**,具有以下核心特性: 1. **格式本质** 文件扩展名中的 `-bin-in` 表示二进制输入格式(Binary Input)。它是 Android 构建系统(如 Gradle 或 Ninja)在编译过程中生成的中间文件,由原始的明文 `AndroidManifest.xml` 经过编译转换而来。 2. **生成场景** 当 Android 应用包含多个模块或依赖库时,构建系统会将所有模块的清单文件: - 先编译为二进制格式(如 `AndroidManifest-bin-in.xml`) - 再通过 `manifest-merger` 工具合并成最终的 `AndroidManifest.xml`(引用[2]) 3. **与明文清单的关系** ```mermaid graph LR A[原始明文 AndroidManifest.xml] -->|编译| B[AndroidManifest-bin-in.xml] B -->|合并| C[最终二进制 AndroidManifest.xml] C -->|打包| D[APK/AAB] ``` 4. **错误处理场景(引用[2])** 文件在清单合并阶段可能触发冲突错误,例如: ```xml Error: Attribute provider#androidx.startup.InitializationProvider@authorities value冲突 Suggestion: add 'tools:replace=”android:authorities”' ``` 此时需在原始清单中添加冲突解决属性后重新编译。 5. **查看内容的方法** 需使用专用工具反编译为可读文本: - **方法1**:通过 `xml2axml.jar` 解码(引用[1]) ```bash java -jar xml2axml.jar d AndroidManifest-bin-in.xml 明文输出.xml ``` - **方法2**:使用 `AXMLPrinter2.jar` 转换(引用[3]) ```bash java -jar AXMLPrinter2.jar AndroidManifest-bin-in.xml > 明文.txt ``` 6. **文件生命周期** 属于构建中间文件,通常位于项目路径: ``` app/build/intermediates/manifests/.../AndroidManifest-bin-in.xml ``` 最终不会打包进 APK,构建完成后自动删除[^1][^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值