Exported service does not require permission問題。

今天在編輯一個簡單的aidl的例子的時候遇到的一個小問題。原本編輯完後準備運行,無心中看到AndroidManifest.xml有個警告,內容爲「Exported service does not require permission」.配置文件代碼以下:android

1 <service android:name=".AidlService">
2             <intent-filter >
3                 <action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/>
4             </intent-filter>
5         </service>

警告「Exported service does not require permission」的意思是「外部的service不須要權限」。既然不須要權限那麼爲何還會有警告呢???在網上搜了一些此類問題,也沒說爲何。不過卻是按照他們的方法解決了問題。那就是直接在service中設置exported屬性爲「false」,限制外界訪問。問題就解決了。以下:api

1 <service android:name=".AidlService"
2             android:exported="false">
3             <intent-filter >
4                 <action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/>
5             </intent-filter>
6         </service>

其實回過頭來想一想,其實只是本身犯了個很弱智的問題,由於本身和不少遇到這種問題的人同樣,那就是:理解錯誤!由於之前學習你們遇到的一般都是沒有加權限而致使的問題,因此天然而然的想到沒加權限會報錯,沒法訪問之類的。可是此次遇到的是「外部的service不須要權限」,其意思是:外部的其餘service根本不須要添加權限就可以輕易地訪問咱們編寫的這個aidl,或者說這個service。這是出於安全性的考慮而給咱們的警告。而不是告訴咱們缺乏相應的權限。本身傻傻的還想require這個單詞是否是還有其餘意思,會不會有「須要」的意思,查有道,沒有。翻牛津。仍是沒有。最後甚至想是否是編輯文檔的人寫錯了,把acquire錯寫成了require?最後才發現只是理解錯了,習慣性思惟犯的錯。安全

那麼,問題又來了,android:exported="false"  這句不是系統默認的嗎?怎麼還要本身手動加上?難道系統的默認值是「true」?api文檔中這麼說的:app

android:exported 
Whether or not components of other applications can invoke the service or interact with it — " true" if they can, and " false" if not. When the value is " false", only components of the same application or applications with the same user ID can start the service or bind to it. 
The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true". 

This attribute is not the only way to limit the exposure of a service to other applications. You can also use a permission to limit the external entities that can interact with the service (see the permission attribute). 

關鍵的一句是:學習

The default value depends on whether the service contains intent filters.

就是說默認值取決於該service是否包含intent過濾器filter。若是沒有<intent-filter>,那隻能經過指定其準確的類名訪問。這意味着該service打算只在該應用內部使用(由於其餘應用可能根本不知道這個類的名字)。在這種狀況下,默認值是「false」,另外一方面,當存在至少一個filter時,就代表該service打算供外部來使用,所以默認值是「true」。寫到這裏相信你們知道問什麼了吧。原來api裏面寫的清清楚楚,看來api文檔纔是最好的資料這句話一點沒錯。是真正的宗。ui

其實還有一種解決的辦法。那就是咱們在這裏本身定義一個權限。既然外部的其餘service不需權限就能訪問咱們的service,那麼咱們本身定義權限,而後在須要調用該service的應用的配置文件裏面聲明調用該service的所須要的權限不就能夠了嗎?代碼更改成:this

1 <service android:name=".AidlService"
2             android:permission="com.exmaple.myaidldemo.myaidlservice">
3             <intent-filter >
4                 <action android:name="com.example.myaidldemo.action.AIDL_SERVICE"/>
5             </intent-filter>
6         </service>

而後在咱們須要調用該service的其餘應用的配置文件中加入下面這行代碼:spa

<uses-permission android:name="com.exmaple.myaidldemo.myaidlservice"/>

如今爲止咱們就算是完整的就絕了遇到的問題了。最後感嘆下,文檔時個好東西啊。畢竟書裏面不可能介紹的很是詳細。只有多讀文檔纔是正道。code

相關文章
相關標籤/搜索