Repository navigation
Build and release a 32-bit ARM Android (armeabi-v7a) APK, and share files on Android 8 and 9 - #1208
Open
kevinaboos wants to merge 8 commits into
Open
kevinaboos wants to merge 8 commits into
kevinaboos wants to merge 8 commits into
Conversation
aws-lc-sys 0.32.0 has no pre-generated bindings for `armv7-linux-androideabi`, so its build script
fails there unless `bindgen-cli` is installed. Since 0.33 it ships target-independent ("universal")
bindings, which also means `bindgen` and `clang-sys` drop out of the dependency tree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
…64 one The Android release job is now a matrix, like the desktop jobs, built by `determine_matrices`. A tag push builds both ABIs; a manual run builds whichever of `build_android_aarch64` and the new `build_android_armv7` are checked. The armv7 asset is `Robrix-<version>-android-armv7.apk`. makepad-packaging-action picks the ABI from `MAKEPAD_ANDROID_ABI` alone (it ignores `--target`), so each leg sets it explicitly. The aarch64 leg builds and names its APK exactly as before. Both APKs of a release now get the same versionCode, computed once in `determine_matrices`. With `version_code = "auto"`, each job computed its own from the current hour, so jobs that straddled an hour would have given one release two codes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
`current_bytes * 100` overflows a 32-bit `usize` (e.g., on armv7 Android) once an upload passes ~43 MB, which made the shown percentage jump back toward 0% (and panic with overflow checks on). All three places that compute it now use one helper that widens first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
Points Cargo.lock at the heads of project-robius/robius#30 (`support_32bit_android`) and kevinaboos/makepad#6 (`android_armv7_robrix`), so this PR's armv7 build can be checked before those merge. Only the two git revisions change. Replace this commit before merging, once both are merged: `cargo update -p robius-location -p makepad-widgets`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
This was referenced Oct 25, 2026
kevinaboos
marked this pull request as ready for review
October 25, 2026 18:29
Both branches now also carry the Android 8/9 file-sharing fix: cargo-makepad's MakepadFileProvider (kevinaboos/makepad#6) and robius-share's use of the app's provider (project-robius/robius#30). The next commit declares that provider in Robrix's manifest. An APK built with a cargo-makepad that lacks the class would crash at launch, so this pin has to land first. Only the two git revisions change. Like the previous TEMPORARY commit, replace this before merging, with `cargo update -p robius-location -p makepad-widgets` once those PRs merge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
On Android 8 and 9 (API 26-28), robius-share can only share a file through the app's own `<package>.robius.share` provider, because there is no MediaStore Downloads collection to copy it into. Without one, sharing any attachment but a small text file fails there. Declare cargo-makepad's MakepadFileProvider with that authority, serving robius-share's copies in the cache. README: - Android 8.0 (API 26) is the minimum, not Android 13. cargo-makepad's default minSdk is 26, and Robrix doesn't override it. - Install cargo-makepad from the Makepad fork and branch Robrix depends on, not upstream `dev`. The provider class comes with cargo-makepad, and an APK built without it crashes at launch. CI and release builds already install cargo-makepad from the makepad rev in Cargo.lock. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds a 32-bit ARM Android build of Robrix (Rust target
armv7-linux-androideabi, Android ABIarmeabi-v7a) for devices with a 32-bit Android system, such as those whose CPU reportsarmv8l. Those devices can't install the arm64 APK at all. Many of them run Android 8 or 9, where Robrix couldn't share attachments, so this PR also fixes that.Depends on
compile_error!on non-64-bit Android, the only thing in robius that blocks the armv7 build;dock_current_tab_robrix.DrawVarspadding. Without it, every draw call's instance data is off by one f32 lane on 32-bit, so the whole UI draws garbled.MakepadFileProviderclass that this PR's manifest declares.Cargo.lockto them (cargo update -p robius-location -p makepad-widgets).For now, two commits marked TEMPORARY point
Cargo.lockat the heads of those two PR branches. Only the git revisions change. This lets CI test the whole stack, with the real NDK, before anything is merged. Before merging this PR, run thecargo updateabove, so the lock doesn't point at unmerged branch commits.The makepad revision has to include
MakepadFileProvider. The manifest declares that provider, and an APK built with a cargo-makepad that lacks the class crashes at launch. CI and release builds install cargo-makepad from the makepad revision inCargo.lock.Changes
armv7-linux-androideabi, so its build fails unlessbindgen-cliis installed.bindgenandclang-sysalso drop out of the tree.ccto 1.10.0 andshlexto 2.0.1.Build Android armv7 (Linux Host)PR job.--abi=armv7has to come before bothinstall-toolchainandbuild, or cargo-makepad only installs and builds aarch64.determine_matriceslike the desktop jobs.build_android_armv7input next tobuild_android_aarch64.MAKEPAD_ANDROID_ABI, because makepad-packaging-action picks the ABI from that alone. It ignores--target, so an armv7 leg without it would rebuild aarch64 and overwrite that asset.Robrix-<version>-android-armv7.apk.versionCode, computed once indetermine_matrices. Before,version_code = "auto"was computed per job, so two jobs straddling an hour would get different codes, and switching between the APKs would then hit a version-downgrade error.current_bytes * 100overflows a 32-bitusizeonce an upload passes about 43 MB, which made the shown percentage fall back toward 0% (and panic in debug builds). All three call sites now use one widening helper, with a test.MakepadFileProviderwith authority{package_id}.robius.share, serving therobius-sharedirectory of the app's cache.content://URI.minSdkis 26, and Robrix doesn't override it;dev, whose cargo-makepad lacks the provider class.How this was checked
Before writing any code, a multi-agent audit (with independent verification of each finding) looked at:
Everything it confirmed is fixed in this PR or in the two above. The Android 8/9 sharing change got its own multi-agent review, and every finding it confirmed is fixed.
Build Android armv7 (Linux Host)job builds and links the armeabi-v7a APK with the real NDK. It installs cargo-makepad from the pinned makepad revision, so it also compilesMakepadFileProviderinto the APK, next to the manifest that declares it.upload_percenttest passes, and the old code fails it.actionlintpasses on both workflows.determine_matricesscript under node for a tag push and for several dispatch combinations.Cargo.toml. Its output parses as an integerversion_code, which cargo-makepad accepts.cargo metadata --lockedresolves the moved pins, and CI'sresolve-makepad-rev.shpicks a makepad revision that containsMakepadFileProvider.MakepadFileProviderwere tested together with Robolectric on the Android 8.0 and 8.1 runtimes (17 tests; see robius#30). That also covers reading the shared file back through the provider, and the chooser's read grant.Not verified: running the app on an armv7 device, and sharing on a real Android 8 or 9 device.
The same makepad fixes, minus
DrawVarswhich upstream already has, are also ported onto upstream makepaddevinkevinaboos/makepad:android_armv7_fixes, for an upstream PR. That port, which now includesMakepadFileProvider, doesn't change what Robrix depends on.Known and not changed here
glEsVersion 0x00020000, but makepad's Android EGL code needs ES3. Some cheap 32-bit devices (Mali-400/450 class GPUs) only have ES2, so the app would install there and then fail to render.builds.ymlstill installsbindgen-clifor the iOS build. aws-lc-sys 0.46 no longer needs it, so that step could go in a follow-up.get_db_sizemultiplies inusizeand could overflow past 4 GiB on 32-bit, but Robrix never calls it.🤖 Generated with Claude Code
https://claude.ai/code/session_01Va5dxPCRyW8YN5b1Yt1Awy