android:exported 属性详解

昨天在用360扫描应用漏洞时,扫描结果,出来一个android:exported属性,其实以前根本不知道这个属性,更不知道这个属性用来干吗的,详情见下图: 
这里写图片描述
这里写图片描述android

所以,查了官方API,学习了一下这个属性!app


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

整体来讲它的主要做用是:是否支持其它应用调用当前组件。 
默认值:若是包含有intent-filter 默认值为true; 没有intent-filter默认值为false。学习

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

一、先来看:Activity中的:code

<activity
          ……
          android:exported=["true" | "false"]
          ……
/>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里写图片描述

意思以下:blog

在Activity中该属性用来标示:当前Activity是否能够被另外一个Application的组件启动:true容许被启动;false不容许被启动。图片

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

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

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

二、Service中的:

<service android:enabled=["true" | "false"]
         android:exported=["true" | "false"]
         android:icon="drawable resource"
         android:isolatedProcess=["true" | "false"]
         android:label="string resource"
         android:name="string"
         android:permission="string"
         android:process="string" >
    . . .
</service>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里写图片描述

意思以下: 
该属性用来标示,其它应用的组件是否能够唤醒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属性)

三、Provider中的:

<provider android: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:writePermission="string" >
    . . .
</provider>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

这里写图片描述

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

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

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

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

四、receiver中的:

<receiver android:enabled=["true" | "false"]
          android:exported=["true" | "false"]
          android:icon="drawable resource"
          android:label="string resource"
          android:name="string"
          android:permission="string"
          android:process="string" >
    . . .
</receiver>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这里写图片描述

意思以下: 
当前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 在网上找见了两篇不错的文章: 
一、Android中startActivity中的permission检测与UID机制 
二、Android Permission 机制

更正:

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

相关文章
相关标签/搜索