{"record":{"id":"4d21b8729861ae56","repo":"grpc/grpc-java","slug":"call-foraddress-instead","errorCode":null,"errorMessage":"call forAddress() instead","messagePattern":"call forAddress\\(\\) instead","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"binder/src/main/java/io/grpc/binder/BinderServerBuilder.java","lineNumber":58,"sourceCode":"   * Creates a server builder that will listen for bindings to the specified address.\n   *\n   * <p>The listening {@link IBinder} associated with new {@link Server}s will be stored in {@code\n   * binderReceiver} upon {@link #build()}. Callers should return it from {@link\n   * Service#onBind(Intent)} when the binding intent matches {@code listenAddress}.\n   *\n   * @param listenAddress an Android Service and binding Intent associated with this server.\n   * @param receiver an \"out param\" for the new {@link Server}'s listening {@link IBinder}\n   * @return a new builder\n   */\n  public static BinderServerBuilder forAddress(\n      AndroidComponentAddress listenAddress, IBinderReceiver receiver) {\n    return new BinderServerBuilder(listenAddress, receiver);\n  }\n\n  /** Always fails. Call {@link #forAddress(AndroidComponentAddress, IBinderReceiver)} instead. */\n  @DoNotCall(\"Unsupported. Use forAddress() instead\")\n  public static BinderServerBuilder forPort(int port) {\n    throw new UnsupportedOperationException(\"call forAddress() instead\");\n  }\n\n  private final ServerImplBuilder serverImplBuilder;\n  private final BinderServer.Builder internalBuilder = new BinderServer.Builder();\n  private boolean isBuilt;\n\n  private BinderServerBuilder(\n      AndroidComponentAddress listenAddress, IBinderReceiver binderReceiver) {\n    internalBuilder.setListenAddress(listenAddress);\n\n    serverImplBuilder =\n        new ServerImplBuilder(\n            (streamTracerFactories, metricRecorder) -> {\n              internalBuilder.setStreamTracerFactories(streamTracerFactories);\n              BinderServer server = internalBuilder.build();\n              BinderInternal.setIBinder(binderReceiver, server.getHostBinder());\n              return server;\n            });","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/binder/src/main/java/io/grpc/binder/BinderServerBuilder.java#L40-L76","documentation":"BinderServerBuilder.forPort(int port) is intentionally unsupported: a Binder gRPC server listens via an IBinder handed to an IBinderReceiver for an Android component, not a TCP port. The @DoNotCall method always throws UnsupportedOperationException directing you to forAddress(AndroidComponentAddress, IBinderReceiver).","triggerScenarios":"Calling BinderServerBuilder.forPort(50051) — typically ported ServerBuilder.forPort(...) code on the binder transport.","commonSituations":"Refactoring an on-device TCP gRPC server to binder IPC while keeping ServerBuilder.forPort; template code that assumes port-based servers.","solutions":["Use BinderServerBuilder.forAddress(AndroidComponentAddress, IBinderReceiver) instead","Provide an IBinderReceiver implementation that receives the listening IBinder for publishing via the Android component"],"exampleFix":"// before\nServer server = BinderServerBuilder.forPort(50051).build();\n// after\nServer server = BinderServerBuilder.forAddress(\n    AndroidComponentAddress.forComponent(componentName), ibinderReceiver)\n    .addService(myService).build();","handlingStrategy":"validation","validationCode":"if (listenAddress instanceof AndroidComponentAddress) {\n  server = BinderServerBuilder.forAddress((AndroidComponentAddress) listenAddress, receiver).build();\n} else {\n  server = ServerBuilder.forPort(port).addService(service).build();\n}","typeGuard":"static boolean isBinderListenAddress(SocketAddress addr) {\n  return addr instanceof AndroidComponentAddress;\n}","tryCatchPattern":"try {\n  return BinderServerBuilder.forAddress(componentAddr, receiver).addService(svc).build();\n} catch (UnsupportedOperationException e) {\n  throw new IllegalStateException(\"Binder servers use forAddress(AndroidComponentAddress, IBinderReceiver)\", e);\n}","preventionTips":["Replace ServerBuilder.forPort patterns when switching to binder servers","Always supply an IBinderReceiver when building a binder server","Isolate binder server creation behind a helper method"],"tags":["grpc","binder","android","unsupported-operation"],"backgroundTag":"unsupported-operation","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}