A simple and modern call recorder app for Android.
- Freebug records all incoming and outgoing across a wide range of apps.
- The app has been tested with the system dialer (Phone app) and WhatsApp on stock Android and GrapheneOS.
- For other apps and OSes, your mileage may vary.
- There is no definitive list of supported apps since Freebug takes an app-agnostic heuristics-based approach.
![]() |
![]() |
![]() |
|---|---|---|
![]() |
Android tries its best to prevent call recordings, so Freebug's approach has some problems that are likely unfixable:
- Caller audio is quiet/muffled. This can make the app unusable in noisy environments (in quiet environments, callers are still fairly audible). This is not a problem when the call is on speakerphone.
- Recordings are also likely to miss caller audio if calls are answered through earbuds, watches, headsets, etc.
- Freebug's call detection code is language-specific so whether or not a call is recorded depends partly on the device language. Support for languages other than English is currently very limited and must be added on a per-language basis.
- Due to an Android bug, switching user profiles on the device will cause Freebug to stop working correctly. There is no way to detect when this happens and notify the user, so users may falsely believe things are working when they are not. The user must manually check on Freebug's accessibility service in their OS settings and restart it if necessary.
- A NotificationListenerService watches all notifications come and go.
- Each notification is categorized as a "call" or "not call" notification depending on some simple heuristics.
- We exploit the fact that most call apps show a notification throughout the duration of the call, to tell if a call is ongoing.
- This lets us take an app-agnostic approach (instead of having to write custom code for WhatsApp, Signal, Google Dialer, etc.) — if it looks like a call, we record it (obviously this could lead to false positives, the rates of which should go down as the filtering logic is improved over time). Note however, that this method is language-specific.
- To do this properly, we must be able to read all the notification content, even for notifications that Android categorizes as "sensitive" (including call notifications). For this reason, we must have the
RECEIVE_SENSITIVE_NOTIFICATIONSpermission, which can only be granted via ADB.
- If an ongoing call is detected, we use an AccessibilityService to record it.
- An AccessibilityService is used because it is the only kind of service that is allowed to start using the microphone when the recording app is not in the foreground.
- Accessibility services are also much less prone to being killed by battery optimization, so we use it to restart the notification listener if that gets killed off.
- Battery optimization for the app in general also must be turned off to further improve resilience.
- When a call ends, the recording is saved to the Android
Recordingsdirectory, which can be written to without any file access permissions.




