Android KeyStore 在 Android Instant App 中崩溃

问题描述

val masterKey =
            MasterKey
            .Builder(applicationContext)
            .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
            .build()

在 Instant App 中运行此代码会导致我的应用程序崩溃并显示以下堆栈跟踪:

2020-12-21 13:07:29.654 28949-28949/com.example.instantappandroidkeystore E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.instantappandroidkeystore,PID: 28949
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.instantappandroidkeystore/com.example.instantappandroidkeystore.MainActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int android.security.keystore.IKeystoreService.exist(java.lang.String,int)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3448)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:237)
        at android.app.ActivityThread.main(ActivityThread.java:7814)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068)
     Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int android.security.keystore.IKeystoreService.exist(java.lang.String,int)' on a null object reference
        at android.security.KeyStore.contains(KeyStore.java:408)
        at android.security.keystore.AndroidKeyStoreSpi.engineContainsAlias(AndroidKeyStoreSpi.java:1038)
        at java.security.KeyStore.containsAlias(KeyStore.java:1293)
        at androidx.security.crypto.MasterKeys.keyExists(MasterKeys.java:154)
        at androidx.security.crypto.MasterKeys.getOrCreate(MasterKeys.java:96)
        at androidx.security.crypto.MasterKey$Builder.buildOnM(MasterKey.java:357)
        at androidx.security.crypto.MasterKey$Builder.build(MasterKey.java:314)
        at com.example.instantappandroidkeystore.MainActivity.onCreate(MainActivity.kt:32)
        at android.app.Activity.performCreate(Activity.java:7955)
        at android.app.Activity.performCreate(Activity.java:7944)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1307)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3423)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3595) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2147) 
        at android.os.Handler.dispatchMessage(Handler.java:107) 
        at android.os.Looper.loop(Looper.java:237) 
        at android.app.ActivityThread.main(ActivityThread.java:7814) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1068) 

我没能在 StackOverflow 中找到这个问题,但我在 Google 问题跟踪器中找到了它,但没有任何回应。所以我创建了一个问题给谷歌,提供更多信息。 https://issuetracker.google.com/issues/176085956

有没有人遇到过这个问题并且能够解决它。

我的工作环境是:

  • Mac 操作系统 10.15.7
  • Android Studio 4.0.1
  • 三星 A70
  • Android 版本 10

解决方法

虽然这在 developer.android 论坛上没有正式记录,但 AndroidKeyStore 似乎限制了免安装应用的访问。我发现了这个链接 https://www.reddit.com/r/androiddev/comments/7a4tdw/why_no_hardware_backed_keystore_in_instant_apps/

keystore 受到限制并且没有 android 文档对此进行解释,这很奇怪。我不确定访问 KeyStore 的替代方案,因为我们对常规应用程序(非即时)的密钥库有很多依赖,我想不出更好的选择。期待建议!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...