Android --- Daten nach Fota-Upgrade verloren

Das Phänomen besteht darin, dass nach dem Upgrade des Telefons von Android R auf Android S die Uhrdaten auf R verloren gehen.
Nach eingehender Untersuchung wurde festgestellt, dass es sich nicht um einen Datenverlust handelte, sondern durch die unterschiedlichen Datenspeicherorte von R und S.

Führen Sie den folgenden Befehl aus, um den Datenbankspeicherort des Alarms abzufragen:

adb shell find /data  -name alarms.db

R ist:
/data/data/com.android.deskclock/databases/alarms.db
/data/user/0/com.android.deskclock/databases/alarms.db
S ist:
/data/user_de/0/com.android .deskclock/databases/alarms.db
nach dem Upgrade von R auf S lautet:
/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

Die /data/data/-Partition und die /data/user/0/-Partition sind der mit Anmeldeinformationen verschlüsselte Speicher, der der Standardspeicherort ist und erst verfügbar ist, nachdem der Benutzer das Gerät entsperrt hat.
Die Partition /data/user_de/0/ ist der verschlüsselte Speicher des Geräts. Dieser Speicherort ist im Direktstartmodus und nachdem der Benutzer das Gerät entsperrt hat, verfügbar.

Unterstützt den „Direktstart“-Modus | Android-Entwickler | Android-Entwickler

Wenn Sie die folgenden Attribute in AndroidManifest.xml hinzufügen, ändern Sie den Datenspeicherbereich von einem mit Anmeldeinformationen verschlüsselten Speicher (der Zugriff ist nur möglich, wenn das Gerät entsperrt ist) in einen mit dem Gerät verschlüsselten Speicher (auf die Daten kann ohne Entsperren zugegriffen werden).

android:defaultToDeviceProtectedStorage="true"

Durch Lesen des ContextWapper-Quellcodes können Sie die folgende Methode verwenden, um die Datenbank und SharedPreferences des mit Anmeldeinformationen verschlüsselten Speichers (auf den nur zugegriffen werden kann, wenn das Gerät entsperrt ist) in den mit dem Gerät verschlüsselten Speicher zu migrieren (auf die Daten kann ohne Entsperren zugegriffen werden).

Verwenden Sie im Anbieter zunächst die Methode isDeviceProtectedStorge(), um zu ermitteln, ob es sich derzeit um einen geräteverschlüsselten Speicherbereich handelt. Wenn ja, verwenden Sie die folgende Methode, um die Datenbank zu migrieren. Beachten Sie, dass der erste Parameter der Kontext des ursprünglichen verschlüsselten Speichers mit Anmeldeinformationen ist. Sie müssen die Methode context.createCredentialProtectedStorageContext() verwenden. Rufen Sie den Kontext des verschlüsselten Anmeldeinformationsspeichers ab. Diese Methode löscht die im ursprünglichen Credentials Encrypted-Bucket gespeicherten Daten und migriert die Originaldaten in den neu erstellten Device Encrypted-Bucket.

storageContext.moveDatabaseFrom(context.createCredentialProtectedStorageContext(), ClockDatabaseHelper.DATABASE_NAME)

Rufen Sie dann die folgende Methode auf, um die in verschlüsselten Anmeldeinformationen gespeicherten SharedPreferences zu migrieren

Der erste Parameter ist auch der Kontext des verschlüsselten Anmeldeinformationsspeichers und der zweite Parameter ist der Name der SharedPreferences, die im verschlüsselten Anmeldeinformationsspeicher gespeichert sind.

storageContext.moveSharedPreferencesFrom(context.createCredentialProtectedStorageContext(),
                        PreferenceManager.getDefaultSharedPreferencesName(context.createCredentialProtectedStorageContext()));

@Override
    public 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;
    }

Guess you like

Origin blog.csdn.net/m0_50408097/article/details/125263847