From 02d7f6d8124752af3bf3fd3aa6c1072e34f54f64 Mon Sep 17 00:00:00 2001 From: ignaciosantise <25931366+ignaciosantise@users.noreply.github.com> Date: Tue, 3 Feb 2026 11:55:56 -0300 Subject: [PATCH 1/3] Save work before archive --- crates/kotlin-ffi/android/build.gradle | 2 +- generate_kotlin_locally.sh | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/crates/kotlin-ffi/android/build.gradle b/crates/kotlin-ffi/android/build.gradle index 592e72af..5d4560c4 100644 --- a/crates/kotlin-ffi/android/build.gradle +++ b/crates/kotlin-ffi/android/build.gradle @@ -73,7 +73,7 @@ subprojects { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) + languageVersion.set(JavaLanguageVersion.of(17)) } } diff --git a/generate_kotlin_locally.sh b/generate_kotlin_locally.sh index f7b82046..234282ab 100755 --- a/generate_kotlin_locally.sh +++ b/generate_kotlin_locally.sh @@ -171,19 +171,20 @@ install_variant_sources() { # Process yttrium.kt: # 1. Change package: uniffi.yttrium -> uniffi.yttrium_utils - # 2. Change imports: uniffi.uniffi_yttrium -> uniffi.uniffi_yttrium_utils - # 3. Change type references: uniffi.yttrium.Type -> uniffi.yttrium_utils.Type + # 2. Change type references: uniffi.yttrium.X -> uniffi.yttrium_utils.X + # 3. Change imports: uniffi.uniffi_yttrium -> uniffi.uniffi_yttrium_utils # 4. Change library name: "uniffi_yttrium" -> "uniffi_yttrium_utils" if command -v perl >/dev/null 2>&1; then perl -0pi -e 's/\bpackage\s+uniffi\.yttrium\b/package uniffi.yttrium_utils/g' "$kotlin_base/yttrium.kt" + perl -0pi -e 's/\buniffi\.yttrium(?!_utils)\b/uniffi.yttrium_utils/g' "$kotlin_base/yttrium.kt" perl -0pi -e 's/\buniffi\.uniffi_yttrium(?!_utils)\b/uniffi.uniffi_yttrium_utils/g' "$kotlin_base/yttrium.kt" - perl -0pi -e 's/\buniffi\.yttrium\.(\w)/uniffi.yttrium_utils.$1/g' "$kotlin_base/yttrium.kt" perl -0pi -e 's/return "uniffi_yttrium"/return "uniffi_yttrium_utils"/g' "$kotlin_base/yttrium.kt" else sed -i '' 's/^package uniffi\.yttrium$/package uniffi.yttrium_utils/' "$kotlin_base/yttrium.kt" || true + sed -i '' 's/uniffi\.yttrium\([^_]\)/uniffi.yttrium_utils\1/g' "$kotlin_base/yttrium.kt" || true + sed -i '' 's/uniffi\.yttrium$/uniffi.yttrium_utils/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/uniffi\.uniffi_yttrium\([^_]\)/uniffi.uniffi_yttrium_utils\1/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/uniffi\.uniffi_yttrium$/uniffi.uniffi_yttrium_utils/g' "$kotlin_base/yttrium.kt" || true - sed -i '' 's/uniffi\.yttrium\.\([A-Za-z]\)/uniffi.yttrium_utils.\1/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/return "uniffi_yttrium"/return "uniffi_yttrium_utils"/g' "$kotlin_base/yttrium.kt" || true fi fi @@ -208,19 +209,20 @@ install_variant_sources() { # Process yttrium.kt: # 1. Change package: uniffi.yttrium -> uniffi.yttrium_wcpay - # 2. Change imports: uniffi.uniffi_yttrium -> uniffi.uniffi_yttrium_wcpay - # 3. Change type references: uniffi.yttrium.Type -> uniffi.yttrium_wcpay.Type + # 2. Change type references: uniffi.yttrium.X -> uniffi.yttrium_wcpay.X + # 3. Change imports: uniffi.uniffi_yttrium -> uniffi.uniffi_yttrium_wcpay # 4. Change library name: "uniffi_yttrium" -> "uniffi_yttrium_wcpay" if command -v perl >/dev/null 2>&1; then perl -0pi -e 's/\bpackage\s+uniffi\.yttrium\b/package uniffi.yttrium_wcpay/g' "$kotlin_base/yttrium.kt" + perl -0pi -e 's/\buniffi\.yttrium(?!_wcpay)\b/uniffi.yttrium_wcpay/g' "$kotlin_base/yttrium.kt" perl -0pi -e 's/\buniffi\.uniffi_yttrium(?!_wcpay)\b/uniffi.uniffi_yttrium_wcpay/g' "$kotlin_base/yttrium.kt" - perl -0pi -e 's/\buniffi\.yttrium\.(\w)/uniffi.yttrium_wcpay.$1/g' "$kotlin_base/yttrium.kt" perl -0pi -e 's/return "uniffi_yttrium"/return "uniffi_yttrium_wcpay"/g' "$kotlin_base/yttrium.kt" else sed -i '' 's/^package uniffi\.yttrium$/package uniffi.yttrium_wcpay/' "$kotlin_base/yttrium.kt" || true + sed -i '' 's/uniffi\.yttrium\([^_]\)/uniffi.yttrium_wcpay\1/g' "$kotlin_base/yttrium.kt" || true + sed -i '' 's/uniffi\.yttrium$/uniffi.yttrium_wcpay/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/uniffi\.uniffi_yttrium\([^_]\)/uniffi.uniffi_yttrium_wcpay\1/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/uniffi\.uniffi_yttrium$/uniffi.uniffi_yttrium_wcpay/g' "$kotlin_base/yttrium.kt" || true - sed -i '' 's/uniffi\.yttrium\.\([A-Za-z]\)/uniffi.yttrium_wcpay.\1/g' "$kotlin_base/yttrium.kt" || true sed -i '' 's/return "uniffi_yttrium"/return "uniffi_yttrium_wcpay"/g' "$kotlin_base/yttrium.kt" || true fi fi From 4fdf8c7d700a8543e49d8efbc084b86ca889ece5 Mon Sep 17 00:00:00 2001 From: ignaciosantise <25931366+ignaciosantise@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:31:31 -0300 Subject: [PATCH 2/3] docs: add local development guide and improve Android build setup Add comprehensive documentation for local testing workflows on Android and iOS, including prerequisites table and step-by-step instructions for Maven Local and CocoaPods setups. Improve generate_kotlin_locally.sh with robust prerequisite validation and better Java version detection to handle various JDK distributions. Co-Authored-By: Claude Haiku 4.5 --- README.md | 57 ++++++++++++++++++++++++++++++++ generate_kotlin_locally.sh | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+) diff --git a/README.md b/README.md index fcf85f83..db50ce90 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,63 @@ cargo install cargo-ndk --locked You will also need to install Android Studio and the "NDK (Side by side)" SDK Tools. +## Local Development + +This section covers how to build and test yttrium locally on both Android and iOS platforms. + +### Android/Kotlin Prerequisites + +| Prerequisite | Error when missing | Solution | +| ------------------ | ---------------------------------------- | -------------------------------------------------------------------------------------- | +| Android NDK | Script shows helpful message | Install via Android Studio SDK Manager | +| `ANDROID_NDK_HOME` | "ANDROID_NDK_HOME is not set" | `export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk/` | +| `cargo-ndk` | "no such command: ndk" | `cargo install cargo-ndk` | +| Rust targets | "target may not be installed" | `rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android` | +| Java 17 | "Android Gradle plugin requires Java 17" | Use Zulu JDK, Homebrew, or Android Studio's bundled JDK | + +### Android Local Testing Workflow + +1. Build and publish to Maven Local: + ```bash + ./generate_kotlin_locally.sh + ``` +2. In the consuming app's `build.gradle`, add `mavenLocal()` to repositories: + ```gradle + repositories { + mavenLocal() + // ... other repos + } + ``` +3. Change the dependency to use the local version: + ```gradle + // "unspecified" is the default version for Maven Local publishes + implementation("com.github.reown-com:yttrium-utils:unspecified") + ``` + +### iOS/Swift Local Testing Workflow + +**Option A: Swift Package Manager** + +1. Build XCFrameworks: + ```bash + ./scripts/set-up-local-swift-package.sh + ``` +2. In Xcode, add yttrium as a local package (File → Add Package Dependencies → Add Local) + +**Option B: CocoaPods** + +1. Modify `YttriumUtilsWrapper.podspec` to use local paths: + ```ruby + spec.source = { :path => "." } + spec.vendored_frameworks = "target/ios-utils/libyttrium-utils.xcframework" + spec.source_files = "platforms/swift/Sources/YttriumUtils/**/*.swift" + ``` +2. Update the app's Podfile: + ```ruby + pod 'YttriumUtilsWrapper', :path => '/path/to/yttrium' + ``` +3. Run `pod install` + ### Setup After installing the above dependencies, you can run `just ci` to run the checks that CI does and initialize your repo. diff --git a/generate_kotlin_locally.sh b/generate_kotlin_locally.sh index 234282ab..b04d98fe 100755 --- a/generate_kotlin_locally.sh +++ b/generate_kotlin_locally.sh @@ -14,6 +14,73 @@ fi echo "Using ANDROID_NDK_HOME: $ANDROID_NDK_HOME" +check_prerequisites() { + local has_error=0 + + # Check cargo-ndk + if ! command -v cargo-ndk &> /dev/null; then + echo "ERROR: cargo-ndk is not installed!" + echo "Please install it with:" + echo " cargo install cargo-ndk" + echo "" + has_error=1 + fi + + # Check Rust Android targets + local required_targets=("aarch64-linux-android" "armv7-linux-androideabi" "x86_64-linux-android") + local installed_targets + installed_targets=$(rustup target list --installed 2>/dev/null || echo "") + local missing_targets=() + for target in "${required_targets[@]}"; do + if ! echo "$installed_targets" | grep -q "^${target}$"; then + missing_targets+=("$target") + fi + done + if [ ${#missing_targets[@]} -gt 0 ]; then + echo "ERROR: Missing Rust Android targets: ${missing_targets[*]}" + echo "Please install them with:" + echo " rustup target add ${missing_targets[*]}" + echo "" + has_error=1 + fi + + # Check Java version (need Java 17+) + if command -v java &> /dev/null; then + local java_version + # Extract major version, handling various JDK output formats + java_version=$(java -version 2>&1 | awk -F'"' '/version/ {print $2}' | cut -d. -f1) + # Fallback for non-standard outputs (e.g., "17.0.1" without quotes) + if [ -z "$java_version" ]; then + java_version=$(java -version 2>&1 | grep -oE '[0-9]+\.[0-9]+' | head -1 | cut -d. -f1) + fi + if [ -n "$java_version" ] && [ "$java_version" -lt 17 ] 2>/dev/null; then + echo "ERROR: Java 17 or higher is required (found Java $java_version)" + echo "Please install Java 17+ using one of:" + echo " - Android Studio's bundled JDK" + echo " - Homebrew: brew install openjdk@17" + echo " - Zulu JDK: https://www.azul.com/downloads/" + echo "" + has_error=1 + fi + else + echo "ERROR: Java is not installed!" + echo "Please install Java 17+ using one of:" + echo " - Android Studio's bundled JDK" + echo " - Homebrew: brew install openjdk@17" + echo " - Zulu JDK: https://www.azul.com/downloads/" + echo "" + has_error=1 + fi + + if [ $has_error -eq 1 ]; then + exit 1 + fi + + echo "All prerequisites satisfied" +} + +check_prerequisites + # Link-time optimization flag for dead code elimination (Android targets only) # Using target-specific RUSTFLAGS avoids conflicts with macOS host builds export CARGO_TARGET_AARCH64_LINUX_ANDROID_RUSTFLAGS="-C link-arg=-Wl,--gc-sections" From 06a8b92dc7f5c025eb924725c137bd6425a5e080 Mon Sep 17 00:00:00 2001 From: ignaciosantise <25931366+ignaciosantise@users.noreply.github.com> Date: Tue, 3 Feb 2026 12:54:35 -0300 Subject: [PATCH 3/3] fix: improve Java version validation in prerequisites check Add additional validation to ensure Java version is a valid positive number before comparison. Co-Authored-By: Claude Opus 4.5 --- generate_kotlin_locally.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generate_kotlin_locally.sh b/generate_kotlin_locally.sh index b04d98fe..119acd54 100755 --- a/generate_kotlin_locally.sh +++ b/generate_kotlin_locally.sh @@ -53,7 +53,7 @@ check_prerequisites() { if [ -z "$java_version" ]; then java_version=$(java -version 2>&1 | grep -oE '[0-9]+\.[0-9]+' | head -1 | cut -d. -f1) fi - if [ -n "$java_version" ] && [ "$java_version" -lt 17 ] 2>/dev/null; then + if [ -n "$java_version" ] && [ "$java_version" -ge 1 ] 2>/dev/null && [ "$java_version" -lt 17 ]; then echo "ERROR: Java 17 or higher is required (found Java $java_version)" echo "Please install Java 17+ using one of:" echo " - Android Studio's bundled JDK"