mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-04-20 22:23:37 +00:00
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>
71 lines
3.4 KiB
Prolog
71 lines
3.4 KiB
Prolog
# ============================================================================
|
|
# 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) -------------------
|
|
# 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
|