AeadConfig.register()抛出IllegalAccessError异常排查求助
问题定位与解决办法
这个IllegalAccessError的核心是类访问权限不兼容:Tink的HmacKeyFormat类(由proto生成)试图访问Protobuf核心类AbstractMessage的memoizedSize字段,但该字段在你当前使用的Protobuf版本中是私有/包级私有,而Tink编译时依赖的Protobuf版本里这个字段的访问权限更宽松。
哪怕你已经确认依赖树里Protobuf版本无冲突,也可能存在以下隐性问题,对应解决办法如下:
1. 严格对齐Tink与Protobuf的版本兼容性
Tink对Protobuf版本有明确要求,不同Tink版本对应特定的Protobuf版本范围,比如:
- Tink 1.7.x 适配 Protobuf 3.19.x
- Tink 1.8.x+ 适配 Protobuf 3.20.x+
检查你的Tink版本,强制指定匹配的Protobuf版本,在Gradle中配置:
// 锁定Protobuf版本为Tink要求的对应版本 implementation platform("com.google.protobuf:protobuf-bom:3.24.4") // 引入匹配的Tink版本 implementation "com.google.crypto.tink:tink:1.11.0"
2. 清理编译缓存与旧生成类
如果之前用不同版本的Protobuf编译器生成过类,缓存的旧类会和当前版本冲突:
- 执行Gradle命令彻底清理:
./gradlew clean build --refresh-dependencies - 确保所有proto文件都用当前指定的Protobuf版本重新编译
3. 排查多模块项目的依赖隔离问题
如果是多模块项目,个别子模块可能绕过根项目的版本约束,引入了不同版本的Protobuf:
- 对每个子模块执行
./gradlew :[模块名]:dependencies,逐个排查Protobuf依赖 - 确保所有模块都通过
platform或强制版本锁定使用统一的Protobuf版本
4. 解决Protobuf Lite与Full版本冲突
Tink默认依赖Protobuf Lite版本,如果项目中同时引入了Full版本,会导致类定义不一致:
- 在Gradle中排除Tink依赖的Full版本,明确引入Lite版本:
implementation("com.google.crypto.tink:tink") { exclude group: "com.google.protobuf", module: "protobuf-java" } implementation "com.google.protobuf:protobuf-java-lite:3.24.4"
验证步骤
- 执行
./gradlew dependencies | grep protobuf,确认所有Protobuf相关依赖版本完全一致 - 清理缓存后重新编译项目
- 运行初始化代码,确认
AeadConfig.register()正常执行
内容的提问来源于stack exchange,提问作者feroze
相关产品推荐
相关产品推荐

