Android --- fota升级后,数据丢失
現象是手機從AndroidR升級到AndroidS以后,clock在R上的數據丟失了。
經過深入的調查發現,并不是數據丟失;而是R和S的數據存儲位置不同導致的。
使以下命令查詢鬧鐘的數據庫存儲位置:
adb shell find /data -name alarms.dbR是:
/data/data/com.android.deskclock/databases/alarms.db
/data/user/0/com.android.deskclock/databases/alarms.db
S是:
/data/user_de/0/com.android.deskclock/databases/alarms.db
從R升級到S后是:
/data/data/com.android.deskclock/databases/alarms.db
/data/user/0/com.android.deskclock/databases/alarms.db
/data/user_de/0/com.android.deskclock/databases/alarms.db
/data/data/分區和/data/user/0/分區是憑據加密存儲,這是默認存儲位置,僅在用戶解鎖設備后可用。
/data/user_de/0/分區是設備加密存儲,該存儲位置在“直接啟動”模式下和用戶解鎖設備后均可使用。
支持“直接啟動”模式 ?|? Android 開發者 ?|? Android Developers
如果在AndroidManifest.xml中增加以下屬性,將數據存儲區域從憑據加密存儲(在僅設備解鎖的時候可以訪問)改為設備加密存儲(不解鎖也可以訪問數據)
android:defaultToDeviceProtectedStorage="true"通過閱讀ContextWapper源碼,可以使用以下方法對憑據加密存儲(在僅設備解鎖的時候可以訪問)的數據庫及SharedPreferences遷移到設備加密存儲(不解鎖也可以訪問數據)。
在provider中,先使用isDeviceProtectedStorge()方法判斷當前是否是設備加密存儲區域,如果是,使用以下方法遷移數據庫,注意第一個參數是原來憑據加密存儲的context,需要使用context.createCredentialProtectedStorageContext()方法來獲取憑據加密存儲的context。此方法是刪除原來的憑據加密存儲分區中存儲的數據,并將原來的數據遷移到新創建的設備加密存儲分區。
storageContext.moveDatabaseFrom(context.createCredentialProtectedStorageContext(), ClockDatabaseHelper.DATABASE_NAME)再調用以下方法遷移憑據加密存儲的SharedPreferences
第一個參數也是憑據加密存儲的context,第二個參數是存儲在憑據加密存儲的SharedPreferences的名字。
storageContext.moveSharedPreferencesFrom(context.createCredentialProtectedStorageContext(),PreferenceManager.getDefaultSharedPreferencesName(context.createCredentialProtectedStorageContext())); @Overridepublic boolean onCreate() {Context context = getContext();Context storageContext;if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {if (context.isDeviceProtectedStorage()){// All N devices have split storage areas, but we may need to// migrate existing database into the new device encrypted// storage area, which is where our data lives from now on.storageContext = context.createDeviceProtectedStorageContext();if (!storageContext.moveDatabaseFrom(context.createCredentialProtectedStorageContext(), ClockDatabaseHelper.DATABASE_NAME)) {LogUtils.v("Failed to migrate database: ", ClockDatabaseHelper.DATABASE_NAME);}storageContext.moveSharedPreferencesFrom(context.createCredentialProtectedStorageContext(),PreferenceManager.getDefaultSharedPreferencesName(context.createCredentialProtectedStorageContext()));}else {storageContext = context;}} else {storageContext = context;}mOpenHelper = new ClockDatabaseHelper(storageContext);return true;}總結
以上是生活随笔為你收集整理的Android --- fota升级后,数据丢失的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信转发 jssdk的简单使用
- 下一篇: CAN总线接口芯片SIT1050Q和TJ