Skip to content

Commit 22e5967

Browse files
committed
refactor: baseline profiles
1 parent 4f41f40 commit 22e5967

File tree

18 files changed

+97
-46
lines changed

18 files changed

+97
-46
lines changed

app/build.gradle.kts

+6-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ android {
2222
}
2323

2424
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
25-
2625
}
2726

2827
val keystorePropertiesFile = rootProject.file("keystore.properties")
@@ -40,7 +39,12 @@ android {
4039

4140

4241
buildTypes {
43-
release {
42+
getByName("debug") {
43+
signingConfig = signingConfigs.getByName("config")
44+
}
45+
46+
47+
getByName("release") {
4448
isMinifyEnabled = true
4549
isShrinkResources = true
4650
proguardFiles(

app/src/main/AndroidManifest.xml

+5
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,11 @@
99
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
1010
<uses-permission android:name="android.permission.RECORD_AUDIO" />
1111

12+
<uses-permission
13+
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
14+
android:maxSdkVersion="28"
15+
tools:ignore="ScopedStorage" />
16+
1217
<application
1318
android:name=".GmHiltApp"
1419
android:allowBackup="true"

benchmarks/build.gradle.kts

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,36 @@
11
import com.android.build.api.dsl.ManagedVirtualDevice
22

33
plugins {
4+
alias(libs.plugins.android.test)
5+
alias(libs.plugins.jetbrains.kotlin.android)
46
alias(libs.plugins.baselineprofile)
5-
alias(libs.plugins.gptmap.android.test)
67
}
78

89
android {
910
namespace = "com.espressodev.benchmarks"
11+
compileSdk = 34
12+
13+
compileOptions {
14+
sourceCompatibility = JavaVersion.VERSION_1_8
15+
targetCompatibility = JavaVersion.VERSION_1_8
16+
}
17+
18+
kotlinOptions {
19+
jvmTarget = "1.8"
20+
}
1021

1122
defaultConfig {
1223
minSdk = 28
24+
targetSdk = 34
25+
1326
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
1427
}
1528

1629
targetProjectPath = ":app"
1730

31+
// This code creates the gradle managed device used to generate baseline profiles.
32+
// To use GMD please invoke generation through the command line:
33+
// ./gradlew :app:generateBaselineProfile
1834
testOptions.managedDevices.devices {
1935
create<ManagedVirtualDevice>("pixel6Api34") {
2036
device = "Pixel 6"
@@ -32,8 +48,8 @@ baselineProfile {
3248
}
3349

3450
dependencies {
35-
implementation(libs.androidx.test.ext)
36-
implementation(libs.androidx.espresso.core)
37-
implementation(libs.androidx.uiautomator)
38-
implementation(libs.androidx.benchmark.macro.junit4)
39-
}
51+
implementation(libs.androidx.junit)
52+
implementation(libs.androidx.test.espresso.core)
53+
implementation(libs.androidx.test.uiautomator)
54+
implementation(libs.androidx.benchmark.macro)
55+
}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<manifest />
1+
<manifest />
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
package com.espressodev.benchmarks.baselineprofile
1+
package com.espressodev.benchmarks
22

33
import androidx.benchmark.macro.junit4.BaselineProfileRule
4+
import androidx.test.ext.junit.runners.AndroidJUnit4
5+
import androidx.test.filters.LargeTest
46

57
import org.junit.Rule
68
import org.junit.Test
9+
import org.junit.runner.RunWith
710

811
/**
912
* This test class generates a basic startup baseline profile for the target package.
@@ -28,6 +31,8 @@ import org.junit.Test
2831
*
2932
* The minimum required version of androidx.benchmark to generate a baseline profile is 1.2.0.
3033
**/
34+
@RunWith(AndroidJUnit4::class)
35+
@LargeTest
3136
class BaselineProfileGenerator {
3237

3338
@get:Rule
@@ -38,6 +43,7 @@ class BaselineProfileGenerator {
3843
// This example works only with the variant with application id `com.espressodev.gptmap`."
3944
rule.collect(
4045
packageName = "com.espressodev.gptmap",
46+
maxIterations = 3,
4147

4248
// See: https://d.android.com/topic/performance/baselineprofiles/dex-layout-optimizations
4349
includeInStartupProfile = true
+8-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
package com.espressodev.benchmarks.baselineprofile
1+
package com.espressodev.benchmarks
22

33
import androidx.benchmark.macro.BaselineProfileMode
44
import androidx.benchmark.macro.CompilationMode
55
import androidx.benchmark.macro.StartupMode
66
import androidx.benchmark.macro.StartupTimingMetric
77
import androidx.benchmark.macro.junit4.MacrobenchmarkRule
8-
import androidx.test.rule.GrantPermissionRule
9-
import com.espressodev.benchmarks.allowWriteToExternal
8+
import androidx.test.ext.junit.runners.AndroidJUnit4
9+
import androidx.test.filters.LargeTest
1010

1111
import org.junit.Rule
1212
import org.junit.Test
13+
import org.junit.runner.RunWith
1314

1415
/**
1516
* This test class benchmarks the speed of app startup.
@@ -31,6 +32,8 @@ import org.junit.Test
3132
* For more information, see the [Macrobenchmark documentation](https://d.android.com/macrobenchmark#create-macrobenchmark)
3233
* and the [instrumentation arguments documentation](https://d.android.com/topic/performance/benchmarking/macrobenchmark-instrumentation-args).
3334
**/
35+
@RunWith(AndroidJUnit4::class)
36+
@LargeTest
3437
class StartupBenchmarks {
3538

3639
@get:Rule
@@ -51,10 +54,9 @@ class StartupBenchmarks {
5154
metrics = listOf(StartupTimingMetric()),
5255
compilationMode = compilationMode,
5356
startupMode = StartupMode.COLD,
54-
iterations = 10,
57+
iterations = 3,
5558
setupBlock = {
5659
pressHome()
57-
allowWriteToExternal()
5860
},
5961
measureBlock = {
6062
startActivityAndWait()
@@ -70,4 +72,4 @@ class StartupBenchmarks {
7072
}
7173
)
7274
}
73-
}
75+
}

benchmarks/src/main/kotlin/com/espressodev/benchmarks/GeneralActions.kt

-12
This file was deleted.

build-logic/convention/build.gradle.kts

+10-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,21 @@ tasks.withType<KotlinCompile>().configureEach {
1818
}
1919

2020
dependencies {
21+
compileOnly(libs.android.gradlePlugin)
22+
compileOnly(libs.android.tools.common)
23+
compileOnly(libs.firebase.crashlytics.gradlePlugin)
2124
compileOnly(libs.kotlin.gradlePlugin)
2225
compileOnly(libs.ksp.gradlePlugin)
23-
compileOnly(libs.android.gradlePlugin)
2426
compileOnly(libs.detekt.gradlePlugin)
2527
}
2628

29+
tasks {
30+
validatePlugins {
31+
enableStricterValidation = true
32+
failOnWarning = true
33+
}
34+
}
35+
2736
gradlePlugin {
2837
plugins {
2938
register("androidApplicationCompose") {

build-logic/convention/src/main/kotlin/AndroidApplicationFirebaseConventionPlugin.kt

+16
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
import com.android.build.api.dsl.ApplicationExtension
12
import com.espressodev.gptmap.ext.implementation
23
import com.espressodev.gptmap.libs
4+
import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsExtension
35
import org.gradle.api.Plugin
46
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.configure
58
import org.gradle.kotlin.dsl.dependencies
69

710
class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
@@ -13,6 +16,8 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
1316
}
1417

1518
dependencies {
19+
val bom = libs.findLibrary("firebase-bom").get()
20+
add("implementation", platform(bom))
1621
implementation(libs.findLibrary("firebase-auth").get())
1722
implementation(libs.findLibrary("firebase-firestore").get())
1823
implementation(libs.findLibrary("firebase-crashlytics").get())
@@ -21,6 +26,17 @@ class AndroidApplicationFirebaseConventionPlugin : Plugin<Project> {
2126
implementation(libs.findLibrary("play-services-location").get())
2227
implementation(libs.findLibrary("play-services-maps").get())
2328
}
29+
30+
// extensions.configure<ApplicationExtension> {
31+
// buildTypes.configureEach {
32+
// // Disable the Crashlytics mapping file upload. This feature should only be
33+
// // enabled if a Firebase backend is available and configured in
34+
// // google-services.json.
35+
// configure<CrashlyticsExtension> {
36+
// mappingFileUploadEnabled = false
37+
// }
38+
// }
39+
// }
2440
}
2541
}
2642
}

build-logic/convention/src/main/kotlin/com/espressodev/gptmap/AndroidCompose.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import org.gradle.kotlin.dsl.withType
1010
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
1111

1212
internal fun Project.configureAndroidCompose(
13-
commonExtension: CommonExtension<*, *, *, *, *>,
13+
commonExtension: CommonExtension<*, *, *, *, *, *>,
1414
) {
1515
commonExtension.apply {
1616
buildFeatures {

build-logic/convention/src/main/kotlin/com/espressodev/gptmap/AndroidInstrumentedTests.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import org.gradle.api.Project
66
internal fun LibraryAndroidComponentsExtension.disableUnnecessaryAndroidTests(
77
project: Project,
88
) = beforeVariants {
9-
it.enableAndroidTest = it.enableAndroidTest
9+
it.androidTest.enable = it.androidTest.enable
1010
&& project.projectDir.resolve("src/androidTest").exists()
1111
}
12+

build-logic/convention/src/main/kotlin/com/espressodev/gptmap/GradleManagedDevices.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import org.gradle.kotlin.dsl.invoke
99
* Configure project for Gradle managed devices
1010
*/
1111
internal fun configureGradleManagedDevices(
12-
commonExtension: CommonExtension<*, *, *, *, *>,
12+
commonExtension: CommonExtension<*, *, *, *, *, *>,
1313
) {
1414
val pixel4 = DeviceConfig("Pixel 4", 30, "aosp-atd")
1515
val pixel6 = DeviceConfig("Pixel 6", 31, "aosp")

build-logic/convention/src/main/kotlin/com/espressodev/gptmap/KotlinAndroid.kt

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.espressodev.gptmap
22

33
import com.android.build.api.dsl.CommonExtension
4-
import com.espressodev.gptmap.ext.androidTestImplementation
54
import com.espressodev.gptmap.ext.implementation
65
import org.gradle.api.JavaVersion
76
import org.gradle.api.Project
@@ -13,7 +12,7 @@ import org.gradle.kotlin.dsl.withType
1312
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
1413

1514
internal fun Project.configureKotlinAndroid(
16-
commonExtension: CommonExtension<*, *, *, *, *>,
15+
commonExtension: CommonExtension<*, *, *, *, *, *>,
1716
) {
1817
commonExtension.apply {
1918
compileSdk = 34
@@ -80,4 +79,3 @@ private fun Project.configureKotlin() {
8079
}
8180
}
8281
}
83-

build.gradle.kts

+2-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ buildscript {
44
}
55
dependencies {
66
classpath(libs.google.services)
7-
classpath(libs.firebase.crashlytics.gradlePlugin)
87
classpath(libs.google.oss.licenses.plugin) {
98
exclude(group = "com.google.protobuf")
109
}
@@ -33,6 +32,7 @@ subprojects {
3332
plugins {
3433
alias(libs.plugins.android.application) apply false
3534
alias(libs.plugins.android.library) apply false
35+
alias(libs.plugins.android.test) apply false
3636
alias(libs.plugins.kotlin.jvm) apply false
3737
alias(libs.plugins.kotlin.serialization) apply false
3838
alias(libs.plugins.firebase.crashlytics) apply false
@@ -41,7 +41,6 @@ plugins {
4141
alias(libs.plugins.secrets) apply false
4242
alias(libs.plugins.detekt) apply false
4343
alias(libs.plugins.gms) apply false
44-
alias(libs.plugins.androidTest) apply false
45-
alias(libs.plugins.jetbrainsKotlinAndroid) apply false
4644
alias(libs.plugins.baselineprofile) apply false
45+
alias(libs.plugins.jetbrains.kotlin.android) apply false
4746
}

core/datastore/src/main/kotlin/com/espressodev/gptmap/core/datastore/UserPreferencesSerializer.kt

-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import java.io.InputStream
77
import java.io.OutputStream
88
import javax.inject.Inject
99

10-
1110
class UserPreferencesSerializer @Inject constructor() : Serializer<UserPreferences> {
1211
override val defaultValue: UserPreferences = UserPreferences.getDefaultInstance()
1312

@@ -24,4 +23,3 @@ class UserPreferencesSerializer @Inject constructor() : Serializer<UserPreferenc
2423
t.writeTo(output)
2524
}
2625
}
27-

feature/delete-profile/src/main/kotlin/com/espressodev/gptmap/feature/delete_profile/DeleteProfileScreen.kt

+5
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.espressodev.gptmap.core.designsystem.TextType
3636
import com.espressodev.gptmap.core.designsystem.component.GmAlertDialog
3737
import com.espressodev.gptmap.core.designsystem.component.GmProgressIndicator
3838
import com.espressodev.gptmap.core.designsystem.component.GmTopAppBar
39+
import java.util.PriorityQueue
3940
import com.espressodev.gptmap.core.designsystem.R.drawable as AppDrawable
4041
import com.espressodev.gptmap.core.designsystem.R.string as AppText
4142

@@ -65,6 +66,10 @@ fun DeleteProfileRoute(
6566
)
6667
}
6768

69+
70+
val queue =
71+
PriorityQueue<Map<Int, Int>> { a, b -> a.keys.first().compareTo(b.keys.first()) }
72+
6873
if (isDialogOpened) {
6974
GmAlertDialog(
7075
title = AppText.delete_confirm,

0 commit comments

Comments
 (0)