安全
安全 · androidx.security
Security State:检查系统安全补丁1.1.0-rc01
获取系统/厂商安全补丁级别与 WebView 包信息,用于安全敏感功能的前置判断。
最后更新 2026-08-01
复制即用
import android.os.Bundle
import androidx.security.state.SecurityStateManagerCompat
val manager = SecurityStateManagerCompat(context)
val state: Bundle = manager.getGlobalSecurityState()
val systemSpl = state.getString(
SecurityStateManagerCompat.KEY_SYSTEM_SPL,
) // "YYYY-MM-DD"
val vendorSpl = state.getString(
SecurityStateManagerCompat.KEY_VENDOR_SPL,
)Bundle 里的完整字段
| Key | 类型 | 含义 |
|---|---|---|
KEY_SYSTEM_SPL | String | 系统安全补丁级别(YYYY-MM-DD) |
KEY_VENDOR_SPL | String | 厂商安全补丁级别 |
KEY_KERNEL_VERSION | String | 内核版本(X.X.XX) |
KEY_SYSTEM_SUPPLEMENTAL_PATCHES | String[] | 系统补充 CVE 列表 |
KEY_VENDOR_SUPPLEMENTAL_PATCHES | String[] | 厂商补充 CVE 列表 |
| WebView 包名 | String | SDK 26+ 时加入当前 WebView 包的版本号 |
平台版本差异
- SDK < 35:手动从
Build.VERSION.SECURITY_PATCH、ro.vendor.build.security_patch(反射 SystemProperties)等属性拼装;补充补丁从/system/etc/security/supplemental_security_patches.xml、/vendor/etc/security/...xml等配置文件解析。 - SDK 35/36(BAKLAVA):从
android.os.SecurityStateManager系统服务取 Bundle,补充补丁仍手动加载。 - SDK > 36:系统服务返回全部,无需手动补充。
补丁级别比较(安全敏感功能前置判断)
import java.time.LocalDate
fun isSecurityPatchOutdated(
state: Bundle,
minimumDate: String, // "2025-01-01"
): Boolean {
val systemSpl = state.getString(
SecurityStateManagerCompat.KEY_SYSTEM_SPL,
) ?: return true // 无法获取视为过旧
val patchDate = try {
LocalDate.parse(systemSpl)
} catch (e: Exception) {
return true
}
return patchDate.isBefore(LocalDate.parse(minimumDate))
}常见陷阱
- Bundle 字段可能缺失:个别设备厂商不提供 vendor SPL,取不到要降级处理。
- SDK < 23:
Build.VERSION.SECURITY_PATCH不可用(源码getSecurityPatchLevelSafe返回空)。 - 反射获取 vendor SPL:SDK 35 以下用 SystemProperties 反射,失败返回空串。
- 比较用日期字符串:直接字典序比较 “YYYY-MM-DD” 格式恰好可用,但建议
LocalDate.parse。
要点
getGlobalSecurityState()返回Bundle,用KEY_SYSTEM_SPL、KEY_VENDOR_SPL取安全补丁级别,KEY_SYSTEM_SUPPLEMENTAL_PATCHES/KEY_VENDOR_SUPPLEMENTAL_PATCHES取补充 CVE 列表。- 适合安全敏感功能(支付、身份验证)的前置检查:补丁过旧时给出提示或降级。
- SDK 35+ 走系统服务
SecurityStateManager;更旧版本手动拼装(含反射)。 - 该库是新 API(1.1.0-beta02),具体字段和常量以当前源码
SecurityStateManagerCompat.kt为准。