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

Android 12调用getEncryptedSharedPrefs崩溃,报Protobuf无效标签错误

Android 12下EncryptedSharedPreferences崩溃排查与修复

问题详情

启动Activity时,调用getEncryptedSharedPrefs()处触发崩溃,该问题仅在Android 12上出现,Android 10/11可正常运行。

报错信息

Caused by: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException: Protocol message contained an invalid tag (zero).

相关代码

初始化PIN设置的逻辑:

if(getEncryptedSharedPrefs().getString("pinSettingsLogin", "")!!.isEmpty()){
    getEncryptedSharedPrefs().edit()
        .putString("pinSettingsLogin" , "0000")
        .apply()
}

自动跳转设置页的逻辑:

if(getEncryptedSharedPrefs().getString("pinSettingsLogin", "").equals("0000")){
    val i = Intent(this, SettingsActivity::class.java)
    startActivity(i)
    overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
}

原因分析

Android 12对EncryptedSharedPreferences的底层protobuf序列化逻辑做了变更,当加密存储文件损坏、首次初始化时的数据格式不兼容,或者重复创建加密SharedPreferences实例时,容易触发这个无效标签异常。另外,代码中使用!!强制非空,会放大异常影响范围。

修复方案

1. 捕获异常并修复损坏的存储文件

在获取加密SharedPreferences实例时添加异常捕获,检测到protobuf异常时删除损坏的存储文件,重新初始化:

private fun getSafeEncryptedSharedPrefs(): SharedPreferences {
    return try {
        // 替换为你原有的getEncryptedSharedPrefs()实现
        getEncryptedSharedPrefs()
    } catch (e: com.google.crypto.tink.shaded.protobuf.InvalidProtocolBufferException) {
        // 删除损坏的加密SharedPreferences文件
        val prefsDir = File(filesDir.parent, "shared_prefs")
        val targetFile = File(prefsDir, "你的加密偏好文件名.xml") // 替换为实际文件名
        if (targetFile.exists()) {
            targetFile.delete()
        }
        // 重新获取实例
        getEncryptedSharedPrefs()
    }
}

2. 优化代码逻辑,避免重复初始化与强制非空

统一使用安全获取方法,避免多次创建实例,同时替换!!为安全的空处理:

val encryptedPrefs = getSafeEncryptedSharedPrefs()
val pinSetting = encryptedPrefs.getString("pinSettingsLogin", "") ?: ""

// 初始化PIN设置
if (pinSetting.isEmpty()) {
    encryptedPrefs.edit()
        .putString("pinSettingsLogin", "0000")
        .apply()
}

// 跳转设置页逻辑
if ("0000".equals(encryptedPrefs.getString("pinSettingsLogin", ""))) {
    val intent = Intent(this, SettingsActivity::class.java)
    startActivity(intent)
    overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left)
}

3. 确保Tink库版本兼容

如果使用Google Tink库实现加密SharedPreferences,升级到适配Android 12的稳定版本,比如在gradle中更新依赖:

implementation "com.google.crypto.tink:tink-android:1.7.0" // 或更高稳定版

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:20:26