From 75af7f1f1e1fa2484c4eacc997a7eda476d7b4e2 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 26 Aug 2026 17:05:05 +0200 Subject: [PATCH 1/2] fix: ship Android R8 consumer keep rules Package targeted UniFFI 0.28 / JNA consumer keep rules into the ldk-node-android AAR as proguard.txt, and fail bundleReleaseAar when those rules are missing or empty. --- CHANGELOG.md | 4 ++ .../ldk-node-android/lib/build.gradle.kts | 46 ++++++++++++++++++- .../ldk-node-android/lib/consumer-rules.pro | 28 +++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 bindings/kotlin/ldk-node-android/lib/consumer-rules.pro diff --git a/CHANGELOG.md b/CHANGELOG.md index 774f3ab644..03c0bab8fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# Unreleased + +- The Android AAR now ships targeted R8 consumer keep rules for the UniFFI/JNA FFI surface. + # 0.7.0-rc.63 (Synonym Fork) ## Bug Fixes diff --git a/bindings/kotlin/ldk-node-android/lib/build.gradle.kts b/bindings/kotlin/ldk-node-android/lib/build.gradle.kts index 8cff608b3d..a005569f42 100644 --- a/bindings/kotlin/ldk-node-android/lib/build.gradle.kts +++ b/bindings/kotlin/ldk-node-android/lib/build.gradle.kts @@ -1,5 +1,6 @@ import java.io.ByteArrayOutputStream import java.io.File +import java.util.zip.ZipFile plugins { id("com.android.library") @@ -158,8 +159,51 @@ val validateReleaseNativeLibraries by tasks.registering { } } +val validateConsumerKeepRules by tasks.registering { + group = "verification" + description = "Validates Android consumer keep rules exist for R8." + + val consumerRules = layout.projectDirectory.file("consumer-rules.pro") + inputs.file(consumerRules) + + doLast { + val file = consumerRules.asFile + if (!file.isFile || file.readText().isBlank()) { + throw GradleException("Android consumer keep rules missing at '${file.path}'") + } + } +} + tasks.matching { it.name == "bundleReleaseAar" || it.name.startsWith("publish") }.configureEach { - dependsOn(validateReleaseNativeLibraries) + dependsOn(validateReleaseNativeLibraries, validateConsumerKeepRules) +} + +tasks.matching { it.name == "bundleReleaseAar" }.configureEach { + doLast { + val aars = layout.buildDirectory.dir("outputs/aar").get().asFile + .listFiles() + ?.filter { it.isFile && it.name.endsWith(".aar") && it.name.contains("release") } + .orEmpty() + + if (aars.isEmpty()) { + throw GradleException("Release AAR missing after bundleReleaseAar") + } + + aars.forEach { aar -> + ZipFile(aar).use { zip -> + val entry = zip.getEntry("proguard.txt") + ?: throw GradleException( + "Release AAR is missing consumer keep rules (proguard.txt): '${aar.path}'" + ) + val text = zip.getInputStream(entry).bufferedReader().readText() + if (text.isBlank()) { + throw GradleException( + "Release AAR consumer keep rules are empty: '${aar.path}'" + ) + } + } + } + } } afterEvaluate { diff --git a/bindings/kotlin/ldk-node-android/lib/consumer-rules.pro b/bindings/kotlin/ldk-node-android/lib/consumer-rules.pro new file mode 100644 index 0000000000..a54d6b4c0e --- /dev/null +++ b/bindings/kotlin/ldk-node-android/lib/consumer-rules.pro @@ -0,0 +1,28 @@ +# Consumer keep rules for ldk-node Android bindings. +# Packaged into the AAR and applied automatically when a consuming app enables R8. + +# JNA reads @Structure.FieldOrder and public fields by name, and constructs +# Structure, Structure$ByValue, and Structure$ByReference types reflectively. +-keepclassmembers class org.lightningdevkit.ldknode.** extends com.sun.jna.Structure { + ; + (...); +} + +# JNA looks up Callback methods by name when building native function pointers. +-keepclassmembers class org.lightningdevkit.ldknode.** implements com.sun.jna.Callback { + ; +} + +# UniFFI 0.28 loads UniffiLib via Native.load; JNA looks up interface methods by name. +-keep,includedescriptorclasses interface org.lightningdevkit.ldknode.UniffiLib { + ; +} + +# @Structure.FieldOrder is read at runtime. +-keepattributes RuntimeVisibleAnnotations + +# JNA's AAR references desktop AWT types that are absent on Android. +-dontwarn java.awt.Component +-dontwarn java.awt.GraphicsEnvironment +-dontwarn java.awt.HeadlessException +-dontwarn java.awt.Window From d211d309291fc547ea33d0826ecf1e8d8bfbf9a0 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Wed, 26 Aug 2026 18:51:55 +0200 Subject: [PATCH 2/2] chore: bump to 0.7.0-rc.64 --- CHANGELOG.md | 6 ++++++ Cargo.toml | 2 +- Package.swift | 2 +- bindings/kotlin/ldk-node-android/gradle.properties | 2 +- bindings/kotlin/ldk-node-jvm/gradle.properties | 2 +- bindings/python/pyproject.toml | 2 +- 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03c0bab8fe..6371c427da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ - The Android AAR now ships targeted R8 consumer keep rules for the UniFFI/JNA FFI surface. +# 0.7.0-rc.64 (Synonym Fork) + +## Bug Fixes + +- The Android AAR now ships targeted R8 consumer keep rules for the UniFFI/JNA FFI surface. + # 0.7.0-rc.63 (Synonym Fork) ## Bug Fixes diff --git a/Cargo.toml b/Cargo.toml index b8da51d740..703aecd760 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,7 @@ exclude = ["bindings/uniffi-bindgen"] [package] name = "ldk-node" -version = "0.7.0-rc.63" +version = "0.7.0-rc.64" authors = ["Elias Rohrer "] homepage = "https://lightningdevkit.org/" license = "MIT OR Apache-2.0" diff --git a/Package.swift b/Package.swift index 27f1a82b4e..a95a0d9eae 100644 --- a/Package.swift +++ b/Package.swift @@ -3,7 +3,7 @@ import PackageDescription -let tag = "v0.7.0-rc.63" +let tag = "v0.7.0-rc.64" let checksum = "8890d1b91f2b3e0a33ffd2854e1a4e9721e99706e8378177d30fbc435cd2db49" let url = "https://github.com/synonymdev/ldk-node/releases/download/\(tag)/LDKNodeFFI.xcframework.zip" diff --git a/bindings/kotlin/ldk-node-android/gradle.properties b/bindings/kotlin/ldk-node-android/gradle.properties index ad73ef0cfd..97ae0fb7b2 100644 --- a/bindings/kotlin/ldk-node-android/gradle.properties +++ b/bindings/kotlin/ldk-node-android/gradle.properties @@ -3,4 +3,4 @@ android.useAndroidX=true android.enableJetifier=true kotlin.code.style=official group=com.synonym -version=0.7.0-rc.63 +version=0.7.0-rc.64 diff --git a/bindings/kotlin/ldk-node-jvm/gradle.properties b/bindings/kotlin/ldk-node-jvm/gradle.properties index 7dc36cbade..9ceb23cd67 100644 --- a/bindings/kotlin/ldk-node-jvm/gradle.properties +++ b/bindings/kotlin/ldk-node-jvm/gradle.properties @@ -1,4 +1,4 @@ org.gradle.jvmargs=-Xmx1536m kotlin.code.style=official group=com.synonym -version=0.7.0-rc.63 +version=0.7.0-rc.64 diff --git a/bindings/python/pyproject.toml b/bindings/python/pyproject.toml index ea3b28162e..7eddf4fe5e 100644 --- a/bindings/python/pyproject.toml +++ b/bindings/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ldk_node" -version = "0.7.0-rc.63" +version = "0.7.0-rc.64" authors = [ { name="Elias Rohrer", email="dev@tnull.de" }, ]