1.SettingsProvider
之前的一些系統(tǒng)設(shè)置內(nèi)容如亮度届氢、音量大小等都存儲(chǔ)在settings.db這個(gè)數(shù)據(jù)庫(kù)中缠借,但在8.0上數(shù)據(jù)庫(kù)不見了究履。在8.0上都存在幾個(gè)xml文件中了川慌,其實(shí)從6.0開始就已經(jīng)開始了這種操作亡笑,只不過(guò)6.0上并沒有刪除原始數(shù)據(jù)庫(kù)侣夷,從7.0開始系統(tǒng)刪除了原始數(shù)據(jù)庫(kù)。簡(jiǎn)單看一下源碼:
android\frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java
在SettingsProvider的onCreate中構(gòu)造了SettingsRegistry類仑乌,其中有個(gè)migrateAllLegacySettingsIfNeeded方法對(duì)數(shù)據(jù)庫(kù)進(jìn)行遷移百拓,遷移到最后,有這樣一段代碼:
if (DROP_DATABASE_ON_MIGRATION) {
dbHelper.dropDatabase();
} else {
dbHelper.backupDatabase();
}
在6.0上DROP_DATABASE_ON_MIGRATION定義為:
private static final boolean DROP_DATABASE_ON_MIGRATION = !Build.IS_DEBUGGABLE;
在8.0上定義為:
private static final boolean DROP_DATABASE_ON_MIGRATION = true;
所以我們?cè)?.0上由于開發(fā)用的是debug版本晰甚,數(shù)據(jù)庫(kù)并沒有被刪除衙传,而8.0上直接置為true,刪除了該數(shù)據(jù)庫(kù)厕九。
再看一下xml文件的存儲(chǔ)位置:
private static final String SETTINGS_FILE_GLOBAL = "settings_global.xml";
private static final String SETTINGS_FILE_SYSTEM = "settings_system.xml";
private static final String SETTINGS_FILE_SECURE = "settings_secure.xml";
private File getSettingsFile(int key) {
if (isGlobalSettingsKey(key)) {
final int userId = getUserIdFromKey(key);
return new File(Environment.getUserSystemDirectory(userId),
SETTINGS_FILE_GLOBAL);
} else if (isSystemSettingsKey(key)) {
final int userId = getUserIdFromKey(key);
return new File(Environment.getUserSystemDirectory(userId),
SETTINGS_FILE_SYSTEM);
} else if (isSecureSettingsKey(key)) {
final int userId = getUserIdFromKey(key);
return new File(Environment.getUserSystemDirectory(userId),
SETTINGS_FILE_SECURE);
} else if (isSsaidSettingsKey(key)) {
final int userId = getUserIdFromKey(key);
return new File(Environment.getUserSystemDirectory(userId),
SETTINGS_FILE_SSAID);
} else {
throw new IllegalArgumentException("Invalid settings key:" + key);
}
}
可見在下面路徑里(單用戶時(shí)userId 為0):
data/system/users/userId
不同類型的設(shè)置量對(duì)應(yīng)不同的xml文件蓖捶,如settings_system.xml。
最后在多提一點(diǎn)扁远,原來(lái)的DatabaseHelper已被廢棄了俊鱼,如果需要新加字段刻像,需要在SettingsProvider中的內(nèi)部類UpgradeController里的onUpgradeLocked方法添加,可以看到這個(gè)方法里已經(jīng)添加了許多東西并闲,我們可以當(dāng)做模版自行添加细睡,需要注意的是最后currentVersion一定要更新:
private int onUpgradeLocked(int userId, int oldVersion, int newVersion) {
...
if (currentVersion == 147) {
// Version 148: Set the default value for DEFAULT_RESTRICT_BACKGROUND_DATA.
if (userId == UserHandle.USER_SYSTEM) {
final SettingsState globalSettings = getGlobalSettingsLocked();
final Setting currentSetting = globalSettings.getSettingLocked(
Global.DEFAULT_RESTRICT_BACKGROUND_DATA);
if (currentSetting.isNull()) {
globalSettings.insertSettingLocked(
Global.DEFAULT_RESTRICT_BACKGROUND_DATA,
getContext().getResources().getBoolean(
R.bool.def_restrict_background_data) ? "1" : "0",
null, true, SettingsState.SYSTEM_PACKAGE_NAME);
}
}
currentVersion = 148;
}
...
}
}
2.TelephonyProvider
TelephonyProvider的數(shù)據(jù)庫(kù)以前在下面目錄:
/data/data/com.android.providers.telephony
現(xiàn)在在下面目錄:
/data/user_de/0/com.android.providers.telephony