Repository navigation
Releases: Bingblop/ADB-Application-Manager
Release list
ADB Application Manager Pro v7.15.0
A look-and-reach release on top of v7.14.1: the app is renamed ADB/Root Full System Toolbox and every tab got a top-to-bottom UI pass, so the screens are calmer and the things used most are one tap or one hold away (#251, #252). What the app does is unchanged: no feature was taken out, no setting changes meaning, and the package, the signing certificate, the APK file names and the permissions are the same, so it installs over every earlier version. The owner's earlier choices stay: the check marks beside the app icons, the row tints and gradient buttons, the Settings order of v7.14, an app menu that asks before nothing, the Private DNS pointer in Hidden Settings, Live Logcat's green Play and red Stop, and the Console's long-press menu. Nothing in it has been run on a phone by the people and tools that wrote it; docs/PHONE-SCRIPT-v7.15.0.md is the phone script.
Name and header
- ADB/Root Full System Toolbox is the name under the icon, on the widget, in the page title, in About, the console banner, shared texts and the Help Guide, in all 14 languages; the header shows it on two lines ("ADB/Root Full" over "System Toolbox"), and a launcher may shorten it under the icon. Package, folders, APK file names and the release name are unchanged.
- The header is the name in one colour, and under it only the Android and One UI versions ("Android 16 • One UI 8.5"; no maker or model, each part kept whole). The mode badge shows the short mode name and, when the chosen mode is not ready, says so in the warning colour ("Shizuku (not ready)"); a tap still opens Working Modes. The gear is a quiet tonal button and the only gear: the Extra Settings tab has a switch icon, and the row's Action Button set to App info shows an (i).
- Colours and type: softer shadows on sheets and menus, white cards on a tinted page in the Material 3 palette's light theme (Material You from the wallpaper and the Palette Styles keep their own light colours), and one weight ladder (titles and the selected state heavier, chips and buttons a step lighter).
Easier to reach
- Long-press shortcuts: the Apps tab lists Running, Frozen and Uninstalled (the list with only that filter on); Files lists Search files, Storage and Downloads; History (the ADB Shell's command history) can be chosen for the Console tab in Settings > Navigation > Shortcuts.
- Select shown sits next to Clear filters while a filter is on, and selects every app the list shows.
- The Debloater's top card starts folded to its name and the list's status (a tap opens it, and it stays as you leave it); Update List and History (with Undo) are round buttons beside the search, so they stay one tap away.
- Files shows the open folder's path as a row of crumbs: a tap on a folder above this one (or on the "/" after it) opens it; each crumb is a full-size tap, the path reads from the root in every language, and the path field still takes a typed path.
- Saved Applications puts the lists first, right under the filters; Back up and restore and Quick actions fold at the bottom.
Every tab, calmer
- Apps and the app menu: rows a little shorter, the row's Action Button quiet until pressed, filter rows that fade at the edge with more; in the app menu the permission chips sit on one line, long permission names break at "." and "_", and the tab counts are plain numbers.
- Bottom bar: lighter labels on the tabs that are not open; the More tiles use short labels on narrow screens.
- Console: the "Active mode" card under the command field is gone while a working mode is ready (the header badge names the mode); a tinted card says when no working mode is ready, with Configure, and explains the Rish shell while Rish mode is on. The mode button, the field and Run are one height; the output area is a console card waiting at a "$" prompt; the find row comes with the first output.
- Live Logcat opens on a title row with Play beside the title; its tools are two rows and the level key wraps so every level is in view.
- Hidden Settings: the search bar's buttons are as tall as the field; a setting's value and Ask agent share one line.
- Installer and Morphe Patcher: Application Installer | Application Updater and Apps | Community are segmented controls like Light / Dark / System; Morphe's Sources, Helper, Patched APKs and Settings are one row that scrolls sideways; Patch a file is tonal.
- Settings: long descriptions show two lines and open with a tap (a small arrow marks text that has more); Palette Style shows three swatches a row (two on a narrow screen, so no name breaks).
- Task Manager: the sort buttons are chips, the chosen one tinted; Graph speed shares a line with its label where the slider keeps room to drag, else the slider and its value take the next line together. Extra Settings: the section icons sit on a tinted tile.
- SD Maid: each tool's Scan is tonal, so Scan all is the one bright button in the top card and the tool list (Clear Data from Uninstalled Apps and Trim Caches keep their bright buttons in their own cards); the long explanations of Clear Data from Uninstalled Apps and Trim Caches fold under "What does this do?".
- About: Handy to know, Privacy and Credits start folded. Connected Devices with no device shows only Refresh in its top card (the empty state below has + Add device). The tab rows of App Stores and Connected Devices fade at the edge with more.
Fixes found on the way
- Debloater: a row's buttons no longer take the sticky action bar's layout (they shared a class name), so they sit at the end of the row.
- A folded card's ? sits left of the fold button, and their tap areas no longer overlap.
- Live Logcat's All apps button reads in the text colour like the Level and Lines selects beside it.
ADB Application Manager Pro v7.14.1
A release on top of v7.14.0, cut from main: the 57 fixes of a full review of main and of the v7.14.0 changes (#238), a check in the release workflow (#239), two unused leftovers taken out of the repository (#240, #241), and seven changes the owner asked for after v7.14.0 (#242 to #248): a progress notification for the Stop apps tile, a Speed test section in Extra Settings, a Refresh button in the File Manager, Installed | Uninstalled as one choice, a Gradient switch and a shortcut for Row tints, and the Updated 7d filter taken out. Each fix and each change comes with a Java suite or a UI script that fails on the old code, except the two CI workflow changes (BLD-4, BLD-6), which were checked by parsing the YAML and running their steps on a computer. Nothing in it has been run on a phone by the people and tools that wrote it; the Live Update part of the Stop apps notification calls Android 16's documented API and has not run on any phone. docs/PHONE-SCRIPT-v7.14.1.md is one phone step per change.
New
- Stop apps shows its progress (#246). The Quick Settings tile and the widget button now start a notification, Stopping apps: the list's name, how far the run is (3 of 12 · Chrome) and a progress bar. It is cleared when the run ends. Cancel in the notification stops the run after the app it is on, leaves the apps it did not reach as they are and clears the notification (Cancelled after 3 of 12 apps). A tap on the notification opens the app on Saved Applications with the Edit Saved List sheet of the quick list; the run goes on and nothing is stopped, saved or changed by the tap. On Android 16 and newer the notification asks to be a Live Update (a chip like 3/12 in the status bar); where the phone does not show it as one, and before Android 16, it is the same notification without the chip. Whatever the list says, this app, the phone's WebView app (and Android System WebView) and Media Picker (
com.google.android.providers.media.module) are never stopped; the message counts them as left alone. A second tap while a run goes on does not start another one. - Live updates is a new row of the permissions sheet on Android 16 and newer, and the manifest declares
android.permission.POST_PROMOTED_NOTIFICATIONS(the only new permission). No command can switch it on, so Allow asks for Notifications first (by command with a working mode, otherwise with Android's own question) and then opens the phone's Live updates screen for this app by itself; Allow all ends there. Closing the sheet after only Live updates changed no longer starts the app again. - Extra Settings has a Speed test section (#245), right after Private DNS, that opens the same full-screen test as Task Manager > Network > Speed test. Its pill shows the download speed of the newest saved result, and a chip in the header shows it once there is one.
- The File Manager has a round Refresh button (#247) in its title row, the same one as the Apps tab: one tap reads the open folder (or the search results) again, and the arrow turns while it does.
- Installed | Uninstalled is one choice (#242), like System | User and Enabled | Frozen, in the Apps tab, Saved Applications and Connected Devices: tapping one turns the other off.
- Row tints: a Gradient switch under the slider (#244; off: each tinted row is one even colour, in the Apps tab, Connected Devices and both Logcats), and a last row in the three-dot menu of the Apps search bar that opens Settings on the Row tints card (#243).
- Updated 7d is no longer a filter (#248) in the Apps tab, Saved Applications or the Debloater: sort by Last updated to see what changed lately. Connected Devices never had the filter.
Files and archives
- Replace onto an SD card or a USB drive merges. Copying or moving a folder onto added storage where a folder of that name was already there deleted that folder, with everything in it, before copying. Now folders merge, a file replaces a file and a file meeting a folder is refused, as on internal storage. The same place seen two ways (the card added as storage and
/storage/<card>) is recognised, so nothing is copied into itself or replaced by itself; a copy into the source's own subfolder ends, and Cancel stops it. - Names are kept exactly in the Files tab's shell listing and in Connected Devices > Files: two spaces, a tab, a leading or trailing space, or " -> " in a plain file's name no longer send View, Rename or Delete to another file.
- A tar or a stored 7z that holds an APK opens as itself, not as the APK inside it (and a tar holding a RAR as the tar), so "Delete the archive afterwards" no longer deletes the tar and its other files after extracting only that APK's contents.
- File search inside archives goes on past a zip entry it cannot read (a password, an unsupported method, damage), so a later entry holding the text is found.
- Extracting one symbolic link on its own is refused in words instead of writing an empty file (with Replace it emptied the file of that name). A hard link that is left out says why: the file it shares was already there and left as it was, or could not be extracted.
SD Maid
- AppCleaner keeps a file that a Segment exclusion protects inside a cache folder it otherwise deletes whole.
- Deduplicator: one folder found under two spellings ("DCIM" and "dcim") is no longer its own duplicate (keep one deleted the only copy). Preferred locations also matches
/sdcard/..., a trailing slash or another case. - An exclusion typed as
/sdcard/...now protects that path in/storage/emulated/0, the storage the scans read, when the app runs in a work profile or as a second user (it used to point at/storage/emulated/<user>, which no scan visits). - SystemCleaner's Temporary system files stays out of app and user data (
/data/user,/data/user_de,/data/media/<user>,/data/misc_ce,/data/misc_de). - Delete all names what is left after Details took groups or items out, and says that what was taken out is kept.
Installer, backups and updates
- A failed or cancelled install keeps its files, so Install works again after following the advice (for example Allow downgrade) instead of asking to pick the package again.
- A package whose manifest.json unpacks to gigabytes no longer leaves the Installer on "Reading package…".
- The package-file search says when it stopped early on a large storage instead of reporting the list as complete or "No APK, APKS, APKM or XAPK files found".
- A VirusTotal verdict is shown only for the package it was scanned for.
- A 32-bit app's data backup can be restored again (the restore refused its
liblink); new backups leave that link out. Restore names the version read from the APK it installed. - Read-Only mode no longer leaves a self-update or a Store download in the cache.
- Updates: an update an open-source source found for a Galaxy Store app is kept when the Galaxy Store check times out.
- Connected Devices: a feature module sent to a device keeps its own CPU and density splits.
- App menu: opening the menu of an app that only mentions ReVanced or Morphe (this app included) no longer puts a ReVanced or Morphe tag on its row or lists it under the Patched filter. In the app's code, only classes it defines under
app.revanced.*orapp.morphe.*count, and the patcher library does not; the package name, the installer and the APK's file names are checked as before.
Terminal and Console
- The full-screen terminal in Shizuku mode no longer ends the app, and it ends when its shell exits even with a job left in the background.
- With ADB TCP or Wireless Debugging as the working mode, the Terminal connects again before opening the shell (after adbd restarted it said "the shell ended right after it started").
- The Shizuku fallback writes rish and its dex whole and replaces an older copy when the app is updated.
- A coding agent's answer that mentions "not installed" is no longer taken for a missing CLI; Copy says "Copied the screen" when the selection was outside the screen; in the ADB Console the agent's proposed command is kept while a typed command still runs.
Morphe Helper
- A second Download tap in All versions starts nothing while a download runs, and a new version no longer shows the previous file's VirusTotal verdict.
- Helper downloads and VirusTotal uploads stop with the window that started them, and the in-app browser closes with it (a download the browser started goes on in the downloads list); two windows reading the patch list no longer break each other.
- A browser download whose name carries a language tag (
filename*=UTF-8'en'app.apk) is saved as named, and the downloads notification no longer counts a retried download as stopped.
Speed test, Task Manager and permissions
- Speed test: ping and jitter no longer include Cloudflare's server time (a 10 ms line showed about 40 ms). A change of network during a test (Wi-Fi dropped, a metered network) stops it with "The network changed during the test." and nothing is saved.
- Task Manager: a working mode that stopped answering falls back to what Standard mode reads (the phone's RAM, and CPU and network where Android lets the app read them); Processes shows its lock and GPU says "Needs a working mode", instead of an empty list and zeros.
- Trackers: a running scan stops when its window closes. Logcat: a recording that stops by itself (25 MB, a write error) no longer leaves a thread behind.
- Permissions sheet: dismissing the Bluetooth or Notifications dialog the first time the sheet asks for it no longer sends you to App info (a second refusal or dismissal still does), and the Read Logs row says what the grant does today.
Screens
- Hidden Settings: Revert reads a table it has not read yet before it writes (it could delete the setting).
-...
ADB Application Manager Pro v7.14.0
A feature release on top of v7.13.4, cut from main. It carries the owner's v7.14 change list and the follow-ups he asked for (#234), the ADB Stub for Wear OS watches (#233), the on-device Self-test (#229, with its fix #232), the 42 fixes of the v7.12 to v7.14 code review (#235), and the fixes from a code review of the #234 changes. The app is now called ADB System Manager; the package name (com.bloatware.bingblop), the Download/ADB App Manager folders and the signing certificate are unchanged, so it installs over every earlier version. Each change is tested on a computer (the UI suite, the Java suites, a signed build). Nothing in this release has been run on a phone or a watch by the people and tools that wrote it. docs/PHONE-SCRIPT-v7.14.0.md is one phone step per change.
New
- Speed test. Task Manager > Network starts with a Speed test button that opens a screen of its own: a gauge, a live graph per phase, cards for ping, jitter, download, upload, the data centre and the connection, Start / Stop / Run again, copy and share, and the last 10 results. It measures against Cloudflare (
speed.cloudflare.com) with parallel streams through the app's safe connection code. On mobile data or a metered network it warns first: a test can use up to 350 MB and stops at that amount. Stop, closing it, leaving the tab or sending the app to the background stops the test. - ADB Stub for Wear OS watches (#233). Connected Devices shows an ADB Stub card under a connected Wear OS watch: Install, Update, Start, Stop. While it runs, the watch keeps its screen on and its Wi-Fi connected, and its one screen shows the connection. It starts by itself when the watch connects (a switch in the device menu, on by default); Disconnect stops it first, so the watch's Wi-Fi goes back to normal.
- Self-test in the About tab (#229, #232). 27 read-only checks in the current working mode, each PASS, FAIL, INFO or SKIP. Copy report puts a redacted report on the clipboard; Report on GitHub copies it and opens the bug-report form. No serial, IP or MAC address, account name, key or setting value goes into the report.
- Hidden Settings keeps a history of the last 100 changes, saved between launches. A new clock button next to the search box opens it (it is also under ⋯ > Changes). Each entry shows the table, how long ago, the date and time, and old → new, with Revert.
- Permissions. The permissions sheet lists every permission the app uses, with Android's name under each row; new rows: Read Logs, Bluetooth Connect, Notifications and Allow Restricted Settings. With a working mode, Allow grants by command and the result is read back from the phone. The first working mode after install offers once to grant everything that is left; an installed but unauthorized Shizuku is asked at start (until you say no twice). Settings > Language has an Application Permissions button that opens the sheet. The manifest now asks for
READ_LOGS(approved by the owner). - ANGLE in Task Manager's GPU renderer drop-down ("ANGLE (OpenGL ES on Vulkan)"). It needs Root: outside Root mode it is locked and explains why. Choosing it is read back from the phone.
- Back to top. A round up-arrow button appears once a screen has been scrolled more than one and a half screens.
- App menu tabs open full screen: a round expand button on each tab of an app's menu; the X, a pull down or Back returns to the menu.
Apps tab and app menu
- Filters in the owner's order: All Apps, Installed | Uninstalled, System | User, Enabled | Frozen, Running, Updated 7d, Suspended, Trackers, Patched. "3rd Party" is now "User". Saved Applications, the Debloater and Connected Devices follow the same order.
- The top row has only Sort and Button (the Action Button picker). Profiles, CSV and Backups moved to Saved Applications, beside New List.
- Only a selected row is outlined; a running, frozen or uninstalled app gets a soft glow in its colour instead, and a tap that selects a row sweeps a band of light across it. Frozen is a clear blue.
- Row tints has five steps: Off, Faint, Subtle (the default), Normal, Vivid. Vivid stops where the badges and Live Logcat's text keep 4.5:1 contrast. Row tints also tints Live Logcat.
- Filled colour buttons: Uninstall is a red gradient, Freeze ice blue, Reinstall green and Enable the accent, all with black text where it reads better. Every filled button is a gradient.
- The app menu's buttons stand in four fixed groups (Open, Control, Maintenance, Package). A button that does not apply stays in its place, dimmed, and a tap says why; nothing moves when the app's state changes. The Patched / modified box is gone from the menu; Share, Copy package and Copy name have centred labels.
- Suspend state of apps uninstalled for the user is read from the phone, so Suspend / Unsuspend shows the real state and its result is checked.
Live Logcat and the Console
- Live Logcat is its own tab again; Console holds ADB Shell | Terminal. A saved tab layout carries over (the Terminal's place goes to Live Logcat). The Terminal takes the theme's colours.
- Live Logcat reads 1000 lines by default and keeps its level, line count, filter and app between launches. Play / Stop is a filled button (Pause is now Stop). The level dots are in the owner's colours (Verbose dark green, Debug yellow, Info the accent, Warn orange) and each row is tinted in its level's colour. Record to file has a red dot.
Connected Devices
- A device's app list works like the Apps tab: the same filter pills (only the states a device can report: All Apps, Installed | Uninstalled, System | User, Enabled | Frozen), the same row with the icon as the selection box, the row tints, the Action Button and the Sort / Button row. The button's choices are those a device can run (App Settings, Force Stop, App Launcher, Enable / Disable, Install / Uninstall, None). Holding it opens that device app's menu.
- The device Logcat matches Live Logcat: 1000 lines, remembered choices, the colour key with a count per level, the filled Play / Stop and the level colours. It has no app picker and no Record to file.
- The Reconnecting devices card moved here from Settings and starts folded.
Settings and the whole app
- Settings cards fold (a round chevron or a tap on the title); the choice is kept. "Palette Style & My Themes" is one card; the VirusTotal key sits in the Default Ask Agent card; the Private DNS pointer left Settings (Private DNS stays in Extra Settings).
- The page's dialogs (alerts, questions, text prompts) are drawn in the app's look with a real title, instead of WebView's "The page at file:// says".
- Task Manager is quicker: the graph speed goes down to 50 ms (default 150 ms) and auto-refresh to 0.5 s (default 1 s); nothing faster is offered.
- Undo bars last 3 seconds at most and sit just above the bottom bar.
- Old WebView: on a WebView older than Chrome 111 the colours are computed by the app so rows, buttons and badges draw correctly, and a one-time notice offers to update Android System WebView.
- The Help Guide describes all of this; every new string is in all 13 translations.
Fixes from the v7.12 to v7.14 code review (#235)
Forty-two findings, each fixed with a test that fails on the old code. The ones you are most likely to notice:
- The ADB Stub lets the watch go when the phone is gone: it holds the watch's screen and Wi-Fi on a 5-minute lease that the phone renews every minute, so a killed app or lost Wi-Fi no longer keeps the watch bright until its battery runs out (the stub's version goes to 2, so a watch offers Update). A failed stub install says why, Disconnect no longer stalls on a watch that stopped answering, and Running means the service really runs.
- SD Maid SystemCleaner no longer offers or deletes a folder as "Empty folder" when it holds a file with a line break in its name; CorpseFinder no longer offers user 0's folders in a work profile or for a second user; an injected tap no longer lands on the progress cover's Cancel.
- Archives: deleting a file from a tar keeps the content of its hard links; a RAR 4 entry of unknown size no longer stops the archive from opening.
- Morphe: "Install when finished" asks the window that is open; a running Helper download is no longer shown as Paused in a new window (resuming it corrupted the file); Stop at the very end of a patch is no longer ignored.
- Updates and installs: a cancelled Retry keeps the failed apps; offline with an earlier result the App Updater no longer says "Couldn't check (0)"; a path the page hands to the Installer or a restore can never be the app's private data; an escaped or full-width spelling of 127.0.0.1 counts as loopback; "Delete the package after install" deletes only the file the package was read from;
adb keygenandadb pubkeyare refused. - The page: Stop in one Ask window no longer cancels other agent requests; File Manager's View contents waits for a running extraction; the File Manager bars stay below the header; the navigation rail scrolls on a short landscape screen; Trim app caches no longer says Done when it failed; an old tab choice no longer hides the updater or the live log.
- Self-test: a log line or setting that mentions a denied permission is no longer a failed check.
Release workflow (#236): a test run with the throwaway key is published as a draft prerelease, never as a normal release.
Fixes from the code review of the #234 changes
- The speed test closes a connection that was answered with an error, and its warm-up is the first answer, not the first try (a failed first request no longer inflated the jitter).
- Task Manager reads a CPU core's min/max clock again when it could not be read the first time.
- The Apps tab's filters and selection no longer repaint or un...
ADB Application Manager Pro v7.13.4
A small release on top of v7.13.3, cut from main: Backup moved from the single-app menu to the batch menu (#230), and nothing else. Not run on a device.
- Backup is a batch-menu button, and it backs up several apps. The app's menu (the ⋯ sheet) no longer has a Backup button. In the batch menu (select apps, tap the round button), Backup now sits where Share List was: it opens the Backups box for the selected apps with one choice, Include app data (needs Root), then Create backup saves each app in turn into its own file under
Download/ADB App Manager/Backups. The bar covers the whole run, one app that fails does not stop the others, and the box ends with "Saved 4 of 5 apps to (folder)" and "Not saved: (app) (reason)". One selected app keeps the old single-app card. Restore, Share, Delete and Choose backup file… work as before. - Share List is gone from the batch menu. Copy Packages and the Share CSV button of the Apps tab still hand out a list of apps. The empty Backups list now says to select apps and tap Backup in the batch menu. Four new messages and the new hint are translated in all 13 languages; the Help Guide, the full guide and the device checklist describe the new place.
- Tests. A new UI script (t348) runs a five-app batch with one failure, with and without Root; the app sheet is one row shorter, so a few goldens moved.
ADB Application Manager Pro v7.13.3
A screen-layout release on top of v7.13.2, cut from main. It carries the usability findings of the 2026-10-14 UI audit (#216 and #220 to #227) and nothing else: no feature, no new setting, no change to what any command does. The pages are tighter, the small text and badges are readable in every theme preset, and the controls are easier to hit. Two lists changed shape (the Apps rows and the File Manager's top card), so they are the ones to look at first. Each change is tested on a computer (the UI suite, the Java suites, a signed build). Nothing in this release has been run on a phone by the people and tools that wrote it. docs/PHONE-SCRIPT-v7.13.3.md is one phone step per change.
Apps tab
- The list starts near the top. It used to start 420 px down; the counts are merged into the filter pills (each pill shows its count and the counts follow the filtering), the paired frames (3rd Party | System, Enabled | Frozen) light the side that is on, and the › at the end of the filter row shows only while there is more to scroll to (#223, #224).
- An app's icon is its checkbox. Tapping the icon selects the app (a check badge on the icon, the row tinted) and the batch count follows; tapping the name still selects. A long press on the icon saves it without selecting; a long press on the name opens the app menu. The gear and ⋯ are slim icons that no longer catch each other's taps, and a long name fits on one line. One new string, "Select {0}", read as "Select , checkbox" by TalkBack (#226).
- Empty lists share one look (icon, title, hint, button) and give the right advice: "No apps match your search." with Clear search, "No apps match your filters." with Clear filters, and in the File Manager an empty folder or one that only holds hidden files, which offers Show hidden files (#224).
File Manager
- The list starts near the top (it was pushed down to about 635 px by the top card). The rarely used toggles, the scope and tick boxes, hidden files, the system folders and Add storage moved into a sheet opened by ⋯ More; a search uses what is set there. Four new strings; the Help Guide page is updated (#227).
App menu and sheets
- The app menu header no longer breaks dates and sizes in the middle of a word or cuts "Copy name" off, and the date line is translated whole ("Installiert: … • Aktualisiert: …") (#220, #222).
- Every sheet closes with the same round 44 px ✕ (the More sheet, the batch menu, the Help Guide), read as a "Close" button by TalkBack (#220).
- On dark themes the app menu's Freeze and Uninstall buttons are now pastel blue and red. The vivid ones were below 4.5:1 contrast (#225).
Readable text and touch targets
- Small text is readable: badges and overlines 11 px, package names 12 px, app names 14 px; status badges (USER, SYSTEM, FROZEN, MOD) read at 4.5:1 on every row, in light and dark, in every theme preset (#225).
- Buttons and chips are 36 px tall and take a tap over 44 px; a tap just beside a small chip, the "?", a checkbox or a File Manager tick box still lands on it; the filter-pill and sort rows no longer wobble up and down when swiped sideways (#221).
- "Ask agent" is a quiet ghost button on Hidden Settings and Overlays rows, accent only while pressed (#221).
Header, Task Manager, Terminal, Console, Debloater
- The header's mode badge stays on one line and the settings gear is a monochrome outline; Task Manager's tabs are two even rows of three; the Terminal's input line and extra keys sit above the bottom bar, also after the keyboard closes (#222).
- Long intro paragraphs (SD Maid, Hidden Settings, the stores) show two lines; tap the text to read the rest (#223).
- The Debloater's Uninstall, Disable, Restore and Save to List are dimmed while nothing is selected; the Console tab's "?" has its own room and covers no tab name; the toast has an inverse look that reads in the light and dark themes; the batch sheet's spacing is even (#216).
Tests only
ADB Application Manager Pro v7.13.2
A fix release on top of v7.13.1, cut from main. It carries the serious and wrong-result findings of a second, narrower review pass over the areas the first one did not reach (the Connected Devices sub-tabs, Backups, the real-terminal page code and the Morphe patcher runner), the update check's out-of-order progress count that v7.13.1 left open (#185), and one change you asked for: the SD Maid AppCleaner now starts its accessibility service on its own and never force-stops this app or Android System WebView. It also carries the full code review of 2026-10-14 (#206 to #215), a small spacing and toast polish (#216) and the Semgrep hardening (#217, #218). Nothing else is new: no feature, no wording change. The thirteen smaller findings of the same pass (#187 to #199) are fixed below. Each fix is tested on a computer (the UI suite, the Java suites, a signed build). Nothing in this release has been run on a phone by the people and tools that wrote it. Section 29 of docs/DEVICE-TEST-CHECKLIST.md is one phone step per fix, and docs/PHONE-SCRIPT-v7.13.2.md is the one-page version.
SD Maid AppCleaner (the accessibility cleaner)
- The accessibility cleaner starts on its own. When AppCleaner needs the accessibility service and it is off, or on but not running, and you have already given the consent and a working mode (ADB, Wireless Debugging, Shizuku or Root) exists, the app writes the setting itself (or takes the service out and puts it back so Android binds it again), waits up to eight seconds for it to connect, and runs. It never gives the consent for you and does nothing in Read-Only mode or without a working mode; then the old "turn it on" message stays, with one more clause saying what was tried. Whether One UI binds the service this way, and how long it takes, can only be seen on a phone.
- This app and Android System WebView are never force-stopped by the cleaner. The app and the WebView packages (
com.google.android.webviewwith its beta, dev and canary variants, andcom.android.webview) are stock AppCleaner exclusions, removable and back with Restore default exclusions. A guard that does not depend on the list also keeps this app and the WebView provider found at run time out of the force-stop step and out of the list handed to the automation; they show as excluded, not failed. Force-stopping this app ended the accessibility service (Android removes it) and cut the cleaning short.
Connected Devices
- Choose package files and Files "Send a file here" deliver again. Both used the same request code as the Saved lists backup-folder picker, so the chosen file went to the wrong handler: the queue stayed empty, and a picked APK could repoint the backup folder. The picker has its own code now and a test checks that all request codes differ.
- Files Delete, Rename and New folder act on the device you asked about. The question could stay open while the device list moved on; confirming then ran the command on the other device and said Deleted. The device is fixed before the question and the action is refused if it changed.
- A multi-file push and the APK pull stop when the device changes and say the push or pull did not finish, instead of continuing on the other device and reporting success.
- Pulling a folder with skipped files no longer says "Saved". Every output line is checked: an
adb: error:line or a non-zero skipped count is shown instead.
Backups
- Restoring an app you removed with "keep data" installs it. The restore treated it as a removed system app and refused with "signed with a different key" (on a phone with several users it also asked twice). That branch is now taken only for a real system app.
- The saved-lists backup in Downloads is saved as
.json(it was written as.json.txtwhile the message said.json) (#191). - Delete on a backup asks first and Cancel keeps the backup without calling the phone (#192).
- "Also restore app data" on a same-version restore asks the native question an install asks before replacing the app's data as root (#193).
- The Hidden Settings restore says which entries it could not read instead of dropping the entries of an unreadable table silently (#194).
- "Permissions X of Y granted" counts only the permissions that were tried, so permissions skipped as not dangerous on this Android no longer read as failed grants (#195).
Terminal
- Keys and the terminal size are no longer lost while the real terminal starts. What you typed before the shell was up, and the size sent for the soft keyboard, were dropped, so vim and top drew with the wrong number of rows. They are held, sent in order, and the size is sent again when the shell reports it started.
- Opening the real terminal no longer relabels a running session. The dropdown said Termux over the app's own shell. The running shell is kept; a different shell you ask for restarts the terminal like the dropdown does.
- CTRL and ALT work with arrows, Home, End, PgUp, PgDn and the F-keys. They send the xterm forms with the modifier (CTRL+Left is
ESC [ 1 ; 5 D), and a one-shot CTRL or ALT is used up by any key; before, CTRL then an arrow left CTRL armed and the nextdlogged the shell out (#197). - A failed start of the real terminal no longer leaves a blank screen. The reason is written into the terminal and reopening starts again (#196).
Morphe Patcher
- "Install when finished" with "Delete the APK" no longer deletes the patched APK when the system installer was only opened. Without a working mode the app can only hand the file to the system installer and cannot know the outcome: nothing is marked installed or deleted, and the page shows the real text instead of "Installed."
- A patch keeps being shown and followed after you leave the app and open it again. The page used to show nothing running, a new patch was refused with the out-of-memory text, and a catalog time-out could cancel the patch that was running. A second patch started while one runs now says the patcher is busy at once and does not touch the first; a cancel acts only on the job it names.
- Cancel ends a patch at once with its result line, which the engine's own output could overwrite; the events file is now emptied and appended to by both (#198).
- The patch notification shows patch names with curly quotes or non-Latin letters correctly (it decoded them as mojibake) (#199).
Updates
- The "N of M" count in the update check only goes forward (#185). Progress reports are queued in the order the counters changed and delivered one at a time; the final report is last and nothing follows it.
Full code review of 2026-10-14 (#206 to #215)
A review of the whole repository on its merged state found more wrong-result bugs; each is fixed with a test where the code can be tested without Android.
- Connected Devices follows the device you chose. A device change stops the console command and the live log of the old device; Settings, Reboot and Power off never go to a device chosen after the question opened; the Apps and Logcat sub-tabs read the new device when it is chosen during a read; queued Send files and a running push are kept when old picks are cleared; the app's own private files (adb key, sealed secrets) are never sent or overwritten.
- File pickers no longer end the app when the phone has no picker (Install, Backups, font, text import, Connected Devices).
- Downloads: two Helper downloads with the same file name no longer mix their bytes.
- File Manager: the app's private data is never copied to or from added storage or into an archive; after Share or Open with on an added-storage file the sheet's Edit, Delete and Rename act on that file again; the thumbnail thread stops when the window closes; Compare no longer calls files "the same" when only their sizes match (tar, 7z, RAR and AES zips); a translated confirmation keeps the name of the file or app.
- Archives: a RAR or 7z whose file data is encrypted asks for the password; a
.gzof several members (or a multi-frame.zst/.lz4) extracts; files with 250-255 byte names extract; "New folder" in a zip makes a folder unzip can open; file search finds entries in zips with non-UTF-8 names. - Installer: opening another package while one installs no longer breaks either install; a re-created window no longer opens an old "Open with" package again.
- SD Maid: a delete no longer reports files as deleted when the working mode cannot answer; a path exclusion typed as
/sdcard/..., in another letter case or with//protects the folder; History no longer overwrites the open "Affected paths" list. - Morphe: a run in which no patch was applied fails instead of installing the unpatched app; file calls from the page can no longer reach the signing key; the source "Pre-releases" toast says what was just set; dated and underscore release tags (2024-11-15, v1_2_4) show as updates.
- Page and shell: Stop Service and the renderer switch say they failed when the shell never ran the command; components with a
$in the name can be enabled and disabled; Task Manager labels per-core load with the right core after a core goes offline; Console "UID (id)" keeps the typed command and does not ask the AI agent; Enter in the pairing-code field no longer starts a secondadb pair. - Batch actions, profiles and Dex optimization report what ran instead of "failed to run"; adding a remote MCP server to Codex again saves the new token, and a server whose setup failed is not listed under "Already added".
- build.sh fails when javac reports an error in any class, not only when MainActivity is missing.
Appearance (#216)
- Batch sheet spacing, Debloater buttons switched off while nothing is selected, the Console "?" in its own room and an inverse toast. Tokens only; no new colour.
Security hardening (#217, #218)
- Every GitHub Action in the workflows...
ADB Application Manager Pro v7.13.1
A fix release on top of v7.13.0, cut from main. It carries the fifty-four findings of the whole-codebase review of 2026-10-13 (ten reviewers read the page and the Java in parallel; every finding was traced from a real input to a wrong outcome and twelve were reproduced by running the code; #183 fixed the eleven serious ones, #184 the rest) and nothing new: no feature, no wording change, no CSS. Each fix is tested on a computer (the UI suite, the Java suites, a signed build). Nothing in this release has been run on a phone by the people and tools that wrote it. Section 28 of docs/DEVICE-TEST-CHECKLIST.md is one phone step per fix, the eleven serious ones first. The one race found and not fixed is #185 (the update check's progress count can step back by one).
Data loss, the wrong device, or a failure reported as success (#183)
- SD Maid Deduplicator: the copy marked Kept is never deleted. Unticking one of the other copies used to remove the protection from the keeper, so the keeper and every other copy were deleted and only the unticked one stayed. The keeper is now protected whenever Delete all is off.
- A Connected Devices action or batch stays on the device it started on. Every step used to re-read the selected device; the six-second refresh re-picked another device when the current one dropped, and the device select was never locked, so an Uninstall or Freeze could land on a watch or second phone and the read-back report success. The serial is captured at the start and carried through every step and the read-back; the select is greyed out and the automatic re-pick is skipped while a batch runs; an action whose device changed under its question is refused.
- A failed privileged command is never counted as success. The exit status after the command's marker is read as leading digits only; a status that is missing or unreadable (the app's own time-out note, output cut off) is a failure, and so is a missing marker. In Root mode a refused or denied
sureturned empty output, which read as ok: it is now reported as "root is not granted". This feeds uninstall, freeze, app ops and the batch counts. - Closing the full-screen terminal cannot freeze the app. With a program that does not read its input and enough queued bytes, close() blocked forever (an ANR from onDestroy) and the helper, the shell and the program outlived the app. The killer thread now starts first and the stream is closed off the caller's thread; the regression test queues 288 KB into a program that does not read and requires close() to return within 2 s.
- Rename onto an existing name is refused. Renaming a file to the name of a folder in the same place used to move the file into that folder and overwrite the file of that name inside it. The rename branch now has the same "name is taken" check as New file; a typed copy or move destination that names an existing file is refused too, and the shell
cpfallback gets the guardmvalready had. - Copying or moving from an added storage into a local folder honours Skip and Keep both. The answer was ignored, the local file overwritten, and on a move the source then deleted.
- Extract with Keep both never deletes an existing folder. A file whose name matched an empty folder deleted the folder and took its place; the file now gets a unique name whenever anything is in its way, and the writer refuses to delete a directory.
- A document provider's display name is never used as a path. A provider returning
../../xas a name could write outside the destination folder; names with/,.,..or control characters are rejected and the copy's canonical path must stay under the destination. - A privileged Morphe install of a plain APK copies it into the app's cache first. The file in Downloads was confirmed and then installed from the same shared path, so another app with storage access could swap it in between; the file that is confirmed is now the file that is installed, as the bundle path already did.
- Hidden Settings restore reads a table that is still loading before writing. A restore started while a table was still being read journalled the old value as "was not set", so Revert deleted the setting instead of putting the old value back.
- SD Maid on a second user. The user id now comes from the running uid, and the CorpseFinder's private and public app-data filters do not run off the system user (they are named in the skipped filters) instead of comparing user 0's app data with the second user's package list and offering it as corpses.
Features that did not work, or wrong results (#184)
- The Morphe Patcher tab loaded seven times on every switch (one line pasted seven times); it loads once, with no flicker or doubled entries.
- Morphe "This version is not supported" sheet: Patch anyway, Skip them and Get the right APK do what they say; the sheet used to close before the button ran, so all three did nothing.
- Debloater review sheet shows its list and a Confirm button after any batch, instead of the previous batch's progress body with no button.
- Update All twice: a second Update All merges into the queue instead of replacing it, so apps still waiting from the first are no longer left on Queued forever.
- Check again during a running queue: a row that never gets a start event becomes an error within 15 s instead of reading Downloading forever (and the rest Queued).
- A declined or read-only update is reported as cancelled, not as Update failed; Java emits a
cancelledstage for an update that is no longer in the list. - App Stores, Orion: an entry with a bad
githubRepo("owner/", "/", a full URL) is skipped instead of failing the whole tab; each entry is parsed under its own guard. - Version comparison: "2.0-beta1" is older than "2.0" and "1.2.3-1" older than "1.2.3-2" (they compared equal, so a beta-to-release update read as up to date); the existing "3.10-Pro" cases still hold.
- SD Maid shell deletes report with
printf, so a file name with\cor\nno longer makes a whole delete batch read as failed (reproduced under mksh) and keeps it out of History. - File search on an added storage shows the file's name instead of the encoded document id, In folder works, and the
..row is there after opening a hit. - Hidden Settings and Overlays act on the running user (
--user current), so a work profile or second user edits and reads back its own tables instead of user 0's. - Doze & power governor: one failed
cmd power helpread no longer locks the Performance profile as "Not on this Android version" until the mode changes. - Bottom bar: a badge update during a long-press no longer re-renders the bar and opens the shortcut menu in the top-left corner.
- Archive extract reports progress from inside a large entry (every 1 MB), so a multi-GB file no longer trips the "nothing has moved" watchdog or drops the ETA; a cancel from inside the entry leaves no part file.
- Renaming a folder inside a tar maps hard-link targets too (they pointed at the old name).
- AES (AE-2) entries are authenticated even when the deflate stream ends before the ciphertext does.
- Hidden Settings restore accepts keys with
/,+,,or$(the editor accepted them; the restore dropped them and still said "Restored N of N"). - Profile apply over a running batch is refused without closing the other batch's sheet and reporting "0 succeeded".
- A failed batch clears its label; the move clipboard drops the paths that were moved after a Skip paste; the Morphe Helper sheet reopened during a download keeps the running download instead of losing its result; a Termux start that fails at once no longer leaves a stale sync report to run unasked later;
executeBatchActionDetailedreads the exit flag and no longer leaks the marker.
Leaks, stale state and hardening (#184)
- Task Manager polling stops while the app is in the background and resumes when it comes back.
- The log recorder is application-scoped: status and Stop work after Back or a theme change, and a second recorder cannot start.
- A finished-job notification carries its own title when two file jobs overlap.
JobTicker.stop()waits for a report under way, so nothing ticks after stop.- Update check: the device probe no longer runs under the run lock (progress and Cancel used to stall behind it), and the 90 s deadline runs on a monotonic clock, so the phone syncing its time mid-run no longer ends the run with every app "timed out".
- One bad Exodus entry no longer rejects the whole tracker list.
- The VirusTotal key is never in a URL path (the quota request used
/users/<key>/; it now uses the id from/users/current). adb raw host:*is refused by the Connected Devices allow-list.- The Rish syntax check reads the command from a heredoc, so no API key is in a child process's argv.
- The pty helper ignores SIGPIPE (rebuilt for arm64-v8a, armeabi-v7a and x86_64; its nine qemu checks pass), so the grace-then-SIGKILL step runs on a closed output; the launch probe no longer inherits stdin and eats the first keystrokes.
shizukuPipekeeps the real error on EPIPE; a timed-out process no longer leaks its blocked reader thread;saveTextToDownloadsremoves its empty MediaStore row on failure; working-mode strings are checked against the four modes; the Rish and JsStream flushers stop after destroy;getpropis waited for and destroyed; the Installer stages each APK to a per-call name that is removed afterwards.- Not run on a device: none of the above has been run on a phone by the people and tools that wrote it. Section 28 of
docs/DEVICE-TEST-CHECKLIST.mdlists one phone check per fix.
ADB Application Manager Pro v7.13.0
A feature release on top of v7.12.11, built on the branch release/v7.12.12 (the work was planned as v7.12.12 and grew into a minor version). New: an Extra Settings tab (Private DNS with fifteen services and a speed test, animation speed, brightness bias, device telemetry, power and reboot, Doze and the power governor, zram and memory), a bottom navigation bar with pinned tabs and long-press shortcuts, a Console tab (ADB Shell and Live Logcat) with the Terminal as its own tab, a rebuilt Application Updater check, an Install button on every ShizuStore row, a DUMP row and "Copy grant commands" in the permission sheet, an SD Maid accessibility fix for One UI's App info page, the Morphe sources labelled Official and Custom, and three install follow-ups. Everything is tested on a computer. On a phone, only this was run: the owner re-ran the three Private DNS checks of section 21 (AdGuard DNS, Off, Automatic) on v7.12.11 on 2026-10-12 and each read back correctly from settings get global private_dns_mode / private_dns_specifier; the card text, Android's own Private DNS screen and a page load were not verified. Nothing else below has been run on a device by the people and tools that wrote it.
- Extra Settings tab: Private DNS with fifteen services and a speed test (#157, #158). The Private DNS card moves out of the gear Settings page (a tester could not find it there) into a tab of its own, Extra Settings, right after Hidden Settings; the gear page and the Hidden Settings tab point to it. The services are tiles: Google Public DNS, Cloudflare (and Cloudflare Security and Family), Quad9 (and Quad9 with no filtering), AdGuard DNS (and AdGuard Family and AdGuard with no filtering), OpenDNS, CleanBrowsing (Family, Adult and Security filters), NextDNS and DNS.SB, plus Automatic, Off and your own host name (Mullvad is left out: its public encrypted DNS is being retired). Test speed measures each service natively: one name lookup, then up to three short encrypted connections on port 853 (TCP connect, TLS handshake, one real DNS-over-TLS lookup of
example.com), the median is shown per tile with the fastest marked, Sort by speed reorders the tiles, Stop ends it and the tiles not reached say Not tested; a tile that failed the test needs a second tap to be applied. The test works without a working mode; applying a service still needs one and reads the phone back before it says anything. At most 8 name lookups run at once in the whole app, a lookup that outlives its timeout is counted as "resolver busy", and a test is cancelled when it is replaced or the tab is left. Java suitednsprobe(local TLS servers), UI script t217. Not run on a device (apart from the owner's three read-back checks above). - Extra Settings: animation speed, brightness bias, device telemetry (#170). Three sections after Private DNS. Animation speed sets Android's three Developer-options scales (window, transition, animator) together, from Off to 10×, with a moving dot per row that previews the speed before Apply; the card reads the three scales back and shows what the phone really holds. Brightness bias shifts adaptive brightness darker or brighter (
screen_auto_brightness_adj, −1 to 1) without switching it off, says when adaptive brightness is off, and offers Android's display settings. Device telemetry only reads: three rings (RAM used, storage used, battery, with the charging state) and spec chips (model, Android and One UI version, kernel, uptime, battery temperature and health, swap), refreshed every five seconds while the tab is on screen and paused when it is not, with a Copy report button; it needs no working mode. The chips at the top of the tab add Animations and Battery. Each section that changes the phone is locked with a reason in Read-Only mode, and nothing changes until Apply. UI scripts t250 and t170, Java suitetelemetry. Not run on a device. - Extra Settings: power & reboot, Doze & power governor, zram & memory (#172). Power & reboot: six tiles (Reboot, Soft reboot for root only, Recovery, Power off, Bootloader, Restart SystemUI) that open a sheet naming the exact command and run nothing until confirmed; the three dangerous ones need a 1.2 s press-and-hold; a 10 s watchdog reports a phone that did not answer, with the phone's own refusal text. Doze & power governor: a five-phase timeline read from
dumpsys deviceidle, Force / Step / Wake / Simulate motion with read-back, and Performance / Balanced / Ultra saver profiles whose marked card comes from the read-back only. Zram & memory: compression badge, a stacked bar and 2×2 stats frommm_stat,disksizeandmeminfo, refreshed only while on screen, with root-only cache drops and the Settings page's own trim path. Everything is locked with a reason in Read-Only mode. UI script t251, Java suitepowertweaks. Not run on a device. - Bottom navigation bar and long-press shortcuts (#164). A bar at the bottom with four pinned tabs and More (the defaults are Application Manager, Installer, Extra Settings and Console), a gradient pill on the lit slot, badges, a More sheet with every other tab, pin buttons in the Feature List, and Settings > Navigation with Bottom bar only (the default: the tab bar at the top is gone), Bottom bar + top bar and Top bar only. The bar slides away for the keyboard, sheets, the full-screen terminal and start-up, becomes a 76 px rail at 720 px and wider, and everything fixed near the bottom is lifted by its height. Holding a slot (450 ms) opens a menu of up to four shortcuts (navigation only; Update All is the one exception and still asks the install question); Settings > Navigation > Shortcuts chooses them per slot. UI scripts t260 to t263. Not run on a device.
- Console tab: ADB Shell and Live Logcat; the Terminal as its own tab (#161). The Command-Line Interface tab is split in two. Console (in the place the terminal had) has the two-segment look of the Kotlin console: ADB Shell with an outlined command box, an accent Run button and the history as newest-first cards with outcome, Copy, Run again and Show all; and Live Logcat, the former Logcat Viewer moved as it was, read only while on screen. Terminal keeps the pty terminal, the three shells, Termux sync and the Coding Agents. Saved tab choices are migrated; nothing opens the old Logcat tab by its key any more (it opens Console on Live Logcat). No feature is lost. Not run on a device.
- Application Updater: a rebuilt check and result screen (#159). The check runs every source at once from three ordered queues with 8 workers, 5 s / 8 s timeouts and a 90 s deadline that reports unfinished apps instead of dropping them; it can be cancelled; a host that is down is given up on after 3 requests and named once in the failure list; a phone that is offline is reported at once; the Obtainium catalog is read as a whole and kept for 24 hours; results are kept 30 minutes per package and version (7 days for "no source knows this app", errors never). The page streams rows as they are found, shows a real progress bar and a live-region status, Cancel, Retry failed, Check again, ignore saved results, and the saved result after a restart. It never says "up to date" when apps could not be checked, and a broken check never moves the time of the last good one. On a 120-app model the first run makes 192 requests instead of 385, and 125 instead of 315 with IzzyOnDroid down. The install side is unchanged. Java suite
updatechecker(134 checks). Not run on a device. - App Stores: an Install button on every ShizuStore row (#163). From the first phone check of v7.12.11 ("the ShizuStore Install buttons are missing on the right side of each app"): every ShizuStore row now has the same Install button as the other stores, installing without opening the details sheet, through the one shared download rule and the one shared start path (so the install question still comes first). Row state survives search, sort and Show more; progress is routed to the installing app's row. Not run on a device.
- Permission sheet: a DUMP row and "Copy grant commands" (#160).
android.permission.DUMPis a row of the first-launch permission sheet and of About > Permissions (privileged only: granted through the working mode, and the phone's own check decides whether it shows as allowed). A button copies theadb shell pm grantlines for what is still missing (restricted settings excluded: the app cannot see a grant made from a computer), and a grant made from a computer gets its tick when the sheet is reopened. Not run on a device. - SD Maid: the accessibility cache clearer no longer stalls on One UI's App info page (#162). When the Storage row's click returns true and does nothing, the service tries a ladder of ways (scroll clear of the floating bar, node click, parent click, a passthrough gesture tap, D-pad with a focus guard by ancestry, and in a privileged mode an input tap and input keys), a watchdog ends an app after two rounds without effect and stops a run after three such apps in a row, and a Copy screen report button in the SD Maid tab copies per-app diagnostics (plan, step, what was tried, a Settings-only screen dump). The tab says why the service could not run (off, not running, no consent) and which apps the pre-flight left out. Reasoned from the owner's screenshot and upstream SD Maid SE; not run on a device.
- Morphe Patcher: sources are labelled Official and Custom (#165, ported as #173). The sources sheet labels the pre-installed source Official and every added one Custom (it said Pre-installed before, and nothing on an added one), with a line saying what the two mean and that a source that is off is not loaded. Not run on a device.
- Install follow-ups (#156). Read-Only mode empties the Updater queue and now also removes the waiting rows' queued progress entries, s...
ADB Application Manager Pro v7.12.11
A feature release on top of v7.12.10: a Private DNS card in Settings, a result line under each command in the ADB Console (not in Rish mode), the app's own question before an install from the Installer, the Updater (and Update All), a restore or the Morphe Patcher (and no privileged install in Read-Only mode), and readable text on the App Stores buttons. Nothing else in v7.12.10 is changed. Each is tested on a computer.
- Settings: a Private DNS card. Settings has a new card for the phone's Private DNS (encrypted DNS for the whole phone, Android 9 and newer): AdGuard DNS (
dns.adguard-dns.com), Cloudflare (one.one.one.one), Quad9 (dns.quad9.net), Automatic, Off, or a host name of your own. The card shows what the phone has now, checks a host name before sending it (letters, digits, hyphens and dots; at least one dot; no address, URL, port or space), changes the setting through the working mode you use (it does nothing without one), and then reads the settings back and shows what the phone really holds; it never says "done" because a command ran. Pressing a button during a change, or switching the working mode during one, cannot make an old answer update the card. A wrong host name can leave the phone without DNS, and Automatic or Off is the way back. Not run on a device. - ADB Console: a result line under each command's output. After a command run in the ADB Console the output is followed by one line: "Finished. No error text in the output." or "Looks like a failure:" with the reason (error, timed out, permission denied). It reads the failure signs of the Kotlin console and the app's own shell code: output that starts with
Error:oradb: device(any capitals) orFailure [, or that containsadb: error:,SecurityException,Permission Denial,unauthorizedor the time-out note. The shell gives the page no exit code, so no exit number is shown, and a command that fails without printing one of these phrases still reads "Finished"; a listing that merely contains one of the words (for exampleadb devicesshowingunauthorized) reads as a failure. Rish mode keeps its own[exit N]note and gets no result line. Not run on a device. - Installs through ADB, Shizuku or Root ask first on the Installer, Updater, restore and Morphe Patcher paths. Since v7.12.10 only the store route asked: pressing Update in the Updater, Install in the Installer, restoring a backup and installing from the Morphe Patcher still installed without a question of the app's own. Each of them now shows the app's dialog (which the page cannot press) before anything is removed, signed or installed. For Installer Install, Updater Update, Restore (also before a removed system app is brought back) and the Morphe Patcher the dialog shows what the app read from the file itself (package, version, whether it replaces an app); the Morphe Patcher's uninstall-first step removes the app the APK is, as read from the APK. Update All is asked once, before any download, so its dialog can only show the names and versions the update check found, labelled "not checked" (at most 8 apps are named); a yes covers those apps at that version, source and working mode, once each, for 15 minutes at most, and ends with the queue, and each file is still checked as it arrives. If the working mode changes while a question is open, nothing is installed. Not asked: updating the app itself (the page chooses nothing there: fixed release page, this package, newer, same signing key) and Connected Devices, which installs on another device through that device's own authorization. Known gaps, listed in
docs/COPILOT_CLAUDE_HANDOFF.md: rows of an Update All queue can stay on "queued" after the mode switches to Read-Only until the next update check, and an older Update All yes is cleared only when a new Update All question is allowed. Not run on a device. - Read-Only mode no longer installs through a still-connected ADB. In Read-Only mode the Installer used the Authorizer the page chose, so an install could run silently through ADB, Shizuku or Root even though the app was in Read-Only mode. The app now ignores any privileged Authorizer outside the four working modes and uses the system installer, which asks; the Authorizer drop-down follows the working mode (a choice made by hand is remembered), hides ADB, Shizuku and Root in Read-Only mode with a sentence saying why, and a package loaded from the File Manager cannot be installed in Read-Only mode. Not run on a device.
- App Stores: readable text on the install buttons. The text on the install button, the letter tile of an app without an icon (in the list and in the details window), the selected store tab and the main buttons of the working-mode cards is now black or white, whichever reads better over the whole accent-to-secondary gradient, not over the accent alone. Checked on a computer in 16 palette and light/dark combinations. Not run on a device.
- Not run on a device: none of the above has been run on a phone by the people and tools that wrote it. Sections 20 (installs), 21 (Private DNS) and 22 (ADB Console) of
docs/DEVICE-TEST-CHECKLIST.mdlist the phone checks for this release; section 20 also covers the two install steps that failed in the v7.12.10 phone check (the Updater without a question, and a silent install in Read-Only mode).
ADB Application Manager Pro v7.12.10
A patch release: the app now asks before it installs a downloaded app in adb, Shizuku or root mode, twenty-one fixes from read-only audits of the archive code, the Morphe Patcher (a question before a custom patch bundle is loaded, the signing key shared through the share sheet) and the font setting, real app icons in the app menus, a "File not found" label in Patched APKs, and a Refresh button for the app list. Each is tested on a computer.
- Installs of downloaded apps in adb, Shizuku and root mode ask first (#109, C-011). In those modes a store install used to run with no question, taking the address, package and checksum from the page; a script in the page could install any
httpsAPK as a new app. A dialog of the app itself (the page cannot press it) now asks before the install. It lists what the app found out for itself first: the host the file finally came from after redirects (a name with non-ASCII letters is shown in itsxn--form), whether the app is new or replaces the installed one, and whether the file matched the checksum that came with the install request. Below it, labelled "not checked" and always in quotation marks, are the package and version written in the file and the name the page gave. No answer in two minutes, or closing the app window, counts as No (pressing Home leaves the dialog open). Standard mode is unchanged (the system installer already asks). The dialog is not a boundary against a page that already has a shell in the active mode (such a page can tap Install itself); the decision is recorded indocs/COPILOT_CLAUDE_HANDOFF.md(C-011). Not run on a device. - Archives: an entry is capped by the free space (#121, audit Z-1). Extracting a zip, tar, 7z or RAR archive could write far more than the archive's file size suggests (a 10 KB sparse tar that declares 6 GiB, a small 7z of zeros) and fill the phone's storage. Each entry may now write only what is free less a 64 MB reserve, and one that declares more is refused in words before anything is written. Tested on a computer; not run on a device.
- Archives: tar hard links (#122, audit Z-2). A hard link in a tar was extracted as an empty file and counted as done. It is now a copy of the file it shares, or skipped with a note when that file is not part of the extraction. Tested on a computer; not run on a device.
- Morphe Patcher: a job id that names a folder (#119, audit M-8). A patch started with the job id
..emptied the whole Morphe folder (sources, signing key, patched APKs). Job ids are now 1 to 40 letters, digits, dashes and underscores. Tested on a computer; not run on a device. - Morphe Patcher: importing a signing key (#120, audit M-5). Importing a text file, or a keystore with the wrong password, replaced the signing key and the failure only showed at the next patch. The file is now opened with the password and must hold a key named Morphe first; the old key is kept as a backup file. Tested on a computer; not run on a device.
- Morphe Patcher: one patch at a time, really (#123, audit M-7). The check for a patch already running read a name and then wrote it, so two patch calls arriving together (a double tap, or a script in the page) could both be accepted. Taking the one run slot is now a single atomic step. Tested on a computer; not run on a device.
- Morphe Patcher: a finished patch is not lost when Downloads cannot be written (#124, audit M-3). When the copy into
Downloads/Morphe Patcherfailed, the fallback into the app folder reused the same folder name (the millisecond) and failed too, losing the patched APK and leaving an empty folder. Each filing now gets a free name, and a failed one removes what it wrote and puts the APK back. Tested on a computer; not run on a device. - Morphe Patcher: two source reads at once no longer cut each other's files (#125, audit M-2). Reading the patches of two sources at the same time rewrote the job file and deleted the events file the first read was using, so the first waited its full four minutes. A run now takes the engine before it touches its files, and the second read finds the first one's answer in the cache. Tested on a computer against a fake service; not run on a device.
- Morphe Patcher: Stop before the service starts (#130, audit M-4). Stop pressed before the patcher service had started was lost: the page was told "Cancelled" while the engine, started afterwards, kept patching. A Stop is now remembered, so a run that has not started its engine never starts it, one that arrives while the service starts is passed on, and one for any other job id changes nothing. Tested on a computer against a fake service; not run on a device.
- Morphe Patcher: a finished patch that the app never filed (#129, audit M-9). The patcher runs in a process of its own and can finish after the app was killed; its patched APK then stayed in a work folder for good. When the Patched APKs list opens, such runs are now filed (from the request saved with the run) and the folders of failed or long-dead runs are removed; the run in progress is never touched. Tested on a computer; not run on a device.
- Morphe Patcher: Patched APKs entries are not forgotten (#127, audit M-10). An entry whose APK was kept in Downloads was deleted, with its log, when the file could not be seen for a moment (storage access revoked, the card not mounted). It now stays in the list, marked missing. Tested on a computer; not run on a device.
- Morphe Patcher: a copy is whole or absent (#126, audit M-11). A copy of a patched APK or of the signing key that failed half way left a partial file that looked real and replaced a good file already there. Copies now go through a hidden
.partfile that is renamed when complete. Tested on a computer; not run on a device. - Font setting: a stalled font source no longer freezes it (#128, audit F-1). Picking a font from a source that stops answering ignored the 30 second limit and held a lock, so Apply and Clear waited behind it. The copy now stops at its limit and the lock is taken only to swap files. One change in behaviour: a pick that finishes after a newer pick or a Clear is dropped ("A newer font was chosen.") instead of overwriting it. Tested on a computer; not run on a device.
- Archives: a huge tar header is refused (#131, audit Z-3). A tar whose long-name or extended header declared 1.5 GiB (in a file of 1.5 MB) ran the app out of memory when it was opened or listed. Such a header is now refused in words (over 1 MiB for a name, over 8 MiB for an extended header); real archives need far less. Tested on a computer; not run on a device.
- The app menu shows the app's own icon (#132). The tile left of the app's name in the menu of a single app used to show the first letter of the name. It now shows the app's icon (the one the app list uses, with the icon pack you chose), asks the phone for it once when it is not known yet, and keeps the letter until it arrives, when the phone has none, or when the icon cannot be drawn. An icon that arrives for another app does not replace the tile of the app in the menu, and the tile stays 44 px square under a long name. Tested on a computer (UI script
t155); not run on a device. - Connected Devices: real app icons in the list and in the app menu (#133). The rows of the app list showed an icon only when this phone happened to have it cached, and the app menu of that tab had no tile at all. The list now asks the phone once for the icons it does not have and puts each one on its row when it arrives; the app menu gets the same tile as the single-app menu (the icon, the first letter until it is known, nothing for a menu that is not about an app). The icons come from this phone, so an app that exists only on the other device keeps its letter. Tested on a computer (UI script
t158); not run on a device. - Patched APKs: a "File not found" label (#134). An entry kept in the list since the M-10 fix (its APK in Downloads is out of reach) now says so: a "File not found" chip and one sentence of explanation, with Install, Share and Save to Downloads switched off; Log and Delete stay on. The two new strings are in all 13 translated dictionaries, and the dictionaries drop six strings of the cheat-sheet gist loader that the page no longer has. Tested on a computer (UI script
t156); not run on a device. - Font search: a time limit per file, Stop when Settings is left, no collections in the list (#135, audit F-2, F-3, F-4). The 100 ms scan limit was checked only when a folder was entered, so a folder with 120,000 files ran 1.2 s past it without saying the search had stopped early; the clock is now read every 16 files, and the page's "stopped at its limit" note shows. Leaving Settings during a search only made the page drop the answer while the phone kept walking storage for up to 25 s; the walk now checks for a cancel before every file and the page asks for one when Settings is left (the phone answers "cancelled", the page tidies up without a message; a late cancel never stops a newer search). A font collection saved with the name
.ttfor.otfwas listed but failed when chosen ("A font collection (.ttc) cannot be used here"); a file that starts with thettcftag is now left out of the list like a.ttcfile (choosing such a file by hand still gives the reason). Tested on a computer (UI scriptt157, Java suitefontscan); not run on a device. - Archives: more than 500,000 entries is refused in words, not listed in part (#136, audit Z-4, Z-5). A tar with 2 million empty entries (a 14 MB tar.gz) or a 7z of 1 million empty files (300 KB) ran the app out of memory when it was opened, and an archive over the old limit was listed cut off without saying so, which also made "delete after extract" compare against the cut list. The entry limit for tar and 7z is now 500,000 (the zip limit), the names of the entries may take at most 40 MB, and an archive past a limit is refused with a...