Daniel, 2026-09-22: “the app from the apk has no logo and is called ‘mobile’“.

What happens. dx build --platform android generates a Gradle project and names the app after the crate (mobile → Mobile), with its own template icon; [application] name = "Moonkale" and [bundle] icon in packages/mobile/Dioxus.toml are not applied to Android (spec 007 saw the label half of this). packages/mobile/build-android.sh therefore patches the generated project after dx build and before gradlew: it writes res/values/strings.xml and renders ic_launcher for every density plus an adaptive icon.

Why it broke. The patch is a post-processing step over a tree Gradle also caches. Gradle keeps per-variant intermediates, and a variant that was not rebuilt keeps the pre-patch values: on 2026-09-22 the release APK was correct (Moonkale, adaptive icon) while the debug APK built minutes later from the same tree said Mobile with the template icon — and that was the one installed on the phone (P-132). The label on disk and the label in the artefact had silently diverged.

Done already (2026-09-22): the script drops merged_manifest(s), merged_res, packaged_res and incremental before building, and afterwards reads the finished APK back with aapt2 dump badging, refusing to hand out an APK whose label is not Moonkale or which has no launcher icon. Cheap, and it turns a silent wrong artefact into a failed build.

Still wanted.

  1. Configuration, not patching. [application] name (and an Android icon) should reach the generated project — upstream in dioxus-cli, or, until then, by writing the values into the generated strings.xml/manifest from a single place that also owns the icon rendering, so nothing depends on which Gradle variant ran last.
  2. One source for the icon. packages/mobile/assets/icon.png is rendered to five densities plus an adaptive foreground by a Python/Pillow block inside the shell script. That belongs in a small Rust or dx step, not in a heredoc that a missing Pillow silently turns into a broken build (the CI job installs Pillow separately for exactly this reason).
  3. The same check for the other platforms: the .deb, the AppImage and the macOS bundle take their name and icon from Dioxus.toml/packaging/linux/moonkale.desktop, and nothing verifies the built artefact. A dx bundle that renames the app would be noticed by a user, not by CI.
  4. Version code. The generated project hardcodes versionCode = 1; two releases therefore carry the same code. Sideloading tolerates it, an app store would not, and “is this the newer build?” has no answer on the device. It should be derived from the version.

Related: Android · Packaging Overview · Problem Log P-132 · spec 007.