Skip to content

LiveWall for Android 1.0.0

Choose a tag to compare

@salahu01 salahu01 released this 07 Aug 07:37
· 27 commits to main since this release

The first release of the Android port. A live wallpaper built around one
constraint: it should cost almost nothing when you aren't looking at it.

When the wallpaper stops being visible — any app in front, screen off, device
locked — the MediaCodec and its buffer pool are destroyed, not paused. The
last frame stays on screen composited by SurfaceFlinger at no cost, and playback
resumes from the saved timestamp.

State Memory (PSS) CPU
Video, 1920×1080 24 fps, wallpaper visible 44 MB 12.3%
Video, wallpaper hidden 32 MB 0.00%

⚠️ These are emulator numbers and the CPU figure is not representative. They
come from an API 35 arm64 emulator with hw.gpu.enabled=no — software AVC decode
and a SwiftShader GL stack, i.e. every fixed-function block this design depends
on replaced by the CPU. No hardware-device measurements have been taken. The
teardown result on the second row is codec-independent and stands; the
visible-state CPU figure is not a phone number and is not quoted as one.

111 KB. No AndroidX, no Compose, no Material, no media3, no bundled ffmpeg
— the shipped runtime classpath is the Kotlin standard library and nothing else.

Install

Requires Android 10 (API 29) or newer.

adb install LiveWall-android-1.0.0.apk

Then open LiveWall, add a video, and set it as your wallpaper. Videos are
converted on import and only the converted file is played; your original is never
copied or modified.

The APK is signed with a self-signed key, not distributed through Play, so your
device will ask you to allow installation from this source. Signing certificate:

CN=LiveWall, O=Fegno Technologies, C=IN
SHA-256  f5:6b:aa:64:f4:4c:ad:a6:e9:65:b4:33:cc:f4:3a:33:8b:5f:81:92:e3:d5:d2:4b:6a:9e:14:75:73:29:43:28

Or build it yourself — see platforms/android/README.md:

cd platforms/android && ./tools/build.sh install

Known limits

  • No hardware-device measurements, as above.
  • OEM skins are untested. Some launchers keep the wallpaper permanently
    hidden behind a blur layer, some never report visibility correctly, and some
    aggressively kill wallpaper services. Nothing here has been exercised beyond
    stock Android.
  • The gradient mode is not free, unlike its macOS counterpart —
    SurfaceFlinger will not animate a buffer for you, so the drift is redrawn from
    the app process at 10 fps.
  • No parallax on launcher scroll, deliberately: it would mean redrawing at
    the panel's refresh rate rather than the wallpaper's.
  • One wallpaper. No playlist, no separate lock-screen wallpaper.
  • The thermal and low-battery gates are coded but not observed firing — the
    conditions are awkward to stage deliberately.
  • 10-bit is best-effort. It needs both an encoder advertising HEVC Main10 and
    an EGL config with 10 bits per channel; where either is missing the import
    quietly produces 8-bit and records that.

Verified for this build

55 unit tests — frame pacing, output sizing, fit geometry, index decoding — pass
against the tagged tree. The decode and transcode paths need a real codec and
live in androidTest, which needs a device; they were not run for this release.


The macOS port is
where this design was worked out and measured. The Windows and Linux ports are in
the tree but are not released.