SplitAudio is alpha. Please read the limits below before relying on it.
- The routing helper (
route/AppRoute.java) runs as the shell user (started through Shizuku). That is what lets it register a system audio policy (MODIFY_AUDIO_ROUTING). - The app writes
approute.dex/approute.shinto/data/local/tmpand runs them there. Anything else that already has shell access could replace those files — this is the same trust level as shell/Shizuku itself, not an extra hole. - The accessibility service filters volume keys and reads only the foreground package name
(
rootInActiveWindow.packageName). It is declared withcanRetrieveWindowContentbecause Android requires that forrootInActiveWindow; screen text is never read.
- The helper listens on 127.0.0.1:47821 only (not reachable from the network), with no authentication.
- Commands:
state→on/off;vol up|down <package>→ changes the phone speaker volume by one step, only while the rule is on and only for apps that are being routed to the speaker. - Any app on the same phone could therefore read the on/off state or nudge the speaker volume. It cannot change which apps are routed, stop the helper, or run commands. Input is parsed strictly; nothing is passed to a shell.
- Native AudioPolicy keeps at most 20 uids per mix and 50 mixes per policy → at most 1000 app uids are routed; any extra apps stay on Bluetooth (user-installed apps are listed first).
- The music app list is hard-coded (YouTube Music + Morphe build). Other music apps need a code change.
- Verified on one device (Xiaomi 15, HyperOS 3, Android 16). Other ROMs may ignore or reject the policy; if the helper dies or the policy is rejected, audio simply stays on Bluetooth.
- Apps installed after routing started are not included until the next start (music stop → start again).
Please open a GitHub issue. There is no network-facing component, so there is no private disclosure channel.