Модификация системных настроек через settings

Рейтинг: 59.6% · 10 голосов
Полный курс по Android Debug Bridge: установка, подключение, shell, логи, dumpsys, автоматизация, root, беспроводная отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
android_roman
Сообщения: 45
Зарегистрирован: 11 май 2026, 05:31

Модификация системных настроек через settings

Сообщение android_roman »

АкадемияADB: Android Debug BridgeГлава 16 из 29
Оглавление курса (29)
  1. Введение в Android Debug Bridge
  2. Установка и настройка рабочей среды
  3. Подключение устройства (проводное и беспроводное)
  4. Базовые команды ADB и управление сервером
  5. Команды состояния и перезагрузки
  6. Навигация по файловой системе
  7. Управление пакетами приложений
  8. Логирование с помощью logcat
  9. Системные дампы и диагностика (dumpsys)
  10. Анализ производительности в реальном времени
  11. Эмуляция ввода (input)
  12. Управление Activity и Intent (am)
  13. Работа с оконным менеджером (wm)
  14. Захват экрана и запись видео
  15. Root-доступ и его применение
  16. Модификация системных настроек через settings (вы здесь)
  17. Команды для поставщиков контента (content)
  18. Резервное копирование и восстановление (backup)
  19. Проброс портов и туннелирование
  20. Беспроводная отладка (Wi-Fi)
  21. Взаимодействие с эмуляторами
  22. Написание скриптов на Bash/CMD/PowerShell
  23. ADB в языках программирования
  24. Автоматизация тестирования с ADB
  25. Безопасность и лучшие практики
  26. ADB на Android TV, Wear OS и IoT
  27. Восстановление и низкоуровневые операции
  28. Расширенные возможности оболочки и инструменты
  29. Отладка самого ADB и устранение неполадок
К этой главе у вас уже есть весь нужный фундамент: устройство подключено (глава 3), shell освоен (глава 6), am и wm знакомы (главы 12-13). Теперь разберём инструмент, ради которого ADB часто ставят даже люди, далёкие от разработки: команду settings, то есть тонкую настройку системы без root.

Где живут настройки:

Все параметры, которые вы видите в приложении "Настройки", и сотни тех, которых там нет, Android хранит в SettingsProvider. Это системный поставщик контента внутри процесса system_server, со времён Android 6 данные лежат в XML-файлах в /data/system/users/<id>/ и /data/system/. Утилита settings - консольный клиент к этому провайдеру. Главное: shell-пользователь (uid 2000), от имени которого работает adb shell, владеет разрешениями WRITE_SETTINGS и WRITE_SECURE_SETTINGS. Поэтому из ADB можно читать и писать почти всё без root, тогда как обычным приложениям запись в secure и global закрыта в принципе.

Настройки разбиты на три пространства имён:

system. Пользовательские параметры текущего профиля: яркость (screen_brightness), таймаут экрана (screen_off_timeout), масштаб шрифта (font_scale), автоповорот, рингтоны, виброотклик.

secure. Чувствительные параметры профиля: android_id, выбранная клавиатура (default_input_method), службы accessibility, принудительный DPI. Приложения могут их читать, но не писать.

global. Общие для всего устройства и всех пользователей: airplane_mode_on, adb_enabled, масштабы анимаций, development_settings_enabled, stay_on_while_plugged_in.

Пять глаголов:

Код: Выделить всё

adb shell settings list <namespace>
adb shell settings get <namespace> <key>
adb shell settings put <namespace> <key> <value>
adb shell settings delete <namespace> <key>
adb shell settings reset <namespace> <режим|пакет>
list выводит все заданные ключи пространства в виде key=value:

Код: Выделить всё

$ adb shell settings list global
adb_enabled=1
airplane_mode_on=0
airplane_mode_radios=cell,bluetooth,wifi,nfc,wimax
animator_duration_scale=1.0
bluetooth_on=1
boot_count=42
...
Искать нужный ключ удобно через grep:

Код: Выделить всё

$ adb shell settings list system | grep screen
screen_brightness=98
screen_brightness_mode=1
screen_off_timeout=30000
get читает одно значение, put записывает (при успехе молчит), delete удаляет строку из таблицы, после чего система вернётся к зашитому в код дефолту:

Код: Выделить всё

$ adb shell settings get secure android_id
3f8c1de29a4b5c6d
$ adb shell settings put system screen_off_timeout 60000
$ adb shell settings delete global my_test_key
Deleted 1 rows
Если get вернул null, это не ошибка: ключ просто ещё ни разу не записывался, и его дефолт живёт в коде платформы, а не в таблице. Обратная сторона: put не проверяет имя ключа, опечатка вроде screen_brightnes молча создаст новый мусорный ключ. Привычка перечитывать значение после записи экономит часы.

reset работает только для secure и global и откатывает изменения пакетами: режимы untrusted_defaults, untrusted_clear, trusted_defaults либо имя конкретного пакета. На практике я предпочитаю точечный delete, у reset слишком широкий радиус поражения.

На устройствах с несколькими пользователями (рабочий профиль, "второе пространство" на HyperOS, профили на Android TV) добавляйте флаг --user, иначе пишете в профиль 0:

Код: Выделить всё

$ adb shell pm list users
Users:
	UserInfo{0:Owner:c13} running
	UserInfo{10:Work:1030} running
$ adb shell settings get --user 10 system screen_brightness
64
Мелочь для скриптов: на современных прошивках бинарь settings - обёртка над cmd settings, так что в циклах быстрее вызывать adb shell cmd settings get global adb_enabled напрямую.

Пример 1, режим полёта:

Классическая ловушка. Запись значения меняет только флаг, радиомодули остаются включёнными:

Код: Выделить всё

adb shell settings put global airplane_mode_on 1
Чтобы система применила состояние, нужен broadcast, но с Android 8 он защищённый, и без root вы получите:

Код: Выделить всё

$ adb shell am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
java.lang.SecurityException: Permission Denial: not allowed to send broadcast
android.intent.action.AIRPLANE_MODE from pid=12903, uid=2000
На Android 12+ есть честный способ без root:

Код: Выделить всё

adb shell cmd connectivity airplane-mode enable
adb shell cmd connectivity airplane-mode disable
adb shell cmd connectivity airplane-mode
enabled
На старых устройствах остаётся вариант put + broadcast из-под root (глава 15). Для Wi-Fi и Bluetooth по отдельности тоже не пишите wifi_on руками, используйте cmd wifi set-wifi-enabled enabled|disabled и svc bluetooth enable|disable.

Пример 2, яркость:

Сначала выключите автояркость, иначе ваше значение тут же перезапишется:

Код: Выделить всё

adb shell settings put system screen_brightness_mode 0
adb shell settings put system screen_brightness 128
0 в screen_brightness_mode - ручной режим, 1 - автоматический. Классический диапазон яркости 0-255, но вендоры его меняют: на части Xiaomi/HyperOS ручной максимум 2047. Перед написанием кроссдевайсного скрипта выкрутите яркость в максимум на самом устройстве и снимите значение через get.

Пример 3, таймаут экрана:

Значение в миллисекундах:

Код: Выделить всё

adb shell settings put system screen_off_timeout 600000
Это 10 минут. Для стенда автотестов экран обычно держат включённым на питании, и для этого есть штатная команда вместо магических чисел:

Код: Выделить всё

adb shell svc power stayon usb
Она пишет битовую маску в global stay_on_while_plugged_in (1 - AC, 2 - USB, 4 - беспроводная зарядка). Ставить screen_off_timeout в 2147483647 ("никогда") на личном AMOLED-устройстве не советую.

Пример 4, DPI:

Принудительная плотность хранится в secure-ключе display_density_forced, и именно его пишет знакомая по главе 13 команда wm density:

Код: Выделить всё

$ adb shell wm density 356
$ adb shell settings get secure display_density_forced
356
Откат: wm density reset либо settings delete secure display_density_forced. Используйте wm как основной инструмент, он сразу пересчитывает конфигурацию. Если перестарались и SystemUI поплыл, та же пара команд возвращает всё на место, ничего не окирпичивается.

Бонус для автоматизации (пригодится в главе 24): отключение анимаций и наглядные касания:

Код: Выделить всё

adb shell settings put global window_animation_scale 0
adb shell settings put global transition_animation_scale 0
adb shell settings put global animator_duration_scale 0
adb shell settings put system show_touches 1
adb shell settings put system pointer_location 1
Работа с content provider:

Утилита settings - надстройка над SettingsProvider, а к нему можно обращаться и напрямую командой content (подробно она ждёт вас в главе 17). URI стандартные: content://settings/system, content://settings/secure, content://settings/global.

Код: Выделить всё

$ adb shell content query --uri content://settings/global --where "name='adb_enabled'"
Row: 0 _id=25, name=adb_enabled, value=1
В отличие от get, здесь видно служебный _id строки. insert для этого провайдера работает как upsert, то есть полноценный аналог put:

Код: Выделить всё

adb shell content insert --uri content://settings/system --bind name:s:screen_brightness --bind value:i:200
Удаление, обязательно с --where:

Код: Выделить всё

adb shell content delete --uri content://settings/system --where "name='my_test_key'"
Все значения провайдер хранит строками, поэтому тип в --bind влияет только на разбор аргумента. Зачем этот низкий уровень, если есть settings? Во-первых, выборки с условиями по куску имени (name LIKE). Во-вторых, единообразие со скриптами, где вы уже работаете с другими провайдерами. И отдельный практический трюк: приложению можно выдать право писать в secure без root, после чего оно будет менять настройки самостоятельно, этим пользуются утилиты управления жестами и энергосбережением:

Код: Выделить всё

adb shell pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS
Частые ошибки:

Поставили global adb_enabled 0 и устройство пропало из adb devices. Лечится только руками на устройстве через настройки разработчика, на удалённой ферме это поездка в серверную.

Советы из статей 2018-2020 годов про settings put global policy_control immersive.full=* больше не работают, ключ policy_control удалён в Android 11.

Меняете настройку, а на экране ничего: проверьте, не пишете ли вы не тому пользователю (флаг --user current) и не перебивает ли вас автояркость или родительский контроль.

Значение с пробелами экранируйте с учётом двойного прохода через shell:

Код: Выделить всё

adb shell "settings put global device_name 'Test Pixel 8'"
В следующей главе разберём команду content по-настоящему глубоко, на чужих провайдерах: контакты, SMS, календарь. А пока потренируйтесь: снимите дамп всех трёх пространств в файлы через settings list, это отличный слепок состояния устройства перед экспериментами.
👍1 ❤️4 🔥1 😄 🤔1
✔ Лучший ответ сформирован автоматически — elixir_pro
android_roman писал(а):adb shell cmd connectivity airplane-mode enable проверил на pixel 7 (android 15) и samsung a54 (android 14) - работает как описано. а вот старый redmi 9 с десяткой отвечает Unknown command, так что для парка легаси устройств вариант с broadcast под root все еще единственный. у нас в тестлабе таких половина, держим оба пути в скрипте
Перейти к ответу →
Аватара пользователя
elixir_pro
Сообщения: 3
Зарегистрирован: 12 май 2026, 13:01

Re: Модификация системных настроек через settings

Сообщение elixir_pro »

✔ Лучший ответ — сформирован автоматически
android_roman писал(а):adb shell cmd connectivity airplane-mode enable
проверил на pixel 7 (android 15) и samsung a54 (android 14) - работает как описано. а вот старый redmi 9 с десяткой отвечает Unknown command, так что для парка легаси устройств вариант с broadcast под root все еще единственный. у нас в тестлабе таких половина, держим оба пути в скрипте
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
wildthing
Сообщения: 2
Зарегистрирован: 27 май 2026, 23:16

Re: Модификация системных настроек через settings

Сообщение wildthing »

чуть не словил инфаркт по сценарию из урока. дописал в teardown тестов settings put global adb_enabled 0, типа безопасность, и понял что натворил только когда планшет пропал из adb devices. хорошо что лежал на столе а не в стойке за 300 км. короче этот ключ вообще не трогайте из автоматики
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
nginx10
Сообщения: 1
Зарегистрирован: 11 май 2026, 15:50

Re: Модификация системных настроек через settings

Сообщение nginx10 »

а почему get возвращает null для screen_brightness_mode на свежепрошитом устройстве, хотя автояркость в настройках явно включена? правильно понимаю что дефолт зашит в коде и строчка в таблице появляется только после первого ручного изменения? просто скрипт у меня падал на парсинге null, пришлось ставить фолбек
👍2 ❤️1 🔥 😄 🤔
Аватара пользователя
VimHacker
Сообщения: 1
Зарегистрирован: 18 май 2026, 22:26

Re: Модификация системных настроек через settings

Сообщение VimHacker »

подтверждаю про диапазоны яркости. на poco x6 pro с hyperos ручной максимум выдает 2047, на старом samsung m31 ровно 255. так что совет снять максимум с каждого устройства перед написанием скрипта не паранойя а необходимость
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Root-доступ и его применение
Следующая глава →
Команды для поставщиков контента (content)

Все главы курса «ADB: Android Debug Bridge»

Поделиться темой: ✈ Telegram VK

Вернуться в «ADB: Android Debug Bridge»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость