Xamarin Android绑定库调用setLocalTime报GeneratedMessageLite类缺失问题
问题产生原因
- 报错的根本原因是绑定库遗漏了两类依赖类:一是Polar SDK内部用Protobuf Lite生成的
protocol.PftpRequest$PbPFtpSetLocalTimeParams请求参数类,二是Protobuf Lite基础库的com.google.protobuf.GeneratedMessageLite核心类。 - 其他方法可以正常调用是因为这些方法的逻辑不需要用到Protobuf序列化的参数结构,只有
setLocalTime()方法需要构造对应的Protobuf格式请求体,触发类加载时才会暴露缺失问题。 - 做绑定的时候通常会为了减少警告,默认过滤掉非公开包路径的类,
protocol包属于Polar SDK内部实现包,很容易被绑定规则排除,同时Protobuf Lite属于SDK的传递依赖,不会默认被包含进绑定产物。
修复方法
- 第一步:调整绑定规则保留内部proto类
打开绑定库项目的Transforms/Metadata.xml文件,删除所有针对protocol包的<remove-node>过滤规则,确保protocol包下的所有类都能被正常生成C#绑定包装。如果之前配置了只绑定指定包路径的公开类,需要把protocol包加入允许绑定的路径列表。 - 第二步:补充Protobuf Lite依赖
二选一即可:- 把Polar SDK对应版本的protobuf-lite jar包加入绑定库项目,构建动作设置为
EmbeddedJar,会直接把Protobuf Lite的类打包进你的绑定库产物,下游项目不需要额外安装依赖。 - 在使用绑定库的Xamarin Android项目中,直接安装对应版本的
Xamarin.Google.Protobuf.LiteNuGet包即可。
- 把Polar SDK对应版本的protobuf-lite jar包加入绑定库项目,构建动作设置为
- 第三步:验证生效
重新编译绑定库后,先检查生成的绑定代码中是否存在PftpRequest.PbPFtpSetLocalTimeParams对应的C#类,再调用setLocalTime()方法即可正常执行。
内容的提问来源于stack exchange,提问作者Simon Corcos
相关产品推荐
相关产品推荐

