Skip to content

Commit d5425ce

Browse files
authored
Merge pull request #43 from skydoves/improve/r8-optimizations
Loosely apply the R8 optimizations
2 parents b53d880 + f81b88c commit d5425ce

File tree

8 files changed

+60
-40
lines changed

8 files changed

+60
-40
lines changed

app/src/main/kotlin/com/skydoves/myapplication/ExampleRecompositionTracking.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import com.skydoves.myapplication.models.UnstableUser
4343
* 1. Add @TraceRecomposition annotation to your composable
4444
* 2. Build the project (tracking code is automatically injected by the compiler)
4545
* 3. Enable logging in your Application class:
46-
* LoggerProvider.setEnabled(BuildConfig.DEBUG)
46+
* ComposeStabilityAnalyzer.setEnabled(BuildConfig.DEBUG)
4747
* 4. Run your app and check Logcat for "Recomposition" tag
4848
*/
4949
@Composable
@@ -252,7 +252,7 @@ fun RecompositionDemo() {
252252
* class MyApp : Application() {
253253
* override fun onCreate() {
254254
* super.onCreate()
255-
* LoggerProvider.setEnabled(BuildConfig.DEBUG)
255+
* ComposeStabilityAnalyzer.setEnabled(BuildConfig.DEBUG)
256256
* }
257257
* }
258258
* ```

compose-stability-analyzer-idea/CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,19 @@ All notable changes to the IntelliJ IDEA plugin will be documented in this file.
66

77
---
88

9+
## [0.5.2] - 2025-11-13
10+
11+
### Fixed
12+
- **Fixed APK size increase in release builds** (Issue #39)
13+
- ProGuard rules were keeping entire stability-runtime package unnecessarily
14+
- Optimized consumer-rules.pro to only keep classes used by compiler-injected code
15+
- Now only keeps `RecompositionTracker` methods (constructor, trackParameter, logIfThresholdMet)
16+
- Logger classes only kept if explicitly used via `ComposeStabilityAnalyzer.setLogger()`
17+
- Compile-time classes (`StabilityInfo`, `ComposableInfo`, `ParameterInfo`) now removed by R8
18+
- This fix dramatically reduces release APK size when using the plugin
19+
20+
---
21+
922
## [0.5.1] - 2025-11-10
1023

1124
### Added

compose-stability-analyzer-idea/build.gradle.kts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ intellijPlatform {
7171
</ul>
7272
""".trimIndent()
7373
changeNotes = """
74+
<b>0.5.2</b>
75+
<ul>
76+
<li><b>CRITICAL FIX: Resolved APK size bloat in release builds</b> (Issue #39)</li>
77+
<li>ProGuard rules optimized - only keeps classes actually used by compiler-injected code</li>
78+
<li>Dramatically reduced release APK size when using the plugin</li>
79+
</ul>
7480
<b>0.5.1</b>
7581
<ul>
7682
<li><b>Added wasmJs target support</b> - Runtime module now supports WebAssembly JavaScript for Compose Multiplatform web apps (Issue #32)</li>

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ kotlin.mpp.androidGradlePluginCompatibility.nowarn=true
5151

5252
# Maven publishing
5353
GROUP=com.github.skydoves
54-
VERSION_NAME=0.5.1
54+
VERSION_NAME=0.5.2
5555

5656
POM_URL=https://github.com/skydoves/compose-stability-analyzer/
5757
POM_SCM_URL=https://github.com/skydoves/compose-stability-analyzer/

stability-gradle/src/main/kotlin/com/skydoves/compose/stability/gradle/StabilityAnalyzerGradlePlugin.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public class StabilityAnalyzerGradlePlugin : KotlinCompilerPluginSupportPlugin {
4545

4646
// This version should match the version in gradle.properties
4747
// Update this when bumping the library version
48-
private const val VERSION = "0.5.1"
48+
private const val VERSION = "0.5.2"
4949

5050
// Compiler option keys
5151
private const val OPTION_ENABLED = "enabled"
Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,27 @@
1-
# Keep all classes and functions annotated with @TraceRecomposition
2-
# These are transformed by the compiler plugin and must not be obfuscated
3-
-keep @com.skydoves.compose.stability.runtime.TraceRecomposition class * { *; }
4-
-keep class * {
5-
@com.skydoves.compose.stability.runtime.TraceRecomposition *;
6-
}
7-
-keepclassmembers class * {
8-
@com.skydoves.compose.stability.runtime.TraceRecomposition *;
9-
}
10-
11-
# Keep the TraceRecomposition annotation itself
1+
# Keep annotations (used at compile-time, small overhead to keep)
122
-keep @interface com.skydoves.compose.stability.runtime.TraceRecomposition
13-
14-
# Keep all stability runtime annotations
153
-keep @interface com.skydoves.compose.stability.runtime.StableForAnalysis
16-
-keep @interface com.skydoves.compose.stability.runtime.SkipStabilityAnalysis
174
-keep @interface com.skydoves.compose.stability.runtime.IgnoreStabilityReport
185

19-
# Keep RecompositionTracker and related classes used by injected code
20-
-keep class com.skydoves.compose.stability.runtime.RecompositionTracker { *; }
21-
-keep class com.skydoves.compose.stability.runtime.** { *; }
6+
# Keep ONLY RecompositionTracker - used by compiler-injected code
7+
# The compiler injects calls to: constructor, trackParameter(), logIfThresholdMet()
8+
-keep class com.skydoves.compose.stability.runtime.RecompositionTracker {
9+
public <init>(java.lang.String, java.lang.String, int);
10+
public <methods>;
11+
}
12+
13+
# Keep public API for users who explicitly call ComposeStabilityAnalyzer.setLogger()
14+
# ComposeStabilityAnalyzer is a Kotlin object (singleton), methods are accessed via INSTANCE
15+
# These are only kept if referenced (R8 will remove if unused)
16+
-keep,allowobfuscation class com.skydoves.compose.stability.runtime.ComposeStabilityAnalyzer {
17+
public <methods>;
18+
}
19+
-keep,allowobfuscation interface com.skydoves.compose.stability.runtime.RecompositionLogger {
20+
public <methods>;
21+
}
22+
-keep,allowobfuscation class com.skydoves.compose.stability.runtime.RecompositionEvent { *; }
23+
-keep,allowobfuscation class com.skydoves.compose.stability.runtime.ParameterChange { *; }
2224

23-
# Keep all stability info data classes
24-
-keep class com.skydoves.compose.stability.runtime.StabilityInfo { *; }
25-
-keep class com.skydoves.compose.stability.runtime.ComposableInfo { *; }
26-
-keep class com.skydoves.compose.stability.runtime.ParameterInfo { *; }
25+
# Note: StabilityInfo/ComposableInfo/ParameterInfo are only used for JSON generation
26+
# at compile-time. They don't need to be kept in the runtime APK.
27+
# R8 will automatically remove them if unused.

stability-runtime/src/commonMain/kotlin/com/skydoves/compose/stability/runtime/RecompositionLogger.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import kotlin.concurrent.Volatile
3535
* }
3636
*
3737
* // In Application.onCreate()
38-
* LoggerProvider.setLogger(FirebaseRecompositionLogger())
38+
* ComposeStabilityAnalyzer.setLogger(FirebaseRecompositionLogger())
3939
* ```
4040
*/
4141
public interface RecompositionLogger {
@@ -110,13 +110,13 @@ public expect class DefaultRecompositionLogger() : RecompositionLogger {
110110
* Usage:
111111
* ```kotlin
112112
* // Set custom logger (typically in Application.onCreate() or MainActivity)
113-
* LoggerProvider.setLogger(MyCustomLogger())
113+
* ComposeStabilityAnalyzer.setLogger(MyCustomLogger())
114114
*
115115
* // Enable/disable logging
116-
* LoggerProvider.setEnabled(BuildConfig.DEBUG)
116+
* ComposeStabilityAnalyzer.setEnabled(BuildConfig.DEBUG)
117117
*
118118
* // Get current logger
119-
* val logger = LoggerProvider.getLogger()
119+
* val logger = ComposeStabilityAnalyzer.getLogger()
120120
* ```
121121
*/
122122
public object ComposeStabilityAnalyzer {
@@ -155,7 +155,7 @@ public object ComposeStabilityAnalyzer {
155155
*
156156
* Use this to disable logging in production builds:
157157
* ```kotlin
158-
* LoggerProvider.setEnabled(BuildConfig.DEBUG)
158+
* ComposeStabilityAnalyzer.setEnabled(BuildConfig.DEBUG)
159159
* ```
160160
*
161161
* @param enabled Whether logging should be enabled.

stability-runtime/src/commonTest/kotlin/com/skydoves/compose/stability/runtime/LoggerProviderTest.kt renamed to stability-runtime/src/commonTest/kotlin/com/skydoves/compose/stability/runtime/ComposeStabilityAnalyzerTest.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import kotlin.test.assertFalse
2323
import kotlin.test.assertNotNull
2424
import kotlin.test.assertTrue
2525

26-
class LoggerProviderTest {
26+
class ComposeStabilityAnalyzerTest {
2727

2828
private val defaultLogger = DefaultRecompositionLogger()
2929

@@ -40,13 +40,13 @@ class LoggerProviderTest {
4040
}
4141

4242
@Test
43-
fun testLoggerProvider_defaultLogger() {
43+
fun testComposeStabilityAnalyzer_defaultLogger() {
4444
val logger = ComposeStabilityAnalyzer.getLogger()
4545
assertNotNull(logger)
4646
}
4747

4848
@Test
49-
fun testLoggerProvider_setCustomLogger() {
49+
fun testComposeStabilityAnalyzer_setCustomLogger() {
5050
val customLogger = TestLogger()
5151
ComposeStabilityAnalyzer.setLogger(customLogger)
5252

@@ -55,12 +55,12 @@ class LoggerProviderTest {
5555
}
5656

5757
@Test
58-
fun testLoggerProvider_enabledByDefault() {
58+
fun testComposeStabilityAnalyzer_enabledByDefault() {
5959
assertTrue(ComposeStabilityAnalyzer.isEnabled())
6060
}
6161

6262
@Test
63-
fun testLoggerProvider_setEnabled() {
63+
fun testComposeStabilityAnalyzer_setEnabled() {
6464
ComposeStabilityAnalyzer.setEnabled(false)
6565
assertFalse(ComposeStabilityAnalyzer.isEnabled())
6666

@@ -69,7 +69,7 @@ class LoggerProviderTest {
6969
}
7070

7171
@Test
72-
fun testLoggerProvider_logEvent_whenEnabled() {
72+
fun testComposeStabilityAnalyzer_logEvent_whenEnabled() {
7373
val customLogger = TestLogger()
7474
ComposeStabilityAnalyzer.setLogger(customLogger)
7575
ComposeStabilityAnalyzer.setEnabled(true)
@@ -82,7 +82,7 @@ class LoggerProviderTest {
8282
}
8383

8484
@Test
85-
fun testLoggerProvider_logEvent_whenDisabled() {
85+
fun testComposeStabilityAnalyzer_logEvent_whenDisabled() {
8686
val customLogger = TestLogger()
8787
ComposeStabilityAnalyzer.setLogger(customLogger)
8888
ComposeStabilityAnalyzer.setEnabled(false)
@@ -94,7 +94,7 @@ class LoggerProviderTest {
9494
}
9595

9696
@Test
97-
fun testLoggerProvider_multipleEvents() {
97+
fun testComposeStabilityAnalyzer_multipleEvents() {
9898
val customLogger = TestLogger()
9999
ComposeStabilityAnalyzer.setLogger(customLogger)
100100
ComposeStabilityAnalyzer.setEnabled(true)
@@ -114,7 +114,7 @@ class LoggerProviderTest {
114114
}
115115

116116
@Test
117-
fun testLoggerProvider_changeLogger_midStream() {
117+
fun testComposeStabilityAnalyzer_changeLogger_midStream() {
118118
val logger1 = TestLogger()
119119
val logger2 = TestLogger()
120120

@@ -132,7 +132,7 @@ class LoggerProviderTest {
132132
}
133133

134134
@Test
135-
fun testLoggerProvider_toggleEnabled() {
135+
fun testComposeStabilityAnalyzer_toggleEnabled() {
136136
val customLogger = TestLogger()
137137
ComposeStabilityAnalyzer.setLogger(customLogger)
138138

0 commit comments

Comments
 (0)