Xamarin Release启用R8时Here SDK for Android构建报错问询
问题背景
- 现有一套已升级至5.0版本的Xamarin Forms应用,包含Android绑定库在内的所有构建任务均可成功完成。因Release构建过程中出现多个Proguard相关错误,已将代码压缩工具从Proguard切换为R8。
故障现象
Release模式下,3.16~3.20版本的Here SDK for Android(Premium Edition)存在部分功能异常,涉及SearchRequest、TextAutoSuggestionRequest两个接口:
- 代码压缩器设置为空、或运行Debug模式时,两项功能均可正常运行
- Release模式启用R8的场景下,
SearchRequest无法返回任何结果,TextAutoSuggestionRequest会直接导致应用崩溃
崩溃错误日志如下:
W System.err: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.nokia.maps.AutoSuggestImpl W System.err: at com.nokia.maps.PlacesTextAutoSuggestionResult.a(Unknown Source:34) W System.err: at com.nokia.maps.PlacesBaseRequest.c(Unknown Source:253) W System.err: at com.nokia.maps.PlacesBaseRequest.onResult(Unknown Source:57) W System.err: at com.nokia.maps.PlacesBaseRequest.poll(Native Method) W System.err: at com.nokia.maps.PlacesBaseRequest.d(Unknown Source:0) W System.err: at com.nokia.maps.PlacesBaseRequest$h.a(Unknown Source:33) W System.err: at com.nokia.maps.PlacesBaseRequest$h.doInBackground(Unknown Source:2) W System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333) W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266) W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) W System.err: at java.lang.Thread.run(Thread.java:764) W System.err: java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.nokia.maps.AutoSuggestImpl W System.err: at com.nokia.maps.PlacesTextAutoSuggestionResult.a(Unknown Source:34) W System.err: at com.nokia.maps.PlacesBaseRequest.c(Unknown Source:253) W System.err: at com.nokia.maps.PlacesBaseRequest.onResult(Unknown Source:57) W System.err: at com.nokia.maps.PlacesBaseRequest.poll(Native Method) W System.err: at com.nokia.maps.PlacesBaseRequest.d(Unknown Source:0) W System.err: at com.nokia.maps.PlacesBaseRequest$h.a(Unknown Source:33) W System.err: at com.nokia.maps.PlacesBaseRequest$h.doInBackground(Unknown Source:2) W System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333) W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266) W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) W System.err: at java.lang.Thread.run(Thread.java:764)
已尝试的排查操作
目前已复用原有Proguard配置文件,额外新增了大量-keep class规则,几乎覆盖了所有相关包名,同时尝试以下操作均未解决问题:
- 关闭Multidex
- 启用AOT编译+LVVM优化
- 将开发环境从VS 2019切换为VS 2022 Enterprise
解决方案
报错的核心原因是R8混淆裁剪过程中,擦除了Here SDK通过Gson做反序列化依赖的类成员、泛型签名信息,并非类被直接删除。普通-keep class规则仅能保留类名不被混淆,无法保留反射所需的完整类结构,因此之前的配置不生效。
补充以下R8规则即可修复问题:
- 完整保留
com.nokia.maps包下所有类的类名、成员、方法,不做混淆和裁剪:
-keep class com.nokia.maps.** { *; } -keepclassmembers class com.nokia.maps.** { *; }
- 保留Gson反射实例化对象必需的构造方法:
-keepclassmembers class com.nokia.maps.** { public <init>(...); }
- 保留泛型签名、注解等Gson序列化依赖的属性,同时保留Gson本身的类结构不被优化:
-keepattributes Signature,*Annotation*,EnclosingMethod -keep class com.google.gson.** { *; } -dontwarn com.google.gson.**
- 检查Xamarin Android项目配置:确认编写的R8规则文件生成操作设置为
ProguardConfiguration,避免规则文件未被纳入构建流程。
配置完成后,清理解决方案,删除obj、bin目录下的全部构建缓存,重新执行Release构建即可。此前尝试的Multidex开关、AOT+LVVM、VS版本切换均和该问题无关,不需要调整。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

