Android Marshmallow, "опасный" уровень защиты и системные компоненты / приложения
Я разрабатываю приложение, которое будет пр-установлено (как системное приложение) на прошивку.
из документации на данный момент о связи между системными приложениями, новой моделью разрешений и уровнями защиты - я точно не понимаю, когда системному приложению требуется (если вообще требуется) запрашивать разрешение пользователя.
Мои проблемы начинаются, когда я пытаюсь использовать WRITE_EXTERNAL_STORAGE
разрешение. Из документации видно, что это помечено как "опасное" разрешение.
- "опасные" разрешения автоматически предоставляются системным приложениям?
когда я использую WRITE_EXTERNAL_STORAGE
разрешение (как системное приложение) Я получаю исключение безопасности, и я не знаю, означает ли это, что даже если мое приложение установлено как системное приложение - пользователь должен запрашивать "опасные" разрешения..
еще один момент, чтобы упомянуть:
чтобы проверить поведение приложения как системного приложения, я устанавливаю свое приложение APK на sys-priv
каталог (устройство рутирован) nexus 5 с SDK Preview 3. Это когда я получаю исключение безопасности, когда для использования методов требуется разрешение на внешнее хранилище.
2 ответа
Цитирую заметки о выпуске для 2-го превью:
Приложения, включенные в образ системы, больше не получают опасных разрешений автоматически. Все приложения должны проверять и запрашивать разрешения во время выполнения.
Это согласуется с тем, что я помню, когда впервые использовал стандартное приложение Camera на Nexus 5 с финальной (?) 6.0 предварительной прошивкой - оно тоже запросило разрешение во время выполнения.
Так что, AFAIK, системные приложения должны запрашивать разрешения времени выполнения, как и несистемные приложения.
После долгих копаний и отладки я наконец-то нашел ключ к предоставлению разрешения времени выполнения для зефира для системного приложения, и у меня было много вдохновения в этом билете потока стека.
Ключевая логика находится в DefaultPermissionGrantPolicy. После systemReady PackageManagerService проверяет, не установлены ли для этого пользователя разрешения по умолчанию во время выполнения (т. Е. Это новый пользователь), если это так, PackageManagerService вызывает DefaultPermissionGrantPolicy.grantDefaultPermissions() для проверки / предоставления разрешений:
public void grantDefaultPermissions(int userId) {
grantPermissionsToSysComponentsAndPrivApps(userId);
grantDefaultSystemHandlerPermissions(userId);
}
В двух случаях встроенное приложение может быть автоматически предоставлено с разрешением во время выполнения.
A> grantPermissionsToSysComponentsAndPrivApps -> предоставит разрешение времени выполнения с FLAG_PERMISSION_SYSTEM_FIXED и FLAG_PERMISSION_GRANTED_BY_DEFAULT.
- если ваше системное приложение имеет uid<10000, вам будут предоставлены разрешения для вашей группы пользователей.
если ваше системное приложение соответствует всем нижеуказанным условиям, ему будут предоставлены разрешения.
- является привилегированным приложением (в /system/priv-app/)
- является постоянным (android:persistent="true")
- подписано платформой подписи.
B> grantDefaultSystemHandlerPermissions -> предоставит разрешение времени выполнения с FLAG_PERMISSION_GRANTED_BY_DEFAULT.
- Если ваше приложение рассматривается как "приложение-обработчик платформы по умолчанию" (т. Е. Ваше приложение "должно работать" из коробки ", такое как камера, номеронабиратель, SMS, календарь и т. Д.), Вы можете прочитать больше в методе grantDefaultSystemHandlerPermissions ()).
Помимо этого, ваше системное приложение должно запрашивать у пользователя опасное разрешение, если для targetSdk установлено значение 23.