和你一起終身學習,這裡是程式員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>
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