Skip to content

Commit fe6a6ac

Browse files
xaionaro@dx.centerxaionaro@dx.center
authored andcommitted
perf(bindercli): skip binder connection in service methods for known services
Use static KnownServiceNames + registry lookup before opening a binder connection. For services already in the static tables (like "phone"), this eliminates the entire binder connection overhead (NewTransport, API detection, revision probing). Also compute transaction codes from method declaration order (FirstCallTransaction + index) instead of showing "????" when no version table is available.
1 parent d7951e2 commit fe6a6ac

2 files changed

Lines changed: 53 additions & 41 deletions

File tree

cmd/bindercli/cmd_service.go

Lines changed: 28 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -217,27 +217,34 @@ func newServiceMethodsCmd() *cobra.Command {
217217
ctx := cmd.Context()
218218
name := args[0]
219219

220-
conn, err := OpenConn(ctx, cmd)
221-
if err != nil {
222-
return err
220+
if generatedRegistry == nil {
221+
return fmt.Errorf("no method registry available")
223222
}
224-
defer conn.Close(ctx)
225223

226-
svc, err := conn.GetService(ctx, name)
227-
if err != nil {
228-
return err
229-
}
224+
// Try static lookup first (no binder connection needed).
225+
descriptor, info := lookupServiceStatic(name)
230226

231-
descriptor := discovery.QueryDescriptor(ctx, svc)
227+
// Fall back to binder connection for unknown services.
228+
if info == nil {
229+
conn, err := OpenConn(ctx, cmd)
230+
if err != nil {
231+
return err
232+
}
233+
defer conn.Close(ctx)
232234

233-
// InterfaceTransaction may return empty on some services.
234-
// Fall back to the static knownServiceNames map (reverse lookup).
235-
if descriptor == "" || descriptor == "(unknown)" {
236-
for desc, svcName := range discovery.KnownServiceNames {
237-
if svcName == name {
238-
descriptor = desc
239-
break
240-
}
235+
svc, err := conn.GetService(ctx, name)
236+
if err != nil {
237+
return err
238+
}
239+
240+
descriptor = discovery.QueryDescriptor(ctx, svc)
241+
if descriptor == "" || descriptor == "(unknown)" {
242+
return fmt.Errorf("cannot determine interface descriptor for service %q", name)
243+
}
244+
245+
info = generatedRegistry.ByDescriptor(descriptor)
246+
if info == nil {
247+
return fmt.Errorf("unknown interface %q for service %q — not in registry", descriptor, name)
241248
}
242249
}
243250

@@ -246,38 +253,18 @@ func newServiceMethodsCmd() *cobra.Command {
246253
return fmt.Errorf("reading --format flag: %w", err)
247254
}
248255

249-
if generatedRegistry == nil {
250-
return fmt.Errorf("no method registry available")
251-
}
252-
253-
info := generatedRegistry.ByDescriptor(descriptor)
254-
if info == nil {
255-
// Also try looking up by alias (the service name itself).
256-
info = generatedRegistry.ByAlias(name)
257-
}
258-
if info == nil {
259-
return fmt.Errorf("unknown interface %q for service %q — not in registry", descriptor, name)
260-
}
261-
262-
table, tableErr := getActiveTable(conn)
263-
264256
f := NewFormatter(mode, os.Stdout)
265257
switch f.Mode {
266258
case "json":
267259
f.WriteJSON(map[string]any{
268260
"descriptor": descriptor,
269-
"methods": methodsToJSONWithCodes(info.Methods, table, descriptor),
261+
"methods": methodsToJSONWithCodes(info.Methods, nil, descriptor),
270262
})
271263
default:
272264
fmt.Fprintf(f.W, "Interface: %s (%d methods)\n\n", descriptor, len(info.Methods))
273-
for _, m := range info.Methods {
274-
codeStr := " ???? "
275-
if tableErr == nil {
276-
if code, ok := resolveMethodToCode(table, descriptor, m.Name); ok {
277-
codeStr = fmt.Sprintf(" 0x%04x", code)
278-
}
279-
}
280-
fmt.Fprintf(f.W, "%s %s\n", codeStr, formatMethodSignature(m))
265+
for i, m := range info.Methods {
266+
code := binder.FirstCallTransaction + binder.TransactionCode(i)
267+
fmt.Fprintf(f.W, " 0x%04x %s\n", code, formatMethodSignature(m))
281268
}
282269
}
283270

cmd/bindercli/resolve.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,31 @@ func getActiveTable(c *Conn) (versionaware.VersionTable, error) {
5757
return vat.ActiveTable(), nil
5858
}
5959

60+
// lookupServiceStatic tries to resolve a service name to its descriptor
61+
// and registry info using only static data (KnownServiceNames + registry).
62+
// Returns ("", nil) if the service is not in static tables.
63+
func lookupServiceStatic(name string) (string, *ServiceInfo) {
64+
if generatedRegistry == nil {
65+
return "", nil
66+
}
67+
68+
// Try alias lookup first (service name → registry entry).
69+
if info := generatedRegistry.ByAlias(name); info != nil {
70+
return info.Descriptor, info
71+
}
72+
73+
// Try reverse lookup from KnownServiceNames (descriptor → service name).
74+
for desc, svcName := range discovery.KnownServiceNames {
75+
if svcName == name {
76+
if info := generatedRegistry.ByDescriptor(desc); info != nil {
77+
return desc, info
78+
}
79+
}
80+
}
81+
82+
return "", nil
83+
}
84+
6085
// resolveDescriptor determines the AIDL interface descriptor for a named
6186
// service, fetching it from the binder connection.
6287
func resolveDescriptor(

0 commit comments

Comments
 (0)