Skip to content

Android ExecuTorch :Improve debuggability and Triage #13981

@psiddh

Description

@psiddh

🚀 The feature, motivation and pitch

Design Overview: ETLogDumpService for Android Hosting Process

This design illustrates how native C++ logs are collected and exposed via an Android Java service (ETLogDumpService) inside the hosting process (e.g., an Android app or system service).

Architecture Diagram

Hosting Process (Android app)
┌───────────────────────────────────────────────────────────────────────────────┐
│ executorch.aar (library module) │
│ ┌───────────────────────────────────────────────────────────────────────────┐ │
│ │ ETLogDumpService (Java) │ │
│ │ • onLogCallback(String msg) ← JNI bridge from native C++ │ │
│ │ • ConcurrentLinkedQueue logsQueue │ │
│ │ • dump(FileDescriptor, PrintWriter, String[] args) │ │
│ │ └─> Iterates logsQueue and prints messages when dumpsys triggers │ │
│ └───────────────────────────────────────────────────────────────────────────┘ │
│ │
│ Native Layer (C++) │
│ • Generates logs │
│ • Calls ETLogDumpService.onLogCallback() via JNI │
│ │
│ Trigger Flow │
│ adb shell dumpsys activity service / │
│ └──> Android framework calls ETLogDumpService.dump() │
└───────────────────────────────────────────────────────────────────────────────┘

  • Outer box: Hosting process (Android app or system service)
  • Inner box: executorch.aar library module providing ETLogDumpService
  • JNI arrow: Native C++ code pushes logs into Java queue via JNI callback
  • Trigger flow: adb shell dumpsys ... command triggers the dump() method

Design Details

1. JNI Callback to Java Service

  • Native C++ code locates the ETLogDumpService Java class.

  • It calls the Java method onLogCallback(String msg) via JNI using:

FindClass
GetMethodID
CallVoidMethod
This pattern allows native code to push each log message string into Java.

  1. ConcurrentLinkedQueue for Log Buffering
  • onLogCallback() pushes each incoming log message into a ConcurrentLinkedQueue.
  • This queue is: Thread-safe & Non-blocking
  • Suitable for multiple producer threads concurrently adding logs
  • The queue buffers all logs until the dump() method is called.
  1. Dumpsys Triggering Log Dump
  • Running adb shell dumpsys activity service / invokes the Android framework to call:
  • ETLogDumpService.dump(FileDescriptor, PrintWriter, String[] args)
  • The overridden dump() method:
  • Iterates through the ConcurrentLinkedQueue (e.g., polling until empty)
  • Writes each log message to the PrintWriter output
  • This mechanism uses dumpsys as a trigger to output collected logs on demand.

Design Considerations

  • Queue Growth: Be mindful of unbounded queue growth if logs arrive faster than they are dumped.
  • Consider using a bounded queue like ConcurrentRingBuffer to mitigate memory issues.
  • Service Lifecycle: The host process must explicitly start ETLogDumpService early to begin collecting logs.

Alternatives

No response

Additional context

No response

RFC (Optional)

No response

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status

In Progress

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions