BFE is a standalone, sideload-only Android file manager and explorer built around a set of
bundled native engines. In one app: a dual-pane "commander" layout; extraction of archives, disc
images, GOG/InnoSetup installers and FreeArc repacks; compression to zip/7z/tar/tzst and Winlator
.wcp packs; browsing storage normal file managers can't reach — other apps' SAF document
providers and, on a rooted device, any installed app's private data; an APK cloner + signer;
and a video converter (game FMVs → MP4) powered by a bundled ffmpeg.
It is lifted from the in-app File Manager + archive subsystem of the Bannerlator emulator (Winlator lineage), with all of the emulator machinery (Wine containers, X server, Steam/GOG store plumbing) stripped out and the browse / extract / manage core turned into its own app. GPL-3.0.
Status: early, fast-moving 0.x builds. Every release is CI-built and signature-verified, but the project is not yet broadly device-tested. Grab the latest APK from Releases.
- Browse internal storage, SD cards and USB drives. Landscape shows a collapsible side rail of locations; portrait uses a storage dropdown in the toolbar. Both list your pinned app storages.
.apkfiles show their real launcher icon in list, grid and compact views (parsed off the main thread from File, SAF and root locations, like the.exePE icons).- New ▾ → Folder / File…: create an empty file on File, SAF and root locations (root creations are chown'd back to the owning app); text-like files offer "Open with…" right away.
- Path / free-space bar, up/back navigation, sort by name / size / date / type (asc/desc), in-folder search, show/hide hidden files.
- Three view modes, cycled from the toolbar and remembered: Grid, List, and a dense Compact list (~2× more rows on screen).
- Multi-select with an action bar: copy, cut, delete, share. Copy/move/delete/rename with real progress, cancel, and conflict handling (overwrite / merge / keep both / skip). New folder.
- Favorites, file properties + read-only toggle, image thumbnails (Coil) and
.exeicon extraction (PE resources). - Open with any file in another app, Share one or many files, and Install
.apkfiles directly.
- Toolbar toggle → two fully independent panes side by side — in landscape and portrait (fixed 50/50 split).
- One shared toolbar controls the active pane (tap a pane to focus it); each pane keeps its own folder, selection, scroll, view mode and sort, so the two sides can differ (e.g. left Compact, right Grid).
- One-tap Copy → / Move → from the active pane into the other pane's folder.
- Extract into the other pane: extracting an archive defaults its destination to the other pane's folder — "extract here → into there" in one tap.
| Engine | Handles |
|---|---|
7-Zip (7zz) |
.7z, .zip, .rar (incl. multi-part), split volumes (.001, .bin), .tar / .tar.gz / .tar.xz, disc images .iso / .udf / .img, .wcp / .tzst, and more |
| innoextract | InnoSetup / GOG offline installers — unpacks the game files directly, including automatic DLC batch: sibling setup_*.exe DLC installers in the same folder are detected and extracted into one merged game folder |
| unarc (FreeArc) | FreeArc / ISDone game repacks (FitGirl / DODI-style Setup-N.bin volumes) decoded natively |
- One-tap Fast Extract, or the full Unpack Archive screen (destination picker, options).
- Runs as a background foreground-service job with a progress notification, cancel, and an app-wide minimizable progress pill — survives the app going to the background.
- Extraction targets can be normal storage or a pinned SAF / root location (extracted to a temp folder, then copied into the target with the ownership fix described below).
- BFE registers as an "Open with" / Share target for archives and
setup.exefiles, so other apps can hand them straight to the extractor.
Select files/folders → Compress… → format, name, level, optional password, destination (this pane or the other). Same background job / pill / cancel as extraction.
| Format | Engine |
|---|---|
| zip (optional AES-256 password) · 7z (optional password, encrypted headers) · tar | bundled 7-Zip |
| tar.gz · tar.xz | two piped 7-Zip processes — no on-disk .tar staging, so a large folder never doubles its footprint |
tzst (tar.zst) |
streamed Java tar + Zstandard (commons-compress + zstd-jni) |
Winlator .wcp |
a tar.zst content pack with a profile.json manifest |
The Create Winlator pack form collects the pack type (Wine / Proton / DXVK / D7VK / VKD3D /
Box64 / WOWBox64 / FEXCore / VEGAS), versionName, versionCode, description (and the wine paths for
Wine/Proton packs) and writes the exact profile.json schema Bannerlator/Winlator parse — a pack you
build in BFE installs straight into Bannerlator.
- Storage apps (SAF): the Add app storage picker lists installed apps that expose a DocumentsProvider (SD/USB, Downloads, cloud apps like Drive/Dropbox, and opt-in apps) by app label + package name. Pick one, confirm the folder in Android's picker (it opens at the app's root — a single "Use this folder" tap), and it's pinned as a location you can browse and manage: new folder, rename, delete, copy/move in and out (including cross-pane), share, open-with, multi-select.
- All apps (root): on a rooted device, the same picker lists every installed app. Pick one and
BFE drops you straight into its private
/data/data/<pkg>(and itsAndroid/data/<pkg>if present) — no folder-picker step. Full management there: browse, copy/move in and out, rename, delete, new folder, share/open-with/install (staged through BFE's cache, since other apps can't read/data/data). - Ownership safety: anything BFE writes into an app's sandbox as root is automatically chowned
back to that app's uid (with
chmod 770/660andrestorecon), so the target app keeps working — no root-owned leftovers that make an app crash with permission errors. - Pinned locations appear in the side rail / storage dropdown with a × to unpin.
- Clone any
.apkfile (⋮ → Clone APK…) or any installed app (Clone installed app… — split/ bundle installs are merged into a single APK first) with a new package name, label, versionCode, versionName and icon, plus an Advanced section (minSdk/targetSdk, debuggable, allowBackup, extractNativeLibs). - The rename is done properly so clones actually install and run beside the original: relative
component class names are made absolute (code keeps resolving), every ContentProvider authority
moves to the new package (no provider conflict), package-scoped permissions are renamed,
sharedUserIdis dropped,taskAffinityis rewritten, and the manifest +resources.arscpackage are renamed together. The result lists every fixup applied. Clone & Install in one tap. - Sign APK… on any
.apk— re-signs with APK signature schemes v1 + v2 + v3 (per-sign toggles), zipaligned (16 KB page-aligned native libs whenextractNativeLibs=false), then verified. - Keys: a built-in BFE Test Key (generated once, private to the app) is the default so all your clones share one signature and update in place; or import your own PKCS12 / BKS keystore, or generate a new key in-app. (JKS isn't supported by Android's crypto stack — convert to PKCS12.)
- Verified on a real APK: the pipeline cloned BFE's own release to a new package with v1/v2/v3 all verifying and both provider authorities renamed.
- Inherent limits, shown in-app: apps that verify their own signature, Play-licensed apps,
Google-services/Firebase-bound apps, and some split/bundle apps may not run as clones; code that
builds a FileProvider authority from
BuildConfig.APPLICATION_IDwill mismatch after a rename.
- ⋮ on any video (or multi-select → Convert) transcodes to H.264 + AAC MP4 with the bundled
ffmpeg (a static aarch64/bionic GPL build with x264, exec'd like the other native engines).
Made for game FMV: Bink 1 (
.bik), Smacker (.smk), WMV/ASF, AVI, MKV/WebM, MOV/MP4/M4V, MPEG-PS/TS, OGV, FLV, 3GP, VOB. - Quality Fast / Balanced / High (x264 veryfast / medium / slow, CRF 26 / 23 / 20), resolution Keep / 1080p / 720p / 480p (aspect kept, even dims), audio keep (AAC 160k) or none, output to this pane or the other one (SAF/root via temp + copy). Batch conversions run one after another as one background job with live percent / speed / ETA in the pill and notification; Cancel kills ffmpeg and removes the partial file.
- Engine: a single static ffmpeg 7.1.5 + x264 binary (~6.8 MB, arm64, built reproducibly by
the
build-ffmpeg.ymlworkflow and shipped aslibffmpeg.so). Codec coverage — video: H.264, HEVC, VP8, VP9, MPEG-1/2/4, MS-MPEG4 v1–3, WMV1/2/3, VC-1, Theora, VP3, MJPEG, Cinepak, Indeo 3/4/5, H.263, Bink video, Smacker video; audio: AAC, MP3, Vorbis, Opus, WMA v1/v2/Pro, AC-3, Bink audio, Smacker audio, PCM, ADPCM (IMA/MS/QT/Yamaha). Output: MP4 (+faststart, yuv420p) with H.264 + AAC, so it plays on anything. - Bink 2 (
.bk2) is proprietary — there's no open decoder, so BFE says so up front instead of failing. Encoding is software x264 (no hardware encoder): quick for 480p/720p cutscenes, slow for 4K.
BFE has a pluggable storage layer with three backends behind one file-manager UI:
- File — direct filesystem access via All-Files-Access (the default; what makes native extraction possible).
- SAF —
DocumentsContracton a persisted tree URI for pinned document providers. - Root —
libsu(Magisk) for/data/dataand anything else, with the chown-back safety above.
Copy/move between any two backends streams through, so you can e.g. copy from a cloud provider into an app's private folder in one operation.
- Android 8.0+ (minSdk 26, targetSdk 28).
- arm64-v8a only — the native extractors are prebuilt for arm64; there is no other ABI.
- All-Files-Access (
MANAGE_EXTERNAL_STORAGE) — requested on first run. The native engines write real files and can't go through the scoped-storage picker, so this is required for extraction and compression. - Root (Magisk) — optional, only for the "All apps (root)" features. The first root action triggers a Magisk prompt; grant BFE root there. Without root everything else works — the root section simply stays unavailable (a one-line notice, no crash).
- Download the latest
BFE-x.y.apkfrom Releases. - Sideload it (allow "install unknown apps" for your browser/file manager if prompted).
- On first launch, grant All-files access. Grant root in Magisk when the root features ask.
BFE is a separate app (com.the412banner.bfe) — it never touches Bannerlator or any other install.
Releases are built by CI (.github/workflows/build.yml) and signed with a bundled, publicly-known
TEST key (keystore/bfe-test.jks) using APK signature schemes v1 + v2 + v3, so any BFE build
installs over the previous one without uninstalling.
This repository is public, so that signing key is public too — do not treat it as private. Anyone can produce an APK carrying BFE's signature; only install BFE builds you obtained from this repo's Releases (each release lists its APK SHA-256). This is the normal trade-off for a sideload dev tool; a private release key can be added via a CI secret if tamper-resistance is ever needed.
./gradlew assembleRelease # signed with the committed test keyToolchain: AGP 8.8, Kotlin 2.0.21, Compose BOM 2024.02, Java 17, NDK 29, compileSdk 34. No Hilt, no
local .so build step — the prebuilt native binaries live in app/src/main/jniLibs/arm64-v8a/ and
are exec'd (not System.loadLibrary'd) from the app's native-lib dir, which is why the manifest
keeps android:extractNativeLibs="true" — without it the executables never land on disk and every
extraction fails. CI uses Gradle build/configuration caching so warm builds are fast.
app/src/main/java/com/the412banner/bfe/
├─ unpack/ 7-Zip / innoextract / unarc wrappers, UnpackService (extraction job), FastExtract
├─ pack/ archive creation (7zz, tar+zstd, Winlator .wcp), PackService (compression job)
├─ apk/ APK cloner/editor/signer (ARSCLib rewrite, apksig, keys), ApkJobService
├─ video/ ffmpeg wrapper + ConvertService (video → MP4 job)
├─ storage/ StorageBackend abstraction: File / SAF / Root backends, cross-backend transfer, pins
├─ ui/screens/ FileManagerScreen (panes, shared toolbar, dual-pane), Unpack screen, Compress dialog
└─ ui/ progress pills, theme, components
app/src/main/jniLibs/arm64-v8a/ prebuilt lib7zz / libinnoextract / libunarc / libffmpeg + dependency closure
keystore/bfe-test.jks public test signing key
- Dual-pane split is a fixed 50/50 (no drag-to-resize yet). Path bar isn't a clickable breadcrumb yet.
- SAF only reaches apps that expose a DocumentsProvider — most ordinary apps don't, and Android
blocks SAF from
Android/data. Use the root mode for those. - Extracting from an archive that lives on a SAF/root location isn't supported yet (archives must be on normal storage; extracting into SAF/root works).
- Piped
tar.gz/tar.xzcompression reports percent but not per-file names. - Compact rows are ~2× denser than the standard list, not a literal quarter-height (readability floor).
- Video conversion: Bink 2 (
.bk2) can't be decoded (proprietary); encoding is software-only (x264), so large/4K sources are slow; output is always H.264 + AAC MP4 (no other output formats yet). - APK clones of apps that verify their own signature, are Play-licensed, or are bound to Google-services/Firebase may not run; that's inherent to cloning.
- Errors surface as toasts; no predictive-back animation (targetSdk 28).
BFE is licensed under the GNU General Public License v3.0 (see LICENSE), inherited
from its Winlator/Bannerlator lineage. Bundled third-party components keep their own notices — see
NOTICE_7ZIP.txt, NOTICE_INNOEXTRACT.txt, NOTICE_UNARC.txt, NOTICE_FFMPEG.txt (FFmpeg + x264,
GPL v2+, built with --enable-gpl --enable-libx264) and License_7zip.txt.