昨天在用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"] …… />
意思以下: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>
意思以下:
該屬性用來標示,其它應用的組件是否能夠喚醒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>
意思以下:
當前內容提供者是否會被其它應用使用:
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>
意思以下:
當前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。