Разрешения 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 — сделать приложение системным:
- adb remount
- adb push YourApp.apk /system/priv-app/YourApp.apk
- adb reboot
После установки в /system/priv-app и при наличии соответствующей строки в AndroidManifest приложение получит системные разрешения.
- Вариант B — рут/Magisk:
- adb shell
- su
- 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 в приложении.