Разрешение среды выполнения Android для системных приложений
Вопрос о разрешениях для Android. AFAIK, Android дает опасное разрешение во время выполнения. Я сбросил свой телефон, затем adb pull /data/system/users/0/runtime-permissions.xml, я обнаружил, что android.ui.system уже предоставил много опасных разрешений. Кто-нибудь может сказать мне, как это происходит?
2 ответа
Механизм для вставки разрешения времени выполнения в /data/system/users/0/runtime-permissions.xml
диалоговое окно подтверждения файла пользователем для уровня разрешений Dangerous предназначено для сторонних приложений и не относится к встроенным приложениям.
Для встроенных / системных приложений и компонентов инфраструктуры все разрешения предоставляются по умолчанию при создании нового пользователя или загрузке устройства и возникновении события systemReady.
Вы можете увидеть AndroidManifest.xml из AOSP, где все типы необходимых разрешений написаны для системных компонентов.
Для сторонних приложений, когда пользователь предоставляет какое-либо разрешение во время выполнения, он добавляется в файл /data/system/users/0/runtime-permissions.xml и удаляется при отзыве разрешения любого стороннего приложения, тогда как после полной фабрики сброс, разрешение во время выполнения всех сторонних приложений удаляется, так как /data/system/users/0/runtime-permissions.xml удаляется (стирание раздела данных).
Но даже после сброса настроек, /data/system/users/0/runtime-permissions.xml
содержит разрешения времени выполнения (даже опасный уровень) для системных приложений, см. разрешения по умолчанию: runtime-permissions.xml.
И это происходит потому, что:
Все разрешения по умолчанию предоставляются от
PackageManagerService
с помощью этих двух методов:newUserCreated() //this get called when new user is created systemReady() //this get called when device is booted
и выше методы внутренне вызывают:
DefaultPermissionPolicy.grantDefaultPermissions();
Посмотрите как триггеры DefaultPermissionPolicy
И если вы видите реализацию DefaultPermissionPolicy, она содержит все соответствующие методы для загрузки всех типов разрешений для компонентов системы.
конкретно
DefaultPermissionPolicy.grantDefaultPermissions()
внутренние звонкиgrantPermissionsToSysComponentsAndPrivApps(идентификатор пользователя); grantDefaultSystemHandlerPermissions (USERID);
и это внутренне они звонят
grantRuntimePermissionsLPw()
метод, который выполняет всю оставшуюся работу.
Список привилегированных разрешений
Производители устройств практически не контролировали, какие подписи|привилегированные разрешения могут быть предоставлены привилегированным приложениям. Начиная с Android 8.0 производители должны явно предоставлять привилегированные разрешения в XML-файлах конфигурации системы в каталоге /etc/permissions.
Android позволяет системным приложениям, присутствующим в этих каталогах (system/product/vendor/oem/ | _ext), вносить свои разрешения в белый список путем записи XML-файла.
Содержимое XML-файла:
<permissions> <privapp-permissions package="x.y.z"> <permission name="android.permission.PACKAGE_USAGE_STATS" /> </privapp-permissions> </permissions>
Файл Android.bp:
prebuilt_etc { name: "x.y.z.xml", system_ext_specific: true, src: "x.y.z.xml", sub_dir: "permissions", }
Добавьте 'xyzxml' в PRODUCT_PACKAGES, чтобы сделать эту часть окончательного изображения (так же, как для приложения)
По цели: XML-файл можно найти в разделе «partition/etc/permissions/priv-app».
PackageManager анализирует все файлы XML и вносит в белый список разрешения, упомянутые для имени пакета, при установке приложения при загрузке.