Research into the internals of the Nook Glowlight 4 Plus (model bnrv1300,
Android 8.1 / AllWinner "Emperor" platform), based on decompiled factory APKs and
live device investigation.
Device identifiers:
- Model:
bnrv1300 - Platform: AllWinner "Emperor"
- Android: 8.1.0 (API 27)
- Build:
8.1.7.120_user - SoC: AllWinner (3-core ARM)
| Document | Topic |
|---|---|
| statusbar-service.md | IStatusBarService AIDL — all 26 methods, what each does, how to bind |
| wifi-and-direct-suspend.md | WiFi management, Direct Suspend mechanism, synchronization risks |
| temperature-management.md | Temperature warning dialogs and thermal shutdown — what triggers them and how to suppress them |
| power-management.md | Deep sleep via power_enhance_enable, PowerManagerEx, nopowen patch, slide-to-unlock |
| ota-updates.md | OTA firmware update mechanism, server URLs, and how to permanently block all update paths |
| eink-and-frontlight.md | E-ink refresh via View.invalidate(int) hook; brightness via Settings.System; warmth via GlowLightService |
| hwc-hal-reverse-engineering.md | Full RE of hwcomposer.virgo.so, libgui.so, libsurfaceflinger.so, and framework VDEX — call chain from SurfaceControl.setRefreshMode down to layer->refreshMode at HWC struct offset 0x24 |
| handoff-surfacecontrol-path.md | Test procedure and decision tree for the new no-root SurfaceControl waveform path (GLR16 capable) |
ADB setup — Windows USB bridge to WSL
The Nook is connected to a Windows host via USB. WSL2 cannot access USB devices directly, so ADB is bridged: the Windows ADB server connects to the device over USB and WSL connects to that server over TCP.
All ADB commands from WSL use:
adb -H 192.168.1.92 -P 5037 <command>
Consequence: unplugging USB from the Nook also breaks ADB connectivity — there
is no WiFi ADB fallback. Any test that requires USB to be unplugged must complete all
ADB setup before the unplug, write output to the device filesystem (/sdcard/ or
/data/local/tmp/), and pull results after USB is reconnected.
All app-layer findings are derived from APKs decompiled with jadx from the factory
image: nookPartner.apk, nookBnEreader.apk, nookHub.apk, NookHWTest.apk,
ctm.apk.
Kernel and framework behaviour was verified live over ADB with root access (Magisk).
-
com.nook.partner/StatusBarServiceis an exported bound service (no permission required to bind) that acts as a privileged proxy for any app — it can toggle WiFi/BT, write anySettings.Systemkey, reboot, and control the status bar UI. See statusbar-service.md. -
WiFi management is best done directly via
WifiManager.setWifiEnabled()(withCHANGE_WIFI_STATEpermission) or viasu -c svc wifi enable/disable. The nookPartner "Direct Suspend" mechanism uses the same underlying API. See wifi-and-direct-suspend.md. -
Temperature warnings come from
BatteryIconinsideStatusBarService. DisablingStatusBarServiceremoves the dialogs. The Android framework's own thermal shutdown remains active. See temperature-management.md. -
Deep sleep between page turns is triggered by writing
power_enhance_enabletoSettings.System. The AllWinnerPowerManagerExframework layer watches this key and callsnativeSetCpuBoostEx. The nopowen KOReader patch automates this on every page turn. See power-management.md. -
Slide-to-unlock is implemented in a custom
PowerManagerServicebaked into the system image — not controllable via any app or AIDL. Requires root to suppress. See power-management.md. -
OTA updates are handled entirely within
com.nook.partnerbyOtaIntentService(24-hour AlarmManager check) andSideloadInstaller. Both can be blocked viapm disableplus a/sdcard/ota_server.confredirect to localhost as a fallback. See ota-updates.md. -
E-ink refresh uses a hidden B&N-customized AOSP hook:
View.invalidate(int)routes the integer argument as an EPD waveform command to the display driver. KOReader usesGC16 | NO_MERGEfor all updates (full-quality only; no partial waveform). Brightness is set viaSettings.System.SCREEN_BRIGHTNESS(0–100 scale); warmth is set by sending an intent tocom.nook.partner/.service.GlowLightService, which holdsDEVICE_POWERand drives the LM3630A chip — no root required. See eink-and-frontlight.md. -
Unprivileged waveform control is available via
android.view.SurfaceControl.setRefreshMode(int), a B&N-added@hidemethod that routes through SurfaceFlinger →hwcomposer.virgo.so→layer->refreshMode(Layer struct offset 0x24) — no permission gate found at any layer. This path supports GLR16 (REAGL) via HWC's full/dev/dispioctl context, unlike the sysfsforce_update_modenode which silently ignores0x40. Whether the path is reachable on this firmware depends on whether B&N backportedViewRootImpl.mSurfaceControlfrom AOSP Android 10 — determined at runtime by the log line in KOReader. See hwc-hal-reverse-engineering.md.