欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > Android >内容正文

Android

Android --- fota升级后,数据丢失

发布时间:2024/3/26 Android 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Android --- fota升级后,数据丢失 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

现象是手机从AndroidR升级到AndroidS以后,clock在R上的数据丢失了。
经过深入的调查发现,并不是数据丢失;而是R和S的数据存储位置不同导致的。

使以下命令查询闹钟的数据库存储位置:

adb shell find /data -name alarms.db

R是:
/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升级后,数据丢失的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。