This document outlines the complete process for generating Android UniFFI bindings and preparing them for Maven Central publication.
- Rust with Android targets: Install Android cross-compilation targets
- Android NDK: Located at
/opt/android-ndk(or setANDROID_NDK_ROOT) - Android SDK: Located at
~/Android/Sdk(or setANDROID_SDK_ROOT) - GPG Key: For signing Maven Central artifacts
# This script handles everything: cross-compilation + bindings generation
./scripts/uniffi_bindgen_generate_kotlin_android.shThis script:
- Installs required Rust targets (
x86_64-linux-android,aarch64-linux-android,armv7-linux-androideabi) - Cross-compiles for 3 Android architectures using Android NDK
- Generates Kotlin bindings using
uniffi-android.tomlconfig - Places native libraries in proper
jniLibs/directories - Creates complete Android Gradle project structure
cd bindings/kotlin/orange-sdk-android
ANDROID_SDK_ROOT="~/Android/Sdk" ./gradlew buildThis generates:
lib-release.aar- Production Android librarylib-debug.aar- Debug version- Contains Kotlin bindings + native libraries for all architectures
# Basic usage (will prompt for GPG passphrase if needed)
./scripts/create_android_maven_package.sh YOUR_GPG_KEY_ID
# With passphrase for automated signing
./scripts/create_android_maven_package.sh YOUR_GPG_KEY_ID "your_passphrase"
# For CI/CD - use environment variables (more secure)
export GPG_KEY_ID="YOUR_GPG_KEY_ID"
export GPG_PASSPHRASE="your_passphrase"
./scripts/create_android_maven_package.sh
# Find your GPG key ID
gpg --list-secret-keys --keyid-format=longThis consolidated script:
- Uses Gradle to generate the POM file (following ldk-node pattern)
- Creates properly named Maven Central artifacts (
orange-sdk-android-0.1.0.aar, etc.) - Generates sources JAR and javadoc JAR
- Generates all required checksums (MD5, SHA1, SHA256, SHA512)
- Signs everything with your GPG key (supports automated signing with passphrase)
- Creates final ZIP ready for Maven Central upload
bindings/kotlin/orange-sdk-android/
├── lib/
│ ├── build.gradle.kts # Android library build config
│ ├── src/main/
│ │ ├── kotlin/ # Generated Kotlin bindings
│ │ │ └── org/lightningdevkit/orangesdk/
│ │ │ └── orange_sdk.kt # Main bindings file
│ │ └── jniLibs/ # Native libraries by architecture
│ │ ├── arm64-v8a/
│ │ ├── armeabi-v7a/
│ │ └── x86_64/
│ └── build/outputs/aar/ # Final AAR artifacts
│ ├── lib-release.aar # Main library (37MB)
│ └── lib-debug.aar # Debug version
├── gradle.properties # Build configuration
├── settings.gradle.kts
└── build.gradle.kts # Root project config
[bindings.kotlin]
android = true
android_cleaner = true
package_name = "org.lightningdevkit.orangesdk"
cdylib_name = "orange_sdk"Following the ldk-node pattern, the POM file is generated by Gradle with proper metadata:
- Group ID:
org.lightningdevkit - Artifact ID:
orange-sdk-android - Version: Defined in
gradle.properties - Dependencies: JNA, Kotlin coroutines, etc.
- Licensing: Apache 2.0 + MIT
- SCM info: GitHub repository links
- Package:
org.lightningdevkit.orangesdk - Min SDK: 21 (Android 5.0)
- Target SDK: 34
- Native Architectures: arm64-v8a, armeabi-v7a, x86_64
The generated artifacts include all Maven Central requirements:
- Main AAR: Contains compiled Kotlin + native libraries
- Checksums: MD5, SHA1, SHA256, SHA512 for all artifacts
- GPG Signatures:
.ascfiles for every artifact - Source: Kotlin source code included in AAR
- Metadata: Android Gradle project provides POM generation
Set these before building:
export ANDROID_NDK_ROOT="/opt/android-ndk"
export ANDROID_SDK_ROOT="~/Android/Sdk" - SDK not found: Set
ANDROID_SDK_ROOTenvironment variable - NDK not found: Set
ANDROID_NDK_ROOTenvironment variable - Cross-compilation fails: Verify Android NDK toolchain is accessible
- Missing architectures: Check that all Rust targets are installed
- Large file sizes: Native libraries are ~25-37MB each (normal for Rust+LDK)
- Strip symbols: Build uses
release-smallerprofile for size optimization
- GPG key not found: Run
gpg --list-secret-keysto verify keys - Wrong key: Pass key ID to signing script:
./sign-maven-artifacts.sh YOUR_KEY_ID
For CI/CD, combine all steps:
#!/bin/bash
set -e
# Set GPG credentials (required - use CI environment variables)
export GPG_KEY_ID="${GPG_SIGNING_KEY_ID}" # Required: Your GPG key ID
export GPG_PASSPHRASE="${GPG_SIGNING_PASSPHRASE}" # Optional: For automated signing
# 1. Generate Android bindings and native libraries
./scripts/uniffi_bindgen_generate_kotlin_android.sh
# 2. Build Android library (AAR)
cd bindings/kotlin/orange-sdk-android
ANDROID_SDK_ROOT="$ANDROID_SDK_ROOT" ./gradlew build
cd ../../../
# 3. Create complete Maven Central package (with automated GPG signing)
./scripts/create_android_maven_package.sh
echo "✅ Android Maven Central package ready for upload!"Interactive (development):
# Will prompt for passphrase
./scripts/create_android_maven_package.sh YOUR_GPG_KEY_IDEnvironment variables (CI/CD):
export GPG_KEY_ID="YOUR_GPG_KEY_ID"
export GPG_PASSPHRASE="your_passphrase"
./scripts/create_android_maven_package.shGPG Agent (most secure):
# Configure GPG agent to cache passphrase
gpg-connect-agent reloadagent /bye
./scripts/create_android_maven_package.sh YOUR_GPG_KEY_ID- Upload to Maven Central: Use the generated ZIP file
- Version Management: Update version in
gradle.properties - Release Notes: Document API changes and features
- Testing: Verify AAR works in Android projects
The create_android_maven_package.sh script generates:
- Maven Central ZIP:
orange-sdk-android-0.1.0-maven-central.zip(~36MB) - Location:
maven-central-package/ - Contents: 40 total files (4 main artifacts × 10 files each)
orange-sdk-android-0.1.0.aar- Main Android libraryorange-sdk-android-0.1.0-sources.jar- Source codeorange-sdk-android-0.1.0-javadoc.jar- Documentationorange-sdk-android-0.1.0.pom- Maven metadata- All checksums (
.md5,.sha1,.sha256,.sha512) for each file - All GPG signatures (
.asc) for each file
uniffi_bindgen_generate_kotlin_android.sh- Generate bindings + native librariescreate_android_maven_package.sh- Create complete Maven Central packagegenerate_checksum_files.sh- Generate checksums (used internally)
The Android bindings are now ready for Maven Central publication! 🚀