http://blog.csdn.net/watermusicyes/article/details/46460347

http://blog.csdn.net/watermusicyes/article/details/46460347

http://blog.csdn.net/watermusicyes/article/details/46460347





android:exported 属性详解

标签:android 10769人阅读 评论(6) 收藏 举报 分类: Android(84) 项目点滴(25)

昨天在用360扫描应用漏洞时,扫描结果,出来一个Android:exported属性,其实之前根本不知道这个属性,更不知道这个属性用来干嘛的,详情见下图:
android:exported 属性详解_第1张图片
android:exported 属性详解_第2张图片

因此,查了官方API,学习了一下这个属性!

android:exported 是Android中的四大组件 Activity,Service,Provider,Receiver 四大组件中都会有的一个属性。

总体来说它的主要作用是:是否支持其它应用调用当前组件。
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。

下面来详细的了解一下四大组件中的这个属性:

1、先来看:Activity中的:

<code class="hljs 1c has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><activity          ……          android:exported=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          ……/></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

android:exported 属性详解_第3张图片

意思如下:

在Activity中该属性用来标示:当前Activity是否可以被另一个Application的组件启动:true允许被启动;false不允许被启动。

如果被设置为了false,那么这个Activity将只会被当前Application或者拥有同样user ID的Application的组件调用。

exported 的默认值根据Activity中是否有intent filter 来定。没有任何的filter意味着这个Activity只有在详细的描述了他的class name后才能被唤醒 .这意味着这个Activity只能在应用内部使用,因为其它application并不知道这个class的存在。所以在这种情况下,它的默认值是false。从另一方面讲,如果Activity里面至少有一个filter的话,意味着这个Activity可以被其它应用从外部唤起,这个时候它的默认值是true。

其实,不只有这个属性可以指定Activity是否暴露给其它应用,也可以使用permission来限制外部实体唤醒当前Activity(详情见permission属性)

2、Service中的:

<code class="hljs 1c has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><service android:enabled=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>         android:exported=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>         android:icon=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"drawable resource"</span>         android:isolatedProcess=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>         android:label=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string resource"</span>         android:name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>         android:permission=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>         android:process=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span> >    . . .</service></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

android:exported 属性详解_第4张图片

意思如下:
该属性用来标示,其它应用的组件是否可以唤醒service或者和这个service进行交互:true可以,false不可以。如果为false,只有同一个应用的组件或者有着同样user ID的应用可以启动这个service或者绑定这个service。

默认值根据当前service是否有intent filter来定。如果没有任何filter意味着当前service只有在被详细的描述class name后才会被唤醒。这意味这当前service只能在应用内部使用(因为其它应用不知道这个class name).所以在这种情况下它的默认值为 false.从另一方面讲,如果至少有一个filter的话那么就意味着这个service可以被外部应用使用,这种情况下默认值为true。

其实,不只有这个属性可以指定service是否暴露给其它应用。你也可以使用permission来限制外部实体唤醒当前service(详情见permission属性)

3、Provider中的:

<code class="hljs 1c has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><provider android:authorities=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"list"</span>          android:enabled=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:exported=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:grantUriPermissions=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:icon=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"drawable resource"</span>          android:initOrder=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"integer"</span>          android:label=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string resource"</span>          android:multiprocess=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>          android:permission=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>         android:writePermission=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span> >    . . .</provider></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

android:exported 属性详解_第5张图片

意思如下:
当前内容提供者是否会被其它应用使用:
true: 当前提供者可以被其它应用使用。任何应用可以使用Provider通过URI 来获得它,也可以通过相应的权限来使用Provider。

false:当前提供者不能被其它应用使用。设置Android:exported=“false”来限制其它应用获得你应用的Provider。只有拥有同样的user ID 的应用可以获得当前应用的Provider。

当Android sdk 的最小版本为16或者更低时他的默认值是true。如果是17和以上的版本默认值是false。

可以通过Android:exported=“fasle” 和 permission来限制当前应用Provider是否会被其它应用获取。

4、receiver中的:

<code class="hljs 1c has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><receiver android:enabled=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:exported=[<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"true"</span> <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">| "</span>false<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"]</span>          android:icon=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"drawable resource"</span>          android:label=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string resource"</span>          android:name=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>          android:permission=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span>          android:process=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"string"</span> >    . . .</receiver></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

android:exported 属性详解_第6张图片

意思如下:
当前broadcast Receiver 是否可以从当前应用外部获取Receiver message 。true,可以;false 不可以。如果为false ,当前broadcast Receiver 只能收到同一个应用或者拥有同一 user ID 应用发出广播。

默认值根据当前 broadcast Receiver 是否包含intent filter来定。如果没有任何的filter的话意味着只有在被详细的描述了class name的情况下才会被唤起。这意味着当前Receiver只能在应用内部被使用(因为其它应用不知道这个类的存在。)在这种情况下,默认值是false。如果至少包含一个filter意味着当前broadcast Receiver 将会收到来自系统或者其它应用的广播,所以这个时候默认值是true。

不只有这个属性可以指定broadcast Receiver 是否暴露给其它应用。你也可以使用permission来限制外部应用给他发送消息。

在上文中提到的两个概念:user ID 和 permission 在网上找见了两篇不错的文章:
1、Android中startActivity中的permission检测与UID机制
2、Android Permission 机制

更正:

之前的默认值那块写错了,应该是:
默认值:如果包含有intent-filter 默认值为true; 没有intent-filter默认值为false。



更多相关文章

  1. AndroidManifest文件中android属性
  2. Android中RelativeLayout布局各个xml相对布局属性的介绍和使用
  3. [android]控件ImageView的常用属性
  4. Android中attrs.xml文件的使用详解
  5. 【Android】TextView常用属性
  6. Android属性之build.prop,及property_get/property_set && Androi

随机推荐

  1. Android(安卓)OpenGL ES绘制三角形时角度
  2. Android触摸屏校准方法
  3. Android(安卓)如何在ListView中嵌套ListV
  4. Android(安卓)侧边栏开发的方法
  5. Android(安卓)静默安装和智能安装的实现
  6. Google開設Android線上教學課程
  7. Android中适用于ListView、GridView等组
  8. android 接触
  9. Android(安卓)总结4种线程中操作UI界面的
  10. Android(安卓)的进程与线程