settings get
唯讀從手機的設定提供者讀出一個值。
- 指令
- adb shell settings get
- 指令
- 設定提供者
- 風險
- 唯讀
語法
settings get <system|secure|global> <key>旗標與參數
| token | 意義 |
|---|---|
| system | secure | global | 這個 key 在哪個命名空間。一共三個、是分開的表,問錯的那個會拿到「沒有」而不是錯誤。 |
範例
settings get global http_proxy確認手機有沒有指向某個除錯用的 proxy。
settings get global window_animation_scale在改之前先讀,這樣你手上才有能還原的值。
settings get system show_touches一個 `system` 的 key,用來說明命名空間並不總是 `global`。
輸出怎麼讀
輸出範例
null只有一行:值,或 `null` 這四個字元。`null` 是真正的答案而不是失敗——大多數開發者選項在新手機上根本沒設定過,它們的實際行為來自平台預設值而不是任何被存下來的東西。超過一行的東西不是值,是 shell 併進輸出裡的錯誤。
輸出欄位
| 欄位 | 意義 |
|---|---|
| <value> | 存下來的值,以文字形式。 |
| null | 這個 key 沒有設定,平台預設值生效。 |
| (a stack trace) | 讀取被拒絕。這不是值。 |
需要什麼權限
不用 root,也不用 `adb root`。`settings` 只是一行的 shell 腳本,內容是 `cmd settings "$@"`(AOSP 的 `cmds/settings/settings.sh`),所以另一端是用已授權 `adb` 連線的 `shell` 使用者身分來回答這次讀取的。讀取是這一家族權限故事裡明顯便宜的那一半:寫入那邊靠的是 `android.permission.WRITE_SECURE_SETTINGS`,而單純讀一個 `system`、`secure` 或 `global` 的 key,不需要任何 shell 缺少的東西。除了 USB 偵錯本身,這裡沒有東西藏在開發者選項的開關後面。有兩個細節決定你能不能相信一個很短的答案。值是用 `pout.println(...)` 印在 out 串流上的,而參數解析器的每一句抱怨——打錯的命名空間、多出來的一個字——都印在 err 串流上,而且指令會直接回傳 -1、根本沒去讀。把 stderr 丟掉,一次被拒絕的指令就變成一行空白,看起來和「這個 key 沒設定」一模一樣。另外,使用者是在讀取之前先決定的:沒有 `--user` 時,指令會先問 activity manager 目前是哪個使用者,然後讀那個使用者的表——所以一台有工作設定檔的手機,會依照前景是誰,對同一個 `secure` key 給出兩種不同的答案。
失敗訊息對照
| 訊息 | 意義 |
|---|---|
| Invalid namespace 'globl' | 第一個位置參數不是 `system`、`secure` 或 `global`。比對不分大小寫,所以 `Global` 沒問題,只有真的打錯才會走到這裡。解析就此停止、指令回傳 -1,所以什麼都沒讀到——這和「key 不存在」不是同一件事,即使兩者都讓你手上沒有值。這一行走 stderr。 |
| Invalid command: gett | 動詞不是 `get`、`put`、`delete`、`list`、`reset` 之一。把選項擺錯位置也會拿到它,因為解析器預期除了 `--user` 以外,動詞要排在最前面。什麼都沒讀到。 |
| Bad arguments | 解析器走到指令列尾端,卻始終沒有湊出一個完整的請求——`settings get global` 後面沒給 key 是最常見的原因。它是包山包海的那一種:它不會指名任何東西,所以請重讀整行而不是只看最後一個字。 |
| Too many arguments | 對 `get` 來說,key 是最後一個被接受的東西,後面再有什麼都直接拒絕。這正是一個含空白又沒加引號的 key 會產生的結果,而這其實是慈悲:另一種下場是它讀了第一個字,然後把它當成答案。 |
| cmd: Can't find service: settings | `cmd` 找不到 `settings` 服務可以把子指令交出去,因為 `settings.sh` 只是 `cmd settings` 的包裝。裝置還在開機、`system_server` 還沒登記它的時候,這是預期中的——等開機完成,不要把它當成 key 不存在。 |
版本與廠商注意事項
- 命名空間弄錯是無聲的:只是你問的那張表裡沒有這個 key,不會有任何錯誤讓你察覺。
- 寫之前先讀。平台不會替你記住原本的值,所以想知道要還原成什麼,只有這個指令。
這個我們有 UI
Android ADB Toolbox 會透過 USB 執行這個指令並解析回應——只要 Chromium 系瀏覽器,不必安裝 SDK,也不會上傳任何東西。
相關指令
和 settings get 會在同一次作業裡出現的指令。
| 指令 | 做什麼 |
|---|---|
| settings put | 把值寫進設定提供者——多數開發者選項小技巧背後的機制。 |
| getprop | 印出系統屬性——手機自己對「這是什麼」的回答。 |
| am broadcast | 送出廣播 intent,這是從 shell 驅動 SystemUI demo mode 等平台接收器的方法。 |
這些行為是在撰寫 Web ADB 工具背後的解析程式時,對照 AOSP、toybox 與核心原始碼查證的。真的會因 Android 版本或廠牌而異的地方,這一頁會直接說明,而不是給你一個在半數手機上都是錯的數字。