Java调用Kotlin库Release包编译报错,如何保留@Throws注解?
解决Kotlin库@Throws注解被ProGuard移除导致Java客户端编译错误的问题
问题根因
你推测的结论正确:ProGuard在处理Release版本时移除了@Throws(MyCustomException::class)注解,使得Java编译器无法识别doSomething()方法会抛出该异常,从而触发编译错误。之前的-keepattributes *Annotation*和-keep class kotlin.**配置未生效,是因为它们没有明确保留带有@Throws注解的方法及其注解信息。
解决方案
在ProGuard配置文件中添加以下规则,精准保留所需的注解和相关类:
1. 保留@Throws注解类本身
-keep class kotlin.jvm.Throws
2. 保留所有带有@Throws注解的方法
这条规则确保ProGuard不会移除方法上的@Throws注解:
-keepclassmembers class * { @kotlin.jvm.Throws <methods>; }
3. 保留自定义异常类(关键)
如果MyCustomException被混淆,Java客户端同样无法正确识别异常类型,因此必须保留该类:
-keep class com.your.package.MyCustomException { public <init>(); }
请将com.your.package替换为MyCustomException实际的包路径。
完整ProGuard配置示例
将以下内容添加到你的proguard-rules.pro文件中:
# 保留Kotlin@Throws注解类 -keep class kotlin.jvm.Throws # 保留带有@Throws注解的所有方法 -keepclassmembers class * { @kotlin.jvm.Throws <methods>; } # 保留自定义异常类 -keep class com.your.package.MyCustomException { public <init>(); } # 原有必要配置 -keepattributes *Annotation* -keep class kotlin.**
验证步骤
重新构建Release版本的Kotlin库,让Java客户端引入该版本后,编译错误即可消除。
内容的提问来源于stack exchange,提问作者Adam Johns
相关产品推荐
相关产品推荐

