尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Android recorder that keeps the last minutes of sound in RAM so you can save what you just heard. Buffer sized to your device, no internet permission, free and open source (GPL-3.0).
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Audio Blackbox is a free, open-source Android app that records the last minutes of audio into RAM, so you can save something after it happened. It is for anyone who realizes too late that a moment was worth keeping: musicians and songwriters, people thinking out loud, meetings and agreements you are part of, and family moments. The rolling buffer is at least 5 minutes, set in 5-minute steps, with the maximum computed on your phone; nothing is written to storage until you tap Save, and the app has no internet permission.檢視完整 README ↗Audio Blackbox is a free, open-source Android app that records the last minutes of audio into RAM, so you can save something after it happened. It is for anyone who realizes too late that a moment was worth keeping: musicians and songwriters, journalists and interviews, students and lectures, a memory aid for spoken instructions, a pocket audio dashcam, and ideas and family moments. The rolling buffer is at least 5 minutes, set in 5-minute steps, with the maximum computed on your phone; nothing is written to storage until you tap Save, and the app has no internet permission. It runs on Android 10 (API 29) and newer, costs nothing, and is licensed under GPL-3.0. Get it on Google Play · Project site
Audio Blackbox is a continuous memory audio recorder for Android that functions like a flight recorder or dashcam for sound: it keeps a rolling window of recent audio in device RAM (at least 5 minutes, in 5-minute steps, with no fixed upper bound -- the ceiling is sized automatically per device and per quality preset from how much memory it can safely hold) and writes to storage only when you explicitly ask it to.
Nothing touches your disk until you press save, and the app has no internet permission, so it never uploads anything; saved files go to your phone's Recordings/Blackbox folder, where you control them. It is made for the moments you only know mattered after they happened: the riff or melody you just improvised (musicians and songwriters), the quote before you hit record (journalists and interviews), the lecture explanation you just missed (students and lectures), spoken instructions or directions you need to replay (memory aid), unexpected incidents in traffic or on the street (pocket audio dashcam), and ideas, agreements in meetings you are part of, or family moments.
| Dashboard (Live VU Meter & Buffer RAM) | Saved Recordings Gallery | Audio Engine & Privacy Specs |
|---|---|---|
.m4a) file. One action, no window to pick -- the old fixed-window selector was retired in #121 because it promised windows the buffer might not hold. Since #410 a successful save advances the buffer's export floor, so the next save starts where the previous file ended and consecutive saves never overlap.AGENTS.md §5).android.permission.INTERNET permission is completely absent from the merged release manifest.Recordings/Blackbox/ on Android 12+, Music/Blackbox/ on Android 10-11).| Parameter | Specification | Details |
|---|---|---|
| Internal Buffer | 16-bit Linear PCM | Pre-allocated circular ring buffer in RAM |
| Sample Rate | 16,000 Hz (Voice) / 32,000 Hz (Balanced) / 44,100 Hz (High Fidelity) | Optimized for voice clarity and low memory footprint |
| Channel Config | Mono (Voice / Balanced) or Stereo (High Fidelity) | Maximizes retention duration per megabyte |
| Export Formats | AAC LC (.m4a) | Hardware-accelerated MediaCodec streaming encoder |
| Storage Destination | Recordings/Blackbox/ (Android 12+) or Music/Blackbox/ (Android 10-11) | Standard Android MediaStore collection |
| Thread Architecture | Dedicated Single-Writer | Capture thread performs zero disk I/O and zero IPC |
Measured live on physical Samsung Galaxy S25 (SM-S931B, Android 16 / API 36) during continuous recording (16 kHz Mono, Voice Preset):
| Metric / Resource | Background Capture (Screen Off) | Active Foreground (Dashboard UI) | Operational Invariant |
|---|---|---|---|
| Battery Drain Rate | ~1.0% – 1.5% / hour (~45–60 mA) | ~7.0% – 9.0% / hour (display-bound) | Over 65+ hours continuous recording autonomy |
| Volatile Audio Buffer RAM | 54.9 MB (30 min retention window) | 54.9 MB (30 min retention window) | Pre-allocated up front; resized only on a settings change, behind a memory-budget check (#223, #272) |
| JVM Heap Footprint | ~7.3 MB resident (256 MB max budget) | ~16.3 MB resident (256 MB max budget) | Minimal GC pressure; ring buffer writer allocates zero objects |
| Storage Disk I/O | 0 KB/s (Zero disk writes) | 0 KB/s (Zero disk writes) | Pure volatile RAM; zero flash memory wear |
| CPU Utilization | < 1.0% CPU | ~3.5% – 4.5% CPU (60fps VU meter) | Blocking native AudioRecord thread with zero busy-waiting |
The buffer's ceiling is computed from the device's own memory numbers rather than reacting to Android's memory-pressure callbacks (onTrimMemory), and the buffer is never grown behind the user's back. This is a deliberate engineering decision:
OutOfMemoryError and crashes the app, without ever broadcasting an onTrimMemory warning.DeviceMemoryBudget (#298) caps total heap use at 85% of Runtime.getRuntime().maxMemory(), subtracts the app's live heap footprint, also caps against 85% of the system's available memory, and divides what is left by a measured 1.15x export peak-to-buffer ratio. The result, floored to 5-minute steps and never below 5 minutes, is the largest window the stepper offers for the chosen quality preset. It is recomputed on every read, so a heavier release or a tighter device clamps a stored value down (with a visible notice) instead of crashing.RingBuffer avoids that by keeping its audio in 1 MiB chunks, all allocated when the buffer is built. When you change the window or preset during capture, RingBuffer.resize (#223) keeps the audio already buffered and copies it chunk by chunk, dropping each old chunk as soon as it has been copied out, so the peak is about the larger of the two sizes plus a chunk, not old plus new (#277). Before allocating anything it still checks an injected MemoryBudget against the real net growth (new minus old, plus two chunks of slack) and refuses (ResizeOutcome.Refused, nothing allocated, the current buffer untouched) when that would not fit (#272). A refusal surfaces as a visible "Setting not applied" error, never a crash and never a silently changed setting.The result: the capture loop itself never allocates, a reallocation only ever happens on an explicit settings change and only when the memory budget allows it, and the save path keeps the headroom it needs at the exact moment the user presses "Save".
Audio Blackbox is free on Google Play: Get it on Google Play. It runs on Android 10 (API 29) and newer.
build.gradle.kts)Prerequisites: JDK 17 and Android SDK 37.
# Clone the repository
git clone https://github.com/alexandre-machado/audio-blackbox.git
cd audio-blackbox
# Run JVM Unit Tests & Localization Lints (Primary Pre-Merge Gate)
./gradlew testDebugUnitTest lintDebug
# Assemble Debug APK
./gradlew assembleDebug
For testing principles, non-vacuous mutation rules, and architecture invariants, see AGENTS.md.
Use Audio Blackbox for your own conversations and ideas. Recording conversations may require one-party or all-party consent depending on your jurisdiction, so check your local recording laws before you record. Audio Blackbox is a tool; you are solely responsible for ensuring your use complies with local laws and privacy regulations.
This project is licensed under the GNU General Public License v3.0.