数据库是保存用户数据的文件,包括默认的设置和个人重新设置的数据,这些数据保存在/data/data下的各个以
apk包名为目录名的路径下:
#cd /data/data
#busybox find ./ -name "*.db" -print
./com.Android.email/databases/EmailProviderBody.db
-
./com.Android.email/databases/EmailProvider.db
./com.Android.rk.books/databases/books.db
./com.Android.providers.contacts/databases/contacts2.db
./com.google.Android.gm/databases/gmail.db
./com.google.Android.gm/databases/downloads.db
./com.Android.vending/databases/assets.db
./com.Android.providers.media/databases/internal.db
./com.Android.providers.media/databases/external.db
./com.Android.deskclock/databases/alarms.db
./yd.spreadwin.launcher/databases/launcher.db
./com.Android.providers.calendar/databases/calendar.db
./com.darshancomputing.BatteryIndicatorPro/databases/alarms.db
./com.darshancomputing.BatteryIndicatorPro/databases/logs.db
./com.google.Android.gsf/databases/googlesettings.db
./com.google.Android.gsf/databases/subscribedfeeds.db
./com.google.Android.gsf/databases/talk.db
./com.google.Android.gsf/databases/gservices.db
./com.google.Android.gsf/databases/gls.db
./com.cooliris.media/databases/picasa.db
./com.Android.providers.downloads/databases/downloads.db
./com.Android.providers.settings/databases/settings.db
手动删除掉这些数据库文件,重启机器后相关的应用就会使用默认值重新加载数据库,如设置应用的数据库:
/data/data/com.Android.providers.settings/databases/settings.db
删掉settings.db,重启即可删掉设置里的个人设置的数据。
打开android设备上的settings.db数据库
C:\Documents and Settings\Administrator>adb shell
# sqlite3 data/data/com.android.providers.settings/databases/settings.db
sqlite3 data/data/com.android.providers.settings/databases/settings.db
SQLite version 3.6.22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .databases
.databases
seq name file
--- --------------- ----------------------------------------------------------
0 main //data/data/com.android.providers.settings/databases/setti
sqlite> .tables
.tables
android_metadata bookmarks system
bluetooth_devices secure
sqlite> select * from system;
select * from system;
1|volume_music|11
2|volume_ring|5
3|volume_system|7
4|volume_voice|4
5|volume_alarm|6
6|volume_notification|5
7|volume_bluetooth_sco|7
8|mode_ringer|2
9|vibrate_on|4
10|mode_ringer_streams_affected|166
11|mute_streams_affected|46
12|dim_screen|1
13|stay_on_while_plugged_in|0
14|screen_off_timeout|60000
15|emergency_tone|0
16|call_auto_retry|0
17|dtmf_tone_type|0
18|hearing_aid|0
19|tty_mode|0
20|airplane_mode_on|0
21|airplane_mode_radios|cell,bluetooth,wifi
22|airplane_mode_toggleable_radios|wifi
23|auto_time|1
24|screen_brightness|102
25|screen_brightness_mode|0
26|window_animation_scale|1.0
27|transition_animation_scale|1.0
28|accelerometer_rotation|1
29|haptic_feedback_enabled|1
30|notification_light_pulse|1
31|set_install_location|0
32|default_install_location|0
33|power_sounds_enabled|1
34|low_battery_sound|/system/media/audio/ui/LowBattery.ogg
35|dock_sounds_enabled|0
36|desk_dock_sound|/system/media/audio/ui/Dock.ogg
37|desk_undock_sound|/system/media/audio/ui/Undock.ogg
38|car_dock_sound|/system/media/audio/ui/Dock.ogg
39|car_undock_sound|/system/media/audio/ui/Undock.ogg
40|lockscreen_sounds_enabled|0
41|lock_sound|/system/media/audio/ui/Lock.ogg
42|unlock_sound|/system/media/audio/ui/Unlock.ogg
43|vibrate_in_silent|1
44|volume_ring_last_audible|5
45|next_alarm_formatted|
46|ringtone|content://media/internal/audio/media/8
47|notification_sound|content://media/internal/audio/media/41
48|alarm_alert|content://media/internal/audio/media/56
//删除指定字段记录
sqlite> delete from system where _id=2;
delete from secure where _id=2;
sqlite>
备注:
此数据库由:frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java 创建,
其默认初始值位置:frameworks\base\packages\SettingsProvider\res\values\defaults.xml
由于需要修改Setting默认设定的需要,需要分析下Setting的源码,以及数据存储与读取。
Android自带的应用程序存储在packages/apps目录下
主要目录和文件如下:
其中resouce是资源文件,src是源代码,tests中含有测试代码。而Android.mk和AndroidManifest.xml分别是编译以及应用程序全局数据。
源码的布局当然也是遵循Java的package管理方式。我们以了解Settings – Sound & Display – Orientation 为线索,了解整个Settings应用的工作原理。因为我目前开发的目标板没有gsenser,我的目标是把该项的默认为unchecked。
res/xml/setting.xml中指定Settings包含的选项,从中找到Sound and Display相关的一项
根据targetClass的定义,我们便可以从源码中找到对应的SoundAndDisplaySettings类。
Sound & Display选项中仍有很多子选项,Orientation只是Sound & Display选项中的一项。同样道理,在res/xml/sound_and_display_settings.xml中,可以找到Orientation选项的定义。
如何知道accelerometer就是Orientation呢?一方面,从字面意思猜个8、9不离10,另一方面,从packages/apps/Settings/res/values/strings.xml(如下图)也可以看出accelerometer就是对应着Orientation,(默认语言的字符串描述,如果选择了中文语言,那么则在packages/apps/Settings/res/values-zh-rCN/strings.xml找到中文的描述)
进到源码中,常量字符串KEY_ACCELEROMETER定义了该选项的唯一标识。
在OnCreate()初始化中,系统使用了findPreference找到了acclerometer在xml中的描述,把获取的Preference类型强制转换为CheckBoxPreference类。
当该Checkbox被点击后,来到响应按钮的代码,若checkbox为checked则写1否则写0
Setting.System.putInt做的工作,就是把这个选项修改的值写到数据库中去,PutString函数:
数据库存储于com.android.providers.settings/databases/settings.db 。ANDROID的数据库是采用SQLite存储的,把settings.db复制出来,然后使用sqlite管理工具打开,可以看到刚写进去的值:
accelerometer_rotation的值为0,表示orientation这个Checkbox为not checked.
至此,我们了解了,几乎所有的Settings默认值都会写在settings.db中,若要修改的默认选项值较多,可以使用sqlite数据库工具,手动修改settings.db中的值。已达到批量修改默认值的目的,系统在下次启动时,会自动加载这些写在Settings.db中的值。在批量生产前,只需要把修改后的settings.db 压制到data.img再烧录到系统中就好了。当然,也可以从源码入手,修改该默认值。
还需要了解的一个问题是:系统又是如何在开机设定这个我们设定的Orientation的状态呢?思路无非是从settings.db中读取数据库的值,然后设定相应的状态。
首先,要确定编译时平台的Policy,在build/target/product/core.mk中,有这样的描述:
编译选项中,PRODUCT_POLICY为android.policy_phone。那么系统启动就会采用phone这个Policy。启动读取数据库的值,相关的一个类是PhoneWindowManager(同理,mid对应着MidWindowManager)
从frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java找到这个类,
这里只关注Orientation这个Checkbox的相关的功能,虽然PhoneWindowManager.java两千多行代码,这里只看Update方法中相关的几行:
这几行就是从settings.db数据库中取得Orientation项的值,如果这个值默认值0不等(即值为1)的话,那么就updateOrientationListenerLp();
整个的分析路线是