Android : 添加apk私人許可權

來源:互聯網
上載者:User

標籤:div   res   wrap   裝置   最小   core   his   shared   star   

一、Android的系統許可權:

  apk在安裝時,Android 為每個軟體包提供唯一的 Linux 使用者識別碼。此 ID 在軟體包在該裝置上的使用壽命期間保持不變。在不同裝置上,相同軟體包可能有不同的 UID;重要的是每個軟體包在指定裝置上的 UID 是唯一的。

  由於在進程級實施安全性,因此任何兩個軟體包的代碼通常都不能在同一進程中運行,因為它們需要作為不同的 Linux 使用者運行。您可以在每個軟體包的AndroidManifest.xmlmanifest 標記中使用 sharedUserId 屬性,為它們分配相同的使用者識別碼。這樣做以後,出於安全目的,兩個軟體包將被視為同一個應用,具有相同的使用者識別碼 和檔案許可權。請注意,為保持安全性,只有兩個簽署了相同簽名(並且請求相同的 sharedUserId)的應用才被分配同一使用者識別碼。

  在沒有獲得對應許可權的情況下,當對一個app進程進行訪問或操作時會報 SecurityException 異常,如下嘗試綁定一個後台服務許可權異常的log:

01-01 13:57:22.334 W/ActivityManager( 2108): Permission Denial: Accessing service ComponentInfo{com.cmcc.media.hfp.aidl/com.cmcc.media.hfp.aidl.RemoteService} from pid=16297, uid=10038 requires com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE01-01 13:57:22.340 E/AndroidRuntime(16297): FATAL EXCEPTION: main01-01 13:57:22.340 E/AndroidRuntime(16297): Process: com.example.administrator.nano_server, PID: 1629701-01 13:57:22.340 E/AndroidRuntime(16297): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.administrator.nano_server/com.example.administrator.nano_server.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { act=com.cmcc.media.hfp.client.service pkg=com.cmcc.media.hfp.aidl }01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2198)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2248)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.access$900(ActivityThread.java:136)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1197)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.os.Handler.dispatchMessage(Handler.java:102)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.os.Looper.loop(Looper.java:136)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.main(ActivityThread.java:5046)01-01 13:57:22.340 E/AndroidRuntime(16297):     at java.lang.reflect.Method.invokeNative(Native Method)01-01 13:57:22.340 E/AndroidRuntime(16297):     at java.lang.reflect.Method.invoke(Method.java:515)01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:861)01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:677)01-01 13:57:22.340 E/AndroidRuntime(16297):     at dalvik.system.NativeStart.main(Native Method)01-01 13:57:22.340 E/AndroidRuntime(16297): Caused by: java.lang.SecurityException: Not allowed to bind to service Intent { act=com.cmcc.media.hfp.client.service pkg=com.cmcc.media.hfp.aidl }01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1727)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ContextImpl.bindService(ContextImpl.java:1691)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.content.ContextWrapper.bindService(ContextWrapper.java:517)01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.example.administrator.nano_server.MainActivity.m(MainActivity.java:326)01-01 13:57:22.340 E/AndroidRuntime(16297):     at com.example.administrator.nano_server.MainActivity.onStart(MainActivity.java:303)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1171)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.Activity.performStart(Activity.java:5247)01-01 13:57:22.340 E/AndroidRuntime(16297):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2171)01-01 13:57:22.340 E/AndroidRuntime(16297):     ... 11 more

  

  • 如果裝置啟動並執行是 Android 6.0(API 層級 23)或更高版本,並且應用的 targetSdkVersion23 或更高版本,則應用在運行時向使用者請求許可權。使用者可隨時調用許可權,因此應用在每次運行時均需檢查自身是否具備所需的許可權
  • 如果裝置啟動並執行是 Android 5.1(API 層級 22)或更低版本,並且應用的 targetSdkVersion22 或更低版本,則系統會在使用者安裝應用時要求使用者授予許可權。如果將新許可權添加到更新的應用版本,系統會在使用者更新應用時要求授予該許可權。使用者一旦安裝應用,他們撤銷許可權的唯一方式是卸載應用

 

二、自訂&使用許可權

  1.為何要定義私人許可權?假設開發一個後台服務跟特定的client app做互動,但是有人反編譯了服務端應用的代碼,取得了 AIDL 介面定義和應用的包名以及特定action後,就可以直接綁定service,然後通過 AIDL 調用服務端的遠程方法進行隨意操作,因此服務端就需要對請求串連的用戶端進行許可權驗證。

 

  2.要定義私人許可權,必須先使用一個或多個< permission >元素在 AndroidManifest.xml (系統源碼在\frameworks\base\core\res\)中聲明它們,例如讀取電話號碼許可權:

    <!-- Allows read access to the device‘s phone number(s). This is a subset of the capabilities         granted by {@link #READ_PHONE_STATE} but is exposed to ephemeral applications.         <p>Protection level: dangerous-->    <permission android:name="android.permission.READ_PHONE_NUMBERS"        android:permissionGroup="android.permission-group.PHONE"        android:label="@string/permlab_readPhoneNumbers"        android:description="@string/permdesc_readPhoneNumbers"        android:protectionLevel="dangerous|ephemeral" />

  許可權包含一系列屬性,包括:許可權的名稱、許可權所屬的許可權組,許可權的標記,標題、描述和許可權的等級:

  • android:permissionGroup

    該屬性用於指定許可權所屬的許可權組,在上例中的android.permission-group.PHONE許可權組的定義如下:

    <!-- Used for permissions that are associated telephony features. -->    <permission-group android:name="android.permission-group.PHONE"        android:icon="@drawable/perm_group_phone_calls"        android:label="@string/permgrouplab_phone"        android:description="@string/permgroupdesc_phone"        android:priority="500" />

   對於許可權組需要注意的一點:如果已經取了許可權組中的其中一個許可權,那麼系統會允許擷取該許可權組的其它保護等級相同或者更低的許可權。比如在6.0以上系統通過運行時許可權擷取到了android.permission.CALL_PHONE這個許可權,那麼同屬於同一組的許可權android.permission.READ_PHONE_STATE 就不需要再通過運行時許可權機制擷取了。

  • permissionFlags:

   給該使用權限設定對應的標誌,比如:costsMoney,代表擷取該許可權有可能會造成費用。

  • label:

    給該使用權限設定標題。

  • description:

    給該使用權限設定描述。

  • priority:

    指定了該許可權的優先等級。

  • icon:

    給該使用權限設定表徵圖。

  • protectionLevel:

指定了該許可權的保護等級。保護等級主要有:normal、dangerous、signature、signatureOrSystem四種:

①normal:預設值。較低風險的許可權,對其他應用、系統和使用者來說風險最小。系統在安裝應用時會自動批准授予應用該類型的許可權,不要求使用者明確批准(但可以選擇查看這些許可權)。

②dangerous:較高風險的許可權,請求該類型許可權的應用程式會訪問使用者私人資料或對裝置進行控制,從而可能對使用者造成負面影響。因為這種類型的許可引入了潛在風險,所以系統可能不會自動將其授予請求的應用。例如,系統可以向使用者顯示由應用請求的任何危險許可,並且在繼續之前需要確認,或者可以採取一些其他方法來避免使用者自動允許。

③signature:只有在請求該許可權的應用與聲明許可權的應用使用相同的認證簽名時,系統才會授予許可權。如果認證匹配,系統會自動授予許可權而不通知使用者或要求使用者的明確批准。

④signatureOrSystem:僅授予Android系統映像中與聲明許可權的應用使用相同的認證簽名的應用(system app)。請避免使用此選項,“signature”層級足以滿足大多數需求,“signatureOrSystem”許可權用於某些特殊情況。

 

  3.要使用受保護的系統功能,必須在應用清單中包含一個或多個 < uses-permission > 標記:

如下給自己的service申明一個許可權:

<permission    android:name="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE"    android:protectionLevel="signature" />

    設定許可權:android:permission="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE"

<application    <service        android:name="com.cmcc.media.hfp.aidl.RemoteService"
     android:permission="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE" android:exported="true"’> <intent-filter> <!-- client端喚醒 --> <action android:name="com.cmcc.media.hfp.client.service" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service></application>

   

 client端app擷取service的許可權:

    <!-- 擷取訪問 service 的許可權" -->    <uses-permission android:name="com.cmcc.media.hfp.aidl.NANO_REMOTE_SERVICE" />

 

 

-end-

    

Android : 添加apk私人許可權

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.