安卓如何查看settings是被哪个进程更新的?相关dumpsys命令剖析
背景:
经常在开发中会使用settings来保存共享一些数据,方便各个进程进行直接读取,这样就不需要额外写跨进程接口了,但是settings值也是可以被多个进程进行修改的只要这些进程是有权限和系统签名的话。
那涉及了多个进程一起修改,那有时候需要排查到底是谁修改的settings,这个谁一般是进程名字,比如包名等。
这个需求昨天有vip学员在群里提出
如果这个需求问题大家没有做过的话,可能会有如下这种思路:
大概思路就是直接去对应的SettingProvider中相关写入方法加入log,而且调用getCallingUid
方式获取写入的用户是谁,一般可以理解为直接获取了进程包名。
那么有没有更好的方法呢?不需要修改任何代码,直接使用命令既可以查看到呢?
命令查看
这里就有我们广大学员分享了相关的命令:
哈哈,是不是感觉还是人多力量大,集合一下广大学员的智慧大家一起进步,马哥也和大家一起进步。
那么尝试一下这个命令结果如下:
adb shell dumpsys settings命令使用后,结果如下:
test@test:~$ adb shell dumpsys settings
CONFIG SETTINGS (user 0)
version: -1
_id:0 name:aconfigd_marker/bulk_synced pkg:aconfig value:true default:false defaultSystemSet:true tag:aconfig
_id:1 name:aconfigd_marker/compare_diff_num pkg:aconfig value:0 default:0 defaultSystemSet:true tag:aconfigHistorical operationsGLOBAL SETTINGS (user 0)
version: 226
_id:115 name:adb_wifi_enabled pkg:android value:0 default:0 defaultSystemSet:true
_id:44 name:low_battery_sound_timeout pkg:android value:0 default:0 defaultSystemSet:true
_id:79 name:wear_os_version_string pkg:android value: default: defaultSystemSet:true
_id:36 name:car_undock_sound pkg:android value:/product/media/audio/ui/Undock.ogg default:/product/media/audio/ui/Undock.ogg defaultSystemSet:true
_id:66 name:obtain_paired_device_location pkg:android value:1 default:1 defaultSystemSet:true
_id:154 name:enable_freeform_support pkg:com.android.settings value:1 default:1 defaultSystemSet:true
_id:83 name:system_capabilities pkg:android value:99 default:99 defaultSystemSet:true
_id:117 name:apm_enhancement_enabled pkg:android value:1 default:1 defaultSystemSet:true
_id:94 name:ambient_plugged_timeout_min pkg:android value:-1 default:-1 defaultSystemSet:true
_id:898 name:view_capture_enabled pkg:root value:0
_id:155 name:development_settings_enabled pkg:com.android.settings value:1 default:1 defaultSystemSet:true
_id:12 name:window_animation_scale pkg:android value:1.0 default:1.0 defaultSystemSet:true
_id:131 name:multi_sim_data_call pkg:com.android.phone value:1 default:1 defaultSystemSet:true
_id:77 name:last_call_forward_action pkg:android value:-1 default:-1 defaultSystemSet:true
_id:122 name:tether_offload_disabled pkg:com.android.sdksetup value:1 default:1 defaultSystemSet:true
_id:69 name:smart_illuminate_enabled pkg:android value:1 default:1 defaultSystemSet:true
_id:1162 name:mode_ringer pkg:android value:2 default:2 defaultSystemSet:true
_id:95 name:paired_device_os_type pkg:android value:0 default:0 defaultSystemSet:true
_id:39 name:default_install_location pkg:android value:0 default:0 defaultSystemSet:true
_id:25 name:wifi_display_on pkg:android value:0 default:0 defaultSystemSet:true
_id:47 name:device_name pkg:android value:Android SDK built for x86_64 default:Android SDK built for x86_64 defaultSystemSet:true
_id:15 name:wifi_networks_available_notification_on pkg:android value:1 default:1 defaultSystemSet:true
_id:32 name:dock_sounds_enabled_when_accessbility pkg:android value:0 default:0 defaultSystemSet:true
_id:16 name:bluetooth_on pkg:android value:1 default:1 defaultSystemSet:true
_id:84 name:wear_platform_mr_number pkg:android value:0 default:0 defaultSystemSet:true
_id:21 name:mobile_data pkg:android value:1 default:1 defaultSystemSet:true
_id:1233 name:network_watchlist_last_report_time pkg:android value:1760716800000 default:1760716800000 defaultSystemSet:true
_id:49 name:database_creation_buildid pkg:android value:AP3A.241005.015.A2 default:AP3A.241005.015.A2 defaultSystemSet:true
_id:40 name:emergency_tone pkg:android value:0 default:0 defaultSystemSet:true
_id:56 name:max_sound_trigger_detection_service_ops_per_day pkg:android value:1000 default:1000 defaultSystemSet:true
_id:50 name:add_users_when_locked pkg:android value:0 default:0 defaultSystemSet:true
_id:37 name:dock_audio_media_enabled pkg:android value:1 default:1 defaultSystemSet:true
_id:101 name:tethered_config_state pkg:android value:0 default:0 defaultSystemSet:true
_id:126 name:verifier_verify_adb_installs pkg:com.android.sdksetup value:0 default:0 defaultSystemSet:true
_id:86 name:ambient_enabled pkg:android value:1 default:1 defaultSystemSet:true
_id:103 name:wear_media_sessions_package pkg:android value: default: defaultSystemSet:true
_id:92 name:ambient_force_when_docked pkg:android value:0 default:0 defaultSystemSet:trueHistorical operations
2025-10-18 03:15:13 persist
2025-10-18 03:15:13 update boot_count
2025-10-18 03:15:09 persist
2025-10-18 03:15:09 update network_watchlist_last_report_time
可以看到展示了每一个Settings值的详细信息
_id:56 name:max_sound_trigger_detection_service_ops_per_day pkg:android value:1000 default:1000 defaultSystemSet:true
这里面的pkg其实就是我们想要的最后更新进程的包名。
但是也有同学提出了疑问,凭啥就认为这里的pkg 就是最后的更新者的包名,而不是这个Setting第一个创建者包名呢?其实这个问题提的也很好哈,这里疑问验证大家也可以考虑分析源码或者实战验证方式。
实战验证方式:
这里我们采用adb shell的settings命令来更新一下enable_freeform_support的值,然后看看他的pkg名字是否在更新后有变化。
更新前:
test@test:~$ adb shell dumpsys settings | grep enable_freeform_support
_id:154 name:enable_freeform_support pkg:com.android.settings value:1 default:1 defaultSystemSet:true
可以看到enable_freeform_support的pkg为com.android.settings即settings进行的最后设置。
然后使用adb shell settings put global enable_freeform_support 0进行更新为0,再看看pkg是否会变化
test@test:~$ adb shell settings put global enable_freeform_support 0
test@test:~$ adb shell dumpsys settings | grep enable_freeform_support
_id:1235 name:enable_freeform_support pkg:root value:0 default:1 defaultSystemSet:true
明显看到这里的pkg变成root,其实也就是我们的adb shell哈,明显pkg不是原来的settings了
原理剖析
根据上面dump输出找到pkg对应代码如下
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
这里的getPackageName实际上是如下代码进行设置的
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
private void init(String name, String value, String tag, String defaultValue,String packageName, boolean fromSystem, String id,boolean isValuePreservedInRestore) {this.name = name;this.value = value;this.tag = tag;this.defaultValue = defaultValue;this.packageName = packageName;android.util.Log.i("Settings",name + " init packageName " + packageName,new Exception());this.id = id;this.defaultFromSystem = fromSystem;this.isValuePreservedInRestore = isValuePreservedInRestore;}
针对这个设置部分加入对应的堆栈打印,相关日志堆栈打印验证:
根据上面堆栈一直追踪,这里的callingPackage在如下代码进行获取的
可以看出dumpsys settings中看到的pkg确实是最后进程更新的package。
原文地址:https://mp.weixin.qq.com/s/3DUz9qWl5F-j69HLojwEcA
更多framework实战技术干货,请关注下面“千里马学框架”