Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.269.0"
".": "0.269.1"
}
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Changelog

## 0.269.1 (2025-07-31)

Full Changelog: [v0.269.0...v0.269.1](https://github.com/Increase/increase-java/compare/v0.269.0...v0.269.1)

### Bug Fixes

* **client:** r8 support ([554f5f0](https://github.com/Increase/increase-java/commit/554f5f062658e3cf3a090f6c57d72bc512d70d35))

## 0.269.0 (2025-07-29)

Full Changelog: [v0.268.0...v0.269.0](https://github.com/Increase/increase-java/compare/v0.268.0...v0.269.0)
Expand Down
10 changes: 5 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

<!-- x-release-please-start-version -->

[![Maven Central](https://img.shields.io/maven-central/v/com.increase.api/increase-java)](https://central.sonatype.com/artifact/com.increase.api/increase-java/0.269.0)
[![javadoc](https://javadoc.io/badge2/com.increase.api/increase-java/0.269.0/javadoc.svg)](https://javadoc.io/doc/com.increase.api/increase-java/0.269.0)
[![Maven Central](https://img.shields.io/maven-central/v/com.increase.api/increase-java)](https://central.sonatype.com/artifact/com.increase.api/increase-java/0.269.1)
[![javadoc](https://javadoc.io/badge2/com.increase.api/increase-java/0.269.1/javadoc.svg)](https://javadoc.io/doc/com.increase.api/increase-java/0.269.1)

<!-- x-release-please-end -->

Expand All @@ -13,7 +13,7 @@ The Increase Java SDK is similar to the Increase Kotlin SDK but with minor diffe

<!-- x-release-please-start-version -->

The REST API documentation can be found on [increase.com](https://increase.com/documentation). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.increase.api/increase-java/0.269.0).
The REST API documentation can be found on [increase.com](https://increase.com/documentation). Javadocs are available on [javadoc.io](https://javadoc.io/doc/com.increase.api/increase-java/0.269.1).

<!-- x-release-please-end -->

Expand All @@ -24,7 +24,7 @@ The REST API documentation can be found on [increase.com](https://increase.com/d
### Gradle

```kotlin
implementation("com.increase.api:increase-java:0.269.0")
implementation("com.increase.api:increase-java:0.269.1")
```

### Maven
Expand All @@ -33,7 +33,7 @@ implementation("com.increase.api:increase-java:0.269.0")
<dependency>
<groupId>com.increase.api</groupId>
<artifactId>increase-java</artifactId>
<version>0.269.0</version>
<version>0.269.1</version>
</dependency>
```

Expand Down
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ repositories {

allprojects {
group = "com.increase.api"
version = "0.269.0" // x-release-please-version
version = "0.269.1" // x-release-please-version
}

subprojects {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Jackson uses reflection and depends heavily on runtime attributes.
-keepattributes
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,*Annotation*

# Jackson uses Kotlin reflection utilities, which themselves use reflection to access things.
-keep class kotlin.reflect.** { *; }
Expand All @@ -17,13 +17,13 @@
*;
}

# Jackson uses reflection to access the default constructors of serializers and deserializers.
-keepclassmembers class * extends com.increase.api.core.BaseSerializer {
<init>();
}
-keepclassmembers class * extends com.increase.api.core.BaseDeserializer {
<init>();
}
# Jackson uses reified type information to serialize and deserialize our classes (via `TypeReference`).
-keep class com.fasterxml.jackson.core.type.TypeReference { *; }
-keep class * extends com.fasterxml.jackson.core.type.TypeReference { *; }

# Jackson uses reflection to access our class serializers and deserializers.
-keep @com.fasterxml.jackson.databind.annotation.JsonSerialize class com.increase.api.** { *; }
-keep @com.fasterxml.jackson.databind.annotation.JsonDeserialize class com.increase.api.** { *; }

# Jackson uses reflection to serialize and deserialize our classes based on their constructors and annotated members.
-keepclassmembers class com.increase.api.** {
Expand Down
40 changes: 35 additions & 5 deletions increase-java-proguard-test/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,13 @@ plugins {
}

buildscript {
repositories {
google()
}

dependencies {
classpath("com.guardsquare:proguard-gradle:7.4.2")
classpath("com.android.tools:r8:8.3.37")
}
}

Expand All @@ -15,7 +20,6 @@ dependencies {
testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3")
testImplementation("org.assertj:assertj-core:3.25.3")
testImplementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.13.4")
testImplementation("org.junit.platform:junit-platform-console:1.10.1")
}

tasks.shadowJar {
Expand Down Expand Up @@ -58,17 +62,43 @@ val testProGuard by tasks.registering(JavaExec::class) {
dependsOn(proguardJar)
notCompatibleWithConfigurationCache("ProGuard")

mainClass.set("org.junit.platform.console.ConsoleLauncher")
mainClass.set("com.increase.api.proguard.ProGuardCompatibilityTest")
classpath = files(proguardJarPath)
}

val r8JarPath = "${layout.buildDirectory.get()}/libs/${project.name}-${project.version}-r8.jar"
val r8Jar by tasks.registering(JavaExec::class) {
group = "verification"
dependsOn(tasks.shadowJar)
notCompatibleWithConfigurationCache("R8")

mainClass.set("com.android.tools.r8.R8")
classpath = buildscript.configurations["classpath"]

args = listOf(
"--classpath", proguardJarPath,
"--scan-classpath",
"--details", "verbose",
"--release",
"--classfile",
"--output", r8JarPath,
"--lib", System.getProperty("java.home"),
"--pg-conf", "./test.pro",
"--pg-conf", "../increase-java-core/src/main/resources/META-INF/proguard/increase-java-core.pro",
"--pg-map-output", "${layout.buildDirectory.get()}/r8-mapping.txt",
tasks.shadowJar.get().archiveFile.get().asFile.absolutePath,
)
}

val testR8 by tasks.registering(JavaExec::class) {
group = "verification"
dependsOn(r8Jar)
notCompatibleWithConfigurationCache("R8")

mainClass.set("com.increase.api.proguard.ProGuardCompatibilityTest")
classpath = files(r8JarPath)
}

tasks.test {
dependsOn(testProGuard)
dependsOn(testR8)
// We defer to the tests run via the ProGuard JAR.
enabled = false
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,31 @@ import com.increase.api.core.jsonMapper
import com.increase.api.models.accounts.Account
import java.time.LocalDate
import java.time.OffsetDateTime
import kotlin.reflect.full.memberFunctions
import kotlin.reflect.jvm.javaMethod
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.BeforeAll
import org.junit.jupiter.api.Test

internal class ProGuardCompatibilityTest {

companion object {

@BeforeAll
@JvmStatic
fun setUp() {
fun main(args: Array<String>) {
// To debug that we're using the right JAR.
val jarPath = this::class.java.getProtectionDomain().codeSource.location
println("JAR being used: $jarPath")

// We have to manually run the test methods instead of using the JUnit runner because it
// seems impossible to get working with R8.
val test = ProGuardCompatibilityTest()
test::class
.memberFunctions
.asSequence()
.filter { function ->
function.javaMethod?.isAnnotationPresent(Test::class.java) == true
}
.forEach { it.call(test) }
}
}

Expand Down
5 changes: 4 additions & 1 deletion increase-java-proguard-test/test.pro
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@
-keep class com.increase.api.proguard.** { *; }

# For the testing framework.
-keep class org.junit.** { *; }
-keep class org.junit.** { *; }

# Many warnings don't apply for our testing purposes.
-dontwarn
Loading