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, вам будут предоставлены разрешения для вашей группы пользователей.
  • если ваше системное приложение соответствует всем нижеуказанным условиям, ему будут предоставлены разрешения.

    1. является привилегированным приложением (в /system/priv-app/)
    2. является постоянным (android:persistent="true")
    3. подписано платформой подписи.

B> grantDefaultSystemHandlerPermissions -> предоставит разрешение времени выполнения с FLAG_PERMISSION_GRANTED_BY_DEFAULT.

  • Если ваше приложение рассматривается как "приложение-обработчик платформы по умолчанию" (т. Е. Ваше приложение "должно работать" из коробки ", такое как камера, номеронабиратель, SMS, календарь и т. Д.), Вы можете прочитать больше в методе grantDefaultSystemHandlerPermissions ()).

Помимо этого, ваше системное приложение должно запрашивать у пользователя опасное разрешение, если для targetSdk установлено значение 23.

Другие вопросы по тегам