Native Android client for Beam, the peer-to-peer file sharing app built on atman.
Counterpart to beam-ios. The desktop versions (macOS / Windows / Linux) live in the beam repo and are built with Tauri.
You'll need Android Studio (which bundles JDK 17) with the NDK installed side-by-side through its SDK Manager, plus a Rust toolchain to cross-compile atman.
Set ANDROID_NDK_HOME so cargo-ndk can find it, add the three Android Rust targets, and install cargo-ndk:
export ANDROID_NDK_HOME="$HOME/Library/Android/sdk/ndk/<version>"
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android
cargo install cargo-ndkbuild_atman.sh cross-compiles atman per ABI, dropping libatman.so into app/src/main/jniLibs/<abi>/ and the UniFFI-generated Kotlin into app/src/main/java/uniffi/atman/atman.kt:
git submodule update --init --recursive
./build_atman.sh # debug, all three ABIs
./build_atman.sh --release # release, all three ABIsAtmanClientFactory.kt, hand-written next to the generated atman.kt, works around UniFFI 0.28's Kotlin codegen skipping async constructors. Delete it once atman moves to UniFFI ≥ 0.29.
Open the project in Android Studio and run on a connected device, or install from the CLI:
./gradlew installDebugNOTE: All of the following steps are automated in .github/workflows/release.yml.
Create ~/.gradle/gradle.properties with your keystore credentials:
BEAM_KEYSTORE_PATH=<base_dir>/beam-release.jks
BEAM_KEYSTORE_PASSWORD=<the keystore password you set>
BEAM_KEY_ALIAS=beam
BEAM_KEY_PASSWORD=<same as keystore password (you said "same" earlier)>Build atman in release mode:
./build_atman.sh --release # release, all three ABIsThen, build the AAB:
./gradlew bundleRelease # → app/build/outputs/bundle/release/app-release.aabYou'll see the signed bundle at app/build/outputs/bundle/release/app-release.aab. That's what you upload to Play Console.
Verify it's signed:
jarsigner -verify -verbose -certs app/build/outputs/bundle/release/app-release.aabShould say jar verified and show your CN cert.