You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android生成加密SharedPreferences时遇KeyStore内存分配失败异常求助

排查android.security.KeyStoreException: Memory allocation failed异常原因及解决办法

问题代码

private var masterKey = MasterKey.Builder(applicationContext)
        .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
        .build()
var sharedPreferences: SharedPreferences = EncryptedSharedPreferences.create(
        applicationContext,
        ENCRYPTED_SHARED_PREFERENCE,
        masterKey,
        EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
        EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)

异常原因分析

  • 设备硬件限制:部分低配置或老旧Android设备的KeyStore模块内存分配上限较低,生成AES256级别的密钥时会超出内存阈值,触发分配失败
  • 初始化时机过早:在Application.onCreate阶段就初始化加密SharedPreferences,此时系统服务(包括KeyStore)尚未完全就绪,内存资源未分配充足
  • 重复生成密钥:多次调用MasterKey.build()会在KeyStore中遗留冗余密钥,占用额外内存,最终触发内存分配失败

解决办法

  • 延迟初始化:不在Application启动时立即初始化,等第一次实际用到加密SharedPreferences的场景(比如进入主Activity后)再创建实例
  • 降低密钥强度(适配低配置设备):如果业务对加密强度要求不高,改用AES128减少内存占用,修改代码如下:
    private var masterKey = MasterKey.Builder(applicationContext)
            .setKeyScheme(MasterKey.KeyScheme.AES128_GCM)
            .build()
    
  • 单例化密钥与SharedPreferences:用懒加载确保只生成一次密钥,避免重复创建占用内存:
    private val masterKey by lazy {
        MasterKey.Builder(applicationContext)
            .setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
            .build()
    }
    
    private val sharedPreferences by lazy {
        EncryptedSharedPreferences.create(
            applicationContext,
            ENCRYPTED_SHARED_PREFERENCE,
            masterKey,
            EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
            EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
        )
    }
    
  • 清理冗余凭据(测试设备适用):进入系统设置-安全-凭据存储,清除已保存的凭据,删除KeyStore中的冗余密钥释放内存

内容的提问来源于stack exchange,提问作者sreejith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 13:52:40