Crash AutoBackup
**Case : Crash di Android
Saya mengalami crash pada salah satu aplikasi, dengan log crash seperti terlampir. Crash ini hanya terjadi di satu perangkat Android, tidak di semua perangkat.
Setelah mencari solusi di Google, saya menemukan saran dari beberapa orang untuk menonaktifkan allowBackup di Android manifest dengan menambahkan:
android:allowBackup=“false”
Lalu, apa hubungannya dengan flag allowBackup?
Setelah saya telusuri dari log crash dan menelusuri sumber kodenya, ternyata crash disebabkan oleh penggunaan EncryptedSharedPreferences. Data yang disimpan menggunakan EncryptedSharedPreferences tidak boleh di backup secara otomatis. Mengapa?
Karena saat proses backup dilakukan, kunci enkripsi yang digunakan untuk menyimpan data tidak ikut di backup. Ketika data tersebut di-restore ke perangkat lain (atau bahkan perangkat yang sama dengan kondisi kunci sudah berubah/hilang), proses decrypt akan gagal, menyebabkan exception dan crash. Dengan info ini, jika masih ingin mengatur allowBackup TRUE, solusi lain adalah meng-exclude file yang dienkripsi dengan EncryptedSharedPreferences di backup rules ( ada di sebuah file XML )
Hal ini sebenarnya sudah disebutkan dalam dokumentasi EncryptedSharedPreferences sebagai peringatan.
========================================================================
Exception java.lang.RuntimeException: javax.crypto.AEADBadTagException
at org.######.cpp.#####.lambda$initializeIAPBilling$1 (####.java:21)
at android.os.Handler.handleCallback (Handler.java:942)
at android.os.Handler.dispatchMessage (Handler.java:99)
at android.os.Looper.loopOnce (Looper.java:226)
at android.os.Looper.loop (Looper.java:313)
at android.app.ActivityThread.main (ActivityThread.java:8757)
at java.lang.reflect.Method.invoke
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1067)
Caused by javax.crypto.AEADBadTagException:
at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal (AndroidKeyStoreCipherSpiBase.java:617)
at javax.crypto.Cipher.doFinal (Cipher.java:2132)
at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.decryptInternal (AndroidKeystoreAesGcm.java:1)
at com.google.crypto.tink.integration.android.AndroidKeystoreAesGcm.decrypt (AndroidKeystoreAesGcm.java:1)
at com.google.crypto.tink.KeysetHandle.decrypt (KeysetHandle.java:1)
at com.google.crypto.tink.KeysetHandle.readWithAssociatedData (KeysetHandle.java:1)
at com.google.crypto.tink.KeysetHandle.read (KeysetHandle.java:1)
at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.readMasterkeyDecryptAndParseKeyset (AndroidKeysetManager.java:1)
at com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build (AndroidKeysetManager.java:1)
at androidx.security.crypto.EncryptedSharedPreferences.create (EncryptedSharedPreferences.java:2)
at androidx.security.crypto.EncryptedSharedPreferences.create (EncryptedSharedPreferences.java:1)
at org.cocos2dx.cpp.AppActivity.initSecureSp (AppActivity.java:21)
at org.cocos2dx.cpp.AppActivity.lambda$initializeIAPBilling$1 (AppActivity.java:2)
Caused by android.security.KeyStoreException: Signature/MAC verification failed (internal Keystore code: -30 message: In KeystoreOperation::finish
Caused by:
0: In finish: KeyMint::finish failed.
1: Error::Km(ErrorCode(-30))) (public error code: 10 internal Keystore code: -30)
at android.security.KeyStore2.getKeyStoreException (KeyStore2.java:418)
at android.security.KeyStoreOperation.handleExceptions (KeyStoreOperation.java:78)
at android.security.KeyStoreOperation.finish (KeyStoreOperation.java:128)
at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer$MainDataStream.finish (KeyStoreCryptoOperationChunkedStreamer.java:228)
at android.security.keystore2.KeyStoreCryptoOperationChunkedStreamer.doFinal (KeyStoreCryptoOperationChunkedStreamer.java:181)
at android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer.doFinal (AndroidKeyStoreAuthenticatedAESCipherSpi.java:396)
at android.security.keystore2.AndroidKeyStoreCipherSpiBase.engineDoFinal (AndroidKeyStoreCipherSpiBase.java:609)
**