Settings provider system和global表格数据访问

来源:互联网 发布:歌曲串烧软件 编辑:程序博客网 时间:2024/06/05 11:33

我们都知道Settings有system/ global和secure 三个表格,但是有没有发现,其实在读取3个表格数据时,并非仅仅从固定表格中读取,读取其中一个时,还会去读取另外2个,如果发现被挪到别的表格,这可能是为了兼容。

126|A3A:/ # cd data/system/users/0/                                                                                                                                     A3A:/data/system/users/0 # ls -ltotal 144-rw------- 1 system system 20294 2017-01-01 10:55 app_idle_stats.xml-rw------- 1 system system   554 2017-01-01 08:14 appwidgets.xml-rw-rw---- 1 system system 45024 2017-01-01 08:18 package-restrictions.xmldrwxrwx--x 2 system system  4096 2017-01-01 08:13 registered_services-rw------- 1 system system 18755 2017-01-01 08:01 runtime-permissions.xml-rw------- 1 system system 13552 2017-01-01 10:00 settings_global.xml-rw------- 1 system system  9182 2017-01-01 08:20 settings_secure.xml-rw------- 1 system system  2231 2017-01-01 08:18 settings_ssaid.xml-rw------- 1 system system 12784 2017-01-01 08:30 settings_system.xml-rw------- 1 system system   180 2017-01-01 08:01 wallpaper_info.xmlA3A:/data/system/users/0 # 

以上是/data/system/users/0目录下对应的3个表存储。

发现问题:
发现我们程序中System和Global中存在同名key(name),即:

Settings.Global.BATTERY_PERCENTAGE和Settings.System.BATTERY_PERCENTAGE所标识的字串内容相同

我们真正Settings操纵更新的是Settings.Global, 结果我们程序读取Settings.System,可以同步读取到Settings.Global中储存的状态值。

既然隶属与不同的表,不应该发生这种情况。
battery percentage settings.system

关键点就在于Settings.System.getInt()的操作和MOVED_TO_GLOBAL。

/frameworks/base/core/java/android/provider/Settings.java        /** @hide */        public static String getStringForUser(ContentResolver resolver, String name,                int userHandle) {            if (MOVED_TO_SECURE.contains(name)) {                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"                        + " to android.provider.Settings.Secure, returning read-only value.");                return Secure.getStringForUser(resolver, name, userHandle);            }            if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) {                Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"                        + " to android.provider.Settings.Global, returning read-only value.");                return Global.getStringForUser(resolver, name, userHandle);            }            return sNameValueCache.getStringForUser(resolver, name, userHandle);        }

MOVED_TO_GLOBAL有声明

        private static final HashSet<String> MOVED_TO_GLOBAL;        private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL;        static {            MOVED_TO_GLOBAL = new HashSet<String>();            MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<String>();            // these were originally in system but migrated to secure in the past,            // so are duplicated in the Secure.* namespace            MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED);            ......            MOVED_TO_GLOBAL.add(Settings.Global.BATTERY_PERCENTAGE);  // 关键点            MOVED_TO_GLOBAL.add(Settings.Global.CAR_UNDOCK_SOUND);

原创粉丝点击