diff --git a/CHANGELOG.md b/CHANGELOG.md index 774f3ab64..6371c427d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +# Unreleased + +- 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 b8da51d74..703aecd76 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 27f1a82b4..a95a0d9ea 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 ad73ef0cf..97ae0fb7b 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-android/lib/build.gradle.kts b/bindings/kotlin/ldk-node-android/lib/build.gradle.kts index 8cff608b3..a005569f4 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 000000000..a54d6b4c0 --- /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 diff --git a/bindings/kotlin/ldk-node-jvm/gradle.properties b/bindings/kotlin/ldk-node-jvm/gradle.properties index 7dc36cbad..9ceb23cd6 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 ea3b28162..7eddf4fe5 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" }, ]