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
相关产品推荐
相关产品推荐

