Meshtastic-Android/desktop/proguard-rules.pro

72 lines
3.4 KiB
Prolog
Raw Normal View History

# ============================================================================
# Meshtastic Desktop ProGuard rules for release minification
# ============================================================================
# Open-source project: we rely on tree-shaking (unused code removal) for size
# reduction. Obfuscation is disabled in build.gradle.kts (obfuscate.set(false)).
#
# Cross-platform library rules (Koin, kotlinx-serialization, Wire, Room,
# Ktor, Coil, Kable, Kermit, Okio, DataStore, Paging, Lifecycle, Navigation 3,
# AboutLibraries, Markdown, QRCode, CMP resources, core model) live in
# config/proguard/shared-rules.pro and are wired in by this module's
# build.gradle.kts. This file holds only desktop/JVM-specific rules.
# ============================================================================
# ---- General ----------------------------------------------------------------
# Suppress notes about duplicate resource files (common in fat JARs)
-dontnote **
# Disable ProGuard optimization passes. Tree-shaking (unused code removal) still
# runs only method-body rewrites and call-site transformations are suppressed.
#
# Why: CMP 1.11 ships consumer rules with -assumenosideeffects on
# Composer.<clinit>() and ComposerImpl.<clinit>(), plus -assumevalues on
# ComposeRuntimeFlags and ComposeStackTraceMode. These optimization directives
# let the optimizer rewrite *call sites* (class-init triggers, flag reads) even
# when the target classes are preserved by -keep rules. The result is that the
# Compose recomposer/frame-clock/animation state machines silently freeze on
# their first frame in release builds. -dontoptimize is the only directive that
# disables processing of -assumenosideeffects/-assumevalues. The desktop compose
# build sets optimize.set(true), so this applies here as well as to R8. See #5146.
-dontoptimize
# Do not parse/rewrite Kotlin metadata during shrinking/optimization.
# ProGuard's KotlinShrinker cannot handle the metadata produced by Compose
# Multiplatform 1.11.x + Kotlin 2.3.x, causing a NullPointerException.
# Since we disable obfuscation (class names remain stable), metadata references
# stay valid and do not need rewriting. The annotations themselves are preserved
# by -keepattributes *Annotation*.
#
# NOTE: -dontprocesskotlinmetadata is a ProGuard-only directive; R8 does not
# recognize it, which is why it lives in the desktop-only file.
-dontprocesskotlinmetadata
# ---- Entry point ------------------------------------------------------------
-keep class org.meshtastic.desktop.MainKt { *; }
# ---- Ktor Java engine (desktop-only; Android uses OkHttp) -------------------
chore(r8): remove redundant keep rules covered by consumer rules Removes explicit -keep/-dontwarn wildcards whose behavior is already provided by the library's own bundled consumer-rules.pro, by Room's generated static references, or by narrower annotation-targeted keeps. The merged R8 configuration shrinks by 34 lines (1981→1947 googleRelease, 1653→1619 fdroidRelease), giving R8 more tree-shaking freedom. Removed (covered by library-bundled consumer rules): - kotlin.Metadata, kotlin.reflect.**, kotlin.coroutines.Continuation, kotlinx.coroutines.** (kotlin-stdlib + kotlinx-coroutines-core) - androidx.datastore.**, androidx.paging.**, androidx.lifecycle.**, androidx.navigation3.**, androidx.sqlite.** - coil3.**, okio.**, co.touchlab.kermit.**, com.mikepenz.aboutlibraries.**, com.mikepenz.markdown.**, com.juul.kable.**, io.ktor.**, io.ktor.client.engine.java.** (HttpClientEngineFactory ServiceLoader keep retained) Room (room3) narrowed: - Dropped org.meshtastic.core.database.{dao,entity,Converters}.** and **_Impl wildcards. RoomDatabaseConstructor + MeshtasticDatabaseConstructor/MeshtasticDatabase keeps retained. Room 3.0 KMP generates static references rather than reflective lookups, so reachable DAO/entity/_Impl code survives tree-shaking. Wire protobuf narrowed: - Dropped com.squareup.wire.**, org.meshtastic.proto.**, meshtastic.** wildcards and deleted core/proto/consumer-rules.pro (20 per-class keeps). - Replaced with targeted -keepclassmembers for ADAPTER fields on Message subclasses and ProtoAdapter member preservation. Verified no Class.forName lookups into org.meshtastic.proto namespace. Meshtastic model + DI: - Dropped org.meshtastic.core.model.** wildcard and deleted core/model/consumer-rules.pro (DataPacket is @CommonParcelize'd; no reflective access to core.model). - Replaced org.meshtastic.**.di.** wildcard with a narrow @KoinViewModel class annotation keep (the @Module, @ComponentScan, @Single, @Factory keeps above already cover the rest of Koin). Compose resources refinement: - Narrowed org.meshtastic.core.resources.** to Res + Res$* members only (sufficient for the fdroid startup-crash workaround in #5146). Intentionally retained (documented workarounds / policy): - -dontoptimize, -dontobfuscate, -printconfiguration - All Koin annotation keeps + org.koin.** - kotlinx-serialization @Serializable keeps - Room RoomDatabaseConstructor + MeshtasticDatabase(-Constructor) - Ktor HttpClientEngineFactory ServiceLoader keep - Desktop MainKt + org.meshtastic.desktop.** entry points - All -dontwarn rules for JVM/Android platform gaps - app/proguard-rules.pro Compose runtime/ui/animation/foundation/ material3 keeps (defence-in-depth with -dontoptimize; may interact with the parallel CMP freeze RCA investigation). Verified: - ./gradlew :app:assembleFdroidRelease — SUCCESS (after each batch) - ./gradlew :app:assembleGoogleRelease — SUCCESS - ./gradlew spotlessApply detekt — SUCCESS - :desktop:createReleaseDistributable — pre-existing failure on origin/main (Vico/Skia warnings), unrelated to these changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-04-17 11:50:37 -05:00
# io.ktor.client.engine.java ships consumer rules; the shared
# HttpClientEngineFactory ServiceLoader keep in shared-rules.pro covers the
# reflective discovery path.
# ---- Meshtastic desktop host shell ------------------------------------------
# Keep all desktop module classes (thin host shell not worth tree-shaking)
-keep class org.meshtastic.desktop.** { *; }
# ---- JVM runtime suppression ------------------------------------------------
-dontwarn java.lang.reflect.**
-dontwarn sun.misc.Unsafe
-dontwarn java.lang.invoke.**
# ---- jSerialComm (cross-platform serial library with Android stubs) ---------
-dontwarn com.fazecast.jSerialComm.android.**
# ---- Kotlin stdlib atomics (Kotlin 2.3+ intrinsics, not on JDK 17) ----------
-dontwarn kotlin.concurrent.atomics.**
-dontwarn kotlin.uuid.UuidV7Generator