从 Android SyncAdapter 调用服务方法时 gRPC 失败

Paw*_*zur 5 android grpc

我花了一些时间才发现只有当我尝试从 SyncAdapter 使用 gRPC 客户端时才会导致以下错误:

No functional channel service provider found. Try adding a dependency on the grpc-okhttp or grpc-netty artifact
Run Code Online (Sandbox Code Playgroud)

设置与官方教程使用同步适配器传输数据完全一样。

我已经使用与grpc-java 中的示例相同的设置生成了 gRPC 代码。compile 'com.squareup.okhttp:okhttp:2.2.0'示例中的依赖项不是必需的,因为compile 'io.grpc:grpc-okhttp:0.9.0'已修改为自包含。

当从主活动调用 gRPC 服务方法时,它工作正常。

我怀疑grpc-okhttp必须以某种方式初始化,但不知道如何初始化。

Paw*_*zur 4

我决定阅读gRPC的代码。我用来创建频道的代码是:

mChannel = ManagedChannelBuilder.forAddress(mHost, mPort)
        .usePlaintext(true).build();
Run Code Online (Sandbox Code Playgroud)

通用 ManagedChannelBuilder 类的工作方式是动态加载所有扩展类ManageChannelBoulder并选择具有最高优先级的类。然后所选的类将被记住在静态变量中。

似乎在调用SyncAdapter适当的 okhttp 构建器时不可用。我通过对所选的构建器进行硬编码来修复它:

mChannel = OkHttpChannelBuilder.forAddress(mHost, mPort)
        .usePlaintext(true).build();
Run Code Online (Sandbox Code Playgroud)

我希望能拯救某人的夜晚。

  • 直接使用“OkHttpChannelBuilder”是一种可以接受的解决方法。通常,该问题是由 ProGuard 或类似的删除看似未使用的类引起的。在 ProGuard 中执行 `-keep class io.grpc.okhttp.OkHttpChannelProvider` 可能会解决该问题。 (2认同)