一、 概述
在Android启动之后,我们通常需要根据自己的一些需要来设置一些符合我们使用习惯的属性。例如:来电铃声、锁屏时间、日期格式等等。而这些属性的设置通常是有Settings为入口,通过SettingsProvider来进行的。SettingsProvider也是所有系统设置的管理者。在M(Android5.0)版本之前,SettingsProvider中系统设置是存储在settings.db数据库中;但是在L(Android6.0)之后,SettingsProvider中系统设置改为由xml存储在data分区。
二、Android M之前的SettingsProvider
进入/data/data/com.android.providers.settings/databases
# cd /data/data/com.android.providers.settings/databases
# sqlite3 settings.db
sqlite3 有可能提示找不到,这是由于在当前版本中sqlite3程序没有被编译到system中,这里我们只需要手动push一个sqlite3就好了。
在使用sqlite3打开settings.db数据库之后,可以使用.help
来查看有关sqlite3的一些帮助信息。这里常用的如下所示:
2.1 系统设置初始化
这些属性是如何被写入到SettingsProvider中的呢?
请参照如下代码。
frameworks/base/packages/SettingsProvider/src/com/Android/providers/settings/DatabaseHelper.java
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
2.2 系统设置的修改
系统属性的设置,我们可以通过修改源码,编译生成SettingsProvider.apk并安装到系统中,就能生效。
这里在提供一种更简便的方法
adb shell settings,有关其详细用法,可以参照如下提示:
$ adb shell settings get system ringtone
content://media/internal/audio/media/59
$ adb shell settings set system ringtone "content://media/internal/audio/media/60"
Invalid command: set
usage: settings [--user NUM] get namespace key
settings [--user NUM] put namespace key value
settings [--user NUM] delete namespace key
'namespace' is one of {system, secure, global}, case-insensitive
If '--user NUM' is not given, the operations are performed on the owner user.
$ adb shell settings put system ringtone "content://media/internal/audio/media/60"
$ adb shell settings get system ringtone
content://media/internal/audio/media/60
三、Android L 的SettingsProvider
在Android L版本中,Google团队为了优化系统性能、提高安全性等等一些列需求,重构了SettingsProvider模块,在L版本中,不在使用数据库来存储系统设置,而是通过xml将系统设置存储在了/data/system/user/ 目录下
有关L版本中SettingsProvider的修改更新方法同之前的相同