Car+ Unlocker is a modern Xposed module (libxposed API 102) for OPPO / OnePlus devices that lets any installed third‑party app appear in the ColorOS Car+ (com.oplus.ocar) app list and be launched from the car UI.
- Package:
io.github.hao1196561270.CarPlusUnlocker - API: libxposed API 102 (modern Xposed API)
- Target: Car+ (
com.oplus.ocar) on OPPO / OnePlus ColorOS - Size: ≈ 54 KB release APK
- Dense list of third‑party (non‑system) apps (icon / name / version) with per‑app enable switches
- Search: tap the magnifier icon — the top bar expands into a full‑width input with live filtering (magnifier at the far left, the whole bar is tappable)
- Pull‑to‑refresh to reload the list
- “停止Car+” button: force‑stops Car+ (root required) so configuration changes take effect immediately; shows a short one‑time help dialog
- Hide launcher icon: hides the desktop entry via a launcher alias — the app itself stays reachable through the LSPosed manager "Settings" entry, the in‑app switch, or
adb shell pm enable io.github.hao1196561270.CarPlusUnlocker/.DeskIcon - Unified look: fixed brand‑color top bar (identical in light and dark mode with the status bar), pure white / pure black page backgrounds, adaptive text colors
- Minimal footprint: framework widgets only (ListView / SearchView / native pull‑to‑refresh), no androidx runtime dependency; the signed release APK is about 54 KB thanks to R8 + resource shrinking
Car+ Unlocker UI (module app)
│ writes via libxposed service
▼
LSPosed database (Remote Preferences, group "carplus_unlocker")
▲
│ read‑only via getRemotePreferences (hooked process)
│
com.oplus.ocar process
Hook 1 android.app.Application.onCreate → kill Car+ background processes + lazy scan of enabled apps
Hook 2 com.oplus.ocar.carcontrol.response.CertifiedApps.getList
→ unmark "experimental" apps, inject the enabled apps as media apps (fields like
appType="media", launch/display params, Car Fusion / CarPlus / double‑open support)
Enabled‑app switches are stored in Remote Preferences (LSPosed database) through the libxposed service; the hook reads the same group read‑only, so UI state and hook behaviour stay in sync without file sharing.
- Android 15+ (minSdk 35)
- Root (KernelSU or Magisk) with LSPosed (or a compatible framework) that supports libxposed API 102 (LSPosed 1.9.x with API 102 support or newer)
- Car+ (
com.oplus.ocar) installed - The “停止Car+” / refresh‑style actions need root (
su)
./gradlew assembleDebug # debug APK
./gradlew assembleRelease # signed release APK (signing config in `keystore/`, local only)Release builds are signed; keep keystore/ (git‑ignored) backed up so future releases can be installed over previous versions.
- Install the APK (release builds are signed; installing over previous versions preserves state).
- Open LSPosed → Modules → enable Car+ Unlocker (scope
com.oplus.ocaris declared statically by the module). - Open Car+ Unlocker, enable the apps you want in Car+ (search / pull‑to‑refresh supported).
- Tap “停止Car+” (root) or stop/restart Car+ manually; then check the Car+ app list in the car UI.
Hide launcher icon: toggle “隐藏桌面图标” in the app. To show it again: open the app via LSPosed manager → module → Settings and toggle the switch back, or run adb shell pm enable io.github.hao1196561270.CarPlusUnlocker/.DeskIcon.
The hooks target Car+ internals (CertifiedApps.getList, CertifiedAppInfo). Car+ updates may rename or restructure these classes; if the module stops working after an update, check the relevant signatures against your Car+ build. See HOOKS.md for the full hook list and maintenance notes.
Built on libxposed (Apache‑2.0) and androidx.swiperefreshlayout.