天天看點

android 權限申請_Android 特權許可白名單一、priv-app 白名單簡介二、添加priv-app 白名單三、生成priv-app白名單四、自定義priv-app白名單五、查找缺少的priv-app權限六、執行priv-app白名單七、priv-app 中申請權限未添加特許白名單遇到的坑

android 權限申請_Android 特權許可白名單一、priv-app 白名單簡介二、添加priv-app 白名單三、生成priv-app白名單四、自定義priv-app白名單五、查找缺少的priv-app權限六、執行priv-app白名單七、priv-app 中申請權限未添加特許白名單遇到的坑

和你一起終身學習,這裡是程式員android

本篇文章主要介紹 Android 開發中的部分知識點,通過閱讀本篇文章,您将收獲以下内容:

一、priv-app 白名單簡介

二、添加priv-app 白名單

三、生成priv-app白名單

四、自定義priv-app白名單

五、查找缺少的priv-app權限

六、執行priv-app白名單

七、priv-app 中申請權限未添加特許白名單遇到的坑

一、priv-app 白名單簡介

特權應用程式是位于/system/priv-app系統映像目錄中的系統應用程式 。從曆史上看,裝置實施者幾乎無法控制哪些特權權限可以授予特權應用程式。從Android 8.0開始,實作者可以在/etc/permissions目錄中的系統配置XML檔案中明确地将特權應用程式列入白名單。未在這些XML檔案中明确列出的應用程式未被授予特權權限。

特别注意事項

僅對 具有package =“android”的應用程式聲明的 權限才需要白名單 。Google Play進展使用com.example和com.android命名空間。

二、添加priv-app 白名單

應用程式的權限白名單可以列在frameworks/base/etc/permissions目錄中的單個或多個XML檔案中,如下所示:

frameworks/base/etc/permissions/privapp-permissions-OEM_NAME.xml

frameworks/base/etc/permissions/privapp-permissions-DEVICE_NAME.xml

組織内容沒有嚴格的規則。隻要所有應用程式/system/priv-app都列入白名單,裝置實施者就可以确定内容結構 。例如,Google為Google開發的所有特權應用程式都有一個白名單。我們建議使用以下組織:

  • 已包含在Android開源項目(AOSP)中的應用的權限列于
  • /etc/permissions/privapp-permissions-platform.xml。
  • Google應用程式的權限列于
  • /etc/permissions/privapp-permissions-google.xml。
  • 對于其他應用程式,請使用以下形式的檔案:
  • /etc/permissions/privapp-permissions-DEVICE_NAME.xml

三、生成priv-app白名單

要為系統映像上的所有可用應用程式自動生成白名單,請使用AOSP指令行工具 development/tools/privapp_permissions/privapp_permissions.py。要生成特定于裝置的初始版本 privapp-permissions.xml

1.建構系統映像:

. build/envsetup.sh lunch PRODUCT_NAME make -j
           

2.運作該privapp_permissions.py腳本以生成一個privapp-permissions.xml檔案,該 檔案列出了要列入白名單的所有簽名特權權限:

development/tools/privapp_permissions/privapp_permissions.py
           

此工具生成 XML内容,可以将其用作單個檔案或拆分為多個檔案/etc/permissions。如果裝置已在/etc/permissions目錄中包含白名單,則 該工具僅列印差異(即缺少要添加到白名單的特權權限)。這對于審計目的也很有用:添加新版本的應用程式時,該工具會檢測所需的其他權限。

3.将生成的檔案複制到/etc/permissions目錄,系統将在引導期間讀取這些檔案。

四、自定義priv-app白名單

AOSP包括白名單實作,可根據需要進行自定義。AOSP中包含的應用的權限已列入白名單

/etc/permissions/privapp-permissions-platform.xml。

預設情況下,privapp_permissions.py腳本會生成輸出,該輸出會自動授予特權應用程式請求的任何權限。如果存在應拒絕的權限,請編輯XML以使用“拒絕權限”标記而不是“權限”标記。例如(frameworks/base/data/etc/privapp-permissions-platform.xml):

...
           

五、查找缺少的priv-app權限

啟動新裝置時,通過啟用過渡日志模式來查找缺少的權限:

ro.control_privapp_permissions=log
           

可以使用adb 指令擷取該屬性的值,指令如下:

C:甥敳獲Administrator>adb rootC:甥敳獲Administrator>adb remountNot running as root. Try "adb root" first.C:甥敳獲Administrator>adb shell getprop ro.control_privapp_permissionslogC:甥敳獲Administrator>
           
android 權限申請_Android 特權許可白名單一、priv-app 白名單簡介二、添加priv-app 白名單三、生成priv-app白名單四、自定義priv-app白名單五、查找缺少的priv-app權限六、執行priv-app白名單七、priv-app 中申請權限未添加特許白名單遇到的坑

adb 擷取特權白名單屬性

日志檔案中會報告違規,但仍會授予權限。這樣可以在提供違規清單的同時使裝置保持工作狀态。錯誤消息格式如下:

PackageManager: Privileged permission {PERMISSION_NAME} for package {PACKAGE_NAME} -  not in privapp-permissions whitelist
           

必須通過将應用添加到白名單來解決所有違規問題。如果未添加,即使應用程式位于priv-app路徑中,也不會向應用程式授予缺少的權限。

六、執行priv-app白名單

在使用白名單後,通過設定建構屬性來啟用運作時強制實施ro.control_privapp_permissions=enforce

七、priv-app 中申請權限未添加特許白名單遇到的坑

如果priv-app中申請了一些權限後沒有在此檔案添加,在強制執行ro.control_privapp_permissions=enforce時候,可能會導緻手機無法開機情況。

小編遇到無法開機的異常Log資訊如下:

06-04 10:48:38.750 1756 1756 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main06-04 10:48:38.750 1756 1756 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.android.cellbroadcastreceiver: android.permission.MANAGE_ACTIVITY_STACKS, com.android.cellbroadcastreceiver: android.permission.STATUS_BAR}06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:2010)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:89)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.pm.permission.PermissionManagerService$PermissionManagerInternalImpl.systemReady(PermissionManagerService.java:2057)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21446)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.SystemServer.startOtherServices(SystemServer.java:1803)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:453)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:316)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:504)06-04 10:48:38.750 1756 1756 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:838)
           

解決方案

根據無法開機的報錯資訊,需要将小區廣播中申請的權限添加到privapp-permissions-platform白名單中。

1.小區廣播申請權限AndroidManifest.xml如下:

1 <?xml version="1.0" encoding="utf-8"?> 2  19  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  ... ... 205  206  207 
           

2.需要将 priv-app 在AndroidMainfest.xml 中申請的權限 添加到特許白名單中(frameworks/base/data/etc/privapp-permissions-platform.xml)

1 <?xml version="1.0" encoding="utf-8"?> 2  17  18  22  ... ...  36  37  38  39  40  41  42  43  44  ... ...452