Разрешения WRITE_SETTINGS и WRITE_SECURE_SETTINGS: кратко и по делу

WRITE_SETTINGS позволяет приложению изменять обычные системные настройки (яркость, звук, автоповорот и др.), а WRITE_SECURE_SETTINGS — менять защищённые параметры (Settings.Secure) и доступен только системным/рутованным приложениям или через специальные инструменты ADB. Ниже — что именно они дают и рабочие способы выдать их через ADB.

Что делает WRITE_SETTINGS

WRITE_SETTINGS даёт право записывать в Settings.System и часть Settings.Global — т.е. в «обычные» системные настройки:

  • яркость экрана, звук, время авто‑блокировки, параметры автообновления и т.п.;
  • некоторые глобальные флаги, которые не привязаны к конкретному пользователю.

Примеры использования: менеджеры яркости/звука, профили режимов, автоматические сценарии (смена профиля по расписанию или при подключении гарнитуры).

На Android 6+ это особое право: пользователь обычно должен подтвердить доступ через системный экран «Разрешить изменять системные настройки» (ACTION_MANAGE_WRITE_SETTINGS).

Практические команды и проверки:

  • Открыть экран настроек, чтобы пользователь дал доступ:
    adb shell am start -a android.settings.action.MANAGE_WRITE_SETTINGS -d "package:com.example.app"
  • Автоматически разрешить (на многих устройствах работает):
    adb shell appops set com.example.app WRITE_SETTINGS allow
  • Проверить статус appops:
    adb shell appops get com.example.app WRITE_SETTINGS
  • Альтернативно можно смотреть через dumpsys package:
    adb shell dumpsys package com.example.app | grep WRITE_SETTINGS

Что делает WRITE_SECURE_SETTINGS

WRITE_SECURE_SETTINGS — значительно более привилегированное разрешение, оно даёт запись в Settings.Secure и позволяет менять параметры, влияющие на безопасность и поведение системы: USB‑отладка/режим разработчика, системные флаги поведения фоновых сервисов и др.

Это разрешение практически недоступно для обычных приложений из Play Маркета — его получают только:

  • системные приложения (размещённые в /system/priv-app и подписанные системным ключом);
  • приложения на рутованном устройстве или в окружении с повышенными правами (Magisk, root).

Неправильные изменения в Settings.Secure могут снизить безопасность устройства или сделать его нестабильным. Не применяйте на личных телефонах без бэкапа.

Как получить WRITE_SECURE_SETTINGS на практике:

  • Вариант A — сделать приложение системным:
    1. adb remount
    2. adb push YourApp.apk /system/priv-app/YourApp.apk
    3. adb reboot
      После установки в /system/priv-app и при наличии соответствующей строки в AndroidManifest приложение получит системные разрешения.
  • Вариант B — рут/Magisk:
    1. adb shell
    2. su
    3. pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS
      или использовать специализированные скрипты Magisk для установки привилегий.
  • На некоторых сборках/девайсах для тестов можно попробовать:
    adb shell pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS
    — но это сработает не везде; обычно требует userdebug/debug сборки или root.

Частые ошибки

  • Пытаются дать WRITE_SETTINGS через pm grant — в большинстве публичных сборок это не действует; используйте appops или запрос пользователю через ACTION_MANAGE_WRITE_SETTINGS.
  • Редактируют /data/system/packages.xml вручную — это рискованно и может привести к повреждению базы разрешений.
  • Ожидают, что WRITE_SECURE_SETTINGS безопасно использовать на боевых устройствах — изменения могут отключить блокировку, включить отладку и т.д.

FAQ

  • Можно ли выдать WRITE_SETTINGS без показа интерфейса пользователю?
    На обычных устройствах — нет; можно автоматизировать через appops (adb shell appops set ...) если девайс позволяет, иначе открывается экран управления разрешением.
  • Работает ли adb shell pm grant для WRITE_SECURE_SETTINGS?
    Иногда — на отладочных или рутованных сборках; в большинстве продакшн‑сборок требуется системный статус или root.
  • Чем рискуем, давая WRITE_SECURE_SETTINGS?
    Потеря безопасности (включение USB‑отладки, снятие ограничений фоновой активности и пр.), нестабильность системы.

Если нужно, добавлю готовые примеры кода для проверки Settings.canWrite(context) и безопасного применения Settings.System/Settings.Secure в приложении.