最近在设置Android 设置的一些预置默认值,感觉还是挺复杂的。最近又选择性失忆了,还是记一下。
Android的设置的服务端是由SettingsProvider提供的,代码路径:frameworks/base/packages/SettingsProvider ,实际上这是个操作数据库的服务,并提供给设置的应用部分去调用,个人理解,可能描述不太对。下面分析代码均以 frameworks/base/packages/SettingsProvider 目录作为根目录。
SettingsProvider的代码都在src/com/android/providers/settings目录下,有下面几个文件。
DatabaseHelper.java SettingsBackupAgent.java SettingsHelper.java SettingsProvider.java
建立数据库,并加载默认设置值的是DatabaseHelper.java文件,今天只看这个文件。
在文件里有这个函数:
private void loadSettings(SQLiteDatabase db) {
loadSystemSettings(db);
loadSecureSettings(db);
}
这就是加载默认值的函数,实际上只是按照一些定义和变量来插入数据库记录而已,在里面可以发现有2种加载默认值的方式:
1: loadBooleanSetting(stmt, Settings.System.AIRPLANE_MODE_ON, R.bool.def_airplane_mode_on);
这个函数会去读资源里的默认值,这个资源的定义的路径在下面的文件里:
res/values/defaults.xml
这个比较简单,就不做分析了,其实大部分的默认值都在这个文件里定义了。
2: loadSetting(stmt,Settings.System.SCREEN_OFF_TIMEOUT,SystemProperties.getInt("ro.rk.screenoff_time",
mContext.getResources().getInteger(R.integer.def_screen_off_timeout)));
这个函数首先会去读系统的属性,如果有值则使用这个值,如果没有则使用后面得到的值。后面的值其实就是第1种定义默认值的方式。
系统属性的定义在相关的device的device.mk文件里,下面是代码片段:
PRODUCT_PROPERTY_OVERRIDES += \
persist.sys.usb.config=mass_storage,adb \
persist.sys.strictmode.visual=false \
dalvik.vm.jniopts=warnonly \
ro.rksdk.version=RK30_ANDROID$(PLATFORM_VERSION)-SDK-v1.00.00 \
sys.hwc.compose_policy=6 \
ro.sf.fakerotation=true \
ro.sf.hwrotation=270 \
ro.rk.MassStorage=false \
wifi.interface=wlan0 \
ro.sf.lcd_density=120 \
ro.rk.screenoff_time=1800000 \
终上所述,系统设置的打部分默认值都在这2个地方可以更改。注意上面的persist.sys.usb.config=mass_storage,adb 这一行,是更改默认adb是否打开的代码,这在 SettingsProvider里没有定义,但是如果要打开adb,在persist.sys.usb.config=mass_storage,后面加上adb就可以,具体代码实现以后再做分析了。