HealthConnect 开启ProGuard的release模式权限对话框失效崩溃问题
问题现象
应用在启用ProGuard的release模式下运行时崩溃,权限对话框无法正常工作,崩溃日志如下:
Fatal Exception: java.lang.IllegalArgumentException: Unknown data type name h0 at android.os.Parcel.createExceptionOrNull(Parcel.java:2429) at android.os.Parcel.createException(Parcel.java:2409) at android.os.Parcel.readException(Parcel.java:2392) at android.os.Parcel.readException(Parcel.java:2334) at androidx.health.platform.client.service.IHealthDataService$Stub$Proxy.getGrantedPermissions(IHealthDataService.java:414) at androidx.health.platform.client.impl.ServiceBackedHealthDataClient.getGrantedPermissions$lambda-1(ServiceBackedHealthDataClient.kt:93) at androidx.health.platform.client.impl.ServiceBackedHealthDataClient.$r8$lambda$hhWerw-hyBNCC_kPGtX4mZNDQdM(ServiceBackedHealthDataClient.kt) at androidx.health.platform.client.impl.ServiceBackedHealthDataClient$$InternalSyntheticLambda$0$605e77fbbfc877805d8dd88d131a334eb9370ed10712fd7118bc908c2d0b7ca2$0.execute(ServiceBackedHealthDataClient.java:6) at androidx.health.platform.client.impl.ipc.Client$3.execute(Client.java:279) at androidx.health.platform.client.impl.ipc.internal.ServiceConnection.execute(ServiceConnection.java:243) at androidx.health.platform.client.impl.ipc.internal.ServiceConnection.enqueue(ServiceConnection.java:200) at androidx.health.platform.client.impl.ipc.internal.ConnectionManager.handleMessage(ConnectionManager.java:123) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.os.HandlerThread.run(HandlerThread.java:67)
结论
必须为Health Connect API添加对应ProGuard规则。
该崩溃的根本原因是ProGuard/R8默认混淆了Health Connect SDK中用于跨进程IPC通信的序列化类,日志中的h0就是被混淆后的类名,Health Connect服务端解析跨进程传递的权限数据时找不到对应类型,直接抛出非法参数异常。
修复步骤
- 打开项目对应业务模块下的
proguard-rules.pro混淆配置文件 - 在文件中追加如下规则,避免Health Connect SDK用于IPC通信的类被混淆:
# 保留Health Connect SDK所有类不被混淆,避免跨进程序列化失败 -keep class androidx.health.** { *; } -keepclassmembers class androidx.health.** { *; }
- 清理构建缓存后重新执行release构建,安装新包即可验证效果:崩溃问题会消失,权限对话框可正常弹出。
补充说明:1.0.0-alpha01及更高版本的Health Connect SDK已经自带consumer混淆规则,正常引入不需要手动配置。如果高版本仍出现该问题,检查是否有自定义全局混淆规则覆盖了SDK自带规则,手动添加上述规则即可强制修复。
内容的提问来源于stack exchange,提问作者B'havdip Dhameliya
相关产品推荐
相关产品推荐

