From af303d83c855d4dbfcfc86c954c27d070977ed86 Mon Sep 17 00:00:00 2001 From: Jon Vanvik Date: Sun, 31 May 2026 17:48:45 +0200 Subject: [PATCH] Make the release (R8) build pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Enabling R8 in the previous commit surfaced two build issues; fixed here so assembleDebug AND assembleRelease both succeed (verified on this machine: Android Studio JBR 21 + SDK android-36). - proguard-rules.pro: add `-dontwarn com.google.errorprone.annotations.**`. Tink (pulled in by androidx.security-crypto / EncryptedSharedPreferences) references compile-only Error Prone annotations that aren't on the runtime classpath, which R8 treated as fatal "missing class" errors. - ApiClient.await(): @OptIn(ExperimentalCoroutinesApi::class) for the resume(value){ onCancellation } overload (experimental in coroutines 1.8.1). Release APK is R8-shrunk (~1.8 MB vs ~18 MB debug). It is unsigned — wire a signing config / keystore (kept out of VCS) before distributing. Co-Authored-By: Claude Opus 4.8 (1M context) --- app/proguard-rules.pro | 5 +++++ app/src/main/java/no/svorka/mcms/core/ApiClient.kt | 2 ++ 2 files changed, 7 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 5202b13..0ebe13d 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -33,3 +33,8 @@ -dontwarn org.conscrypt.** -dontwarn org.bouncycastle.** -dontwarn org.openjsse.** + +# ─── Tink / EncryptedSharedPreferences (androidx.security-crypto) ───────────── +# Tink references compile-only Error Prone annotations that aren't on the runtime +# classpath; they're not needed at runtime, so silence the missing-class errors. +-dontwarn com.google.errorprone.annotations.** diff --git a/app/src/main/java/no/svorka/mcms/core/ApiClient.kt b/app/src/main/java/no/svorka/mcms/core/ApiClient.kt index f44274b..8c5946c 100644 --- a/app/src/main/java/no/svorka/mcms/core/ApiClient.kt +++ b/app/src/main/java/no/svorka/mcms/core/ApiClient.kt @@ -1,6 +1,7 @@ package no.svorka.mcms.core import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import kotlinx.serialization.json.JsonElement @@ -24,6 +25,7 @@ import kotlin.coroutines.resumeWithException private fun Response.closeQuietly() { runCatching { close() } } /** Suspend bridge for an OkHttp call, with coroutine cancellation. */ +@OptIn(ExperimentalCoroutinesApi::class) // resume(value) { onCancellation } overload suspend fun Call.await(): Response = suspendCancellableCoroutine { cont -> enqueue(object : Callback { override fun onResponse(call: Call, response: Response) {