diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0c6e3eeb9..cb18b33d6 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -119,6 +119,7 @@ dependencies { implementation(libs.androidx.navigation.compose) implementation(libs.androidx.window.manager) implementation(libs.androidx.profileinstaller) + implementation(libs.kotlinx.coroutines.guava) implementation(libs.coil.kt) } diff --git a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt index 79d556f73..e107fd88c 100644 --- a/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt +++ b/app/src/main/java/com/google/samples/apps/nowinandroid/MainActivity.kt @@ -17,6 +17,7 @@ package com.google.samples.apps.nowinandroid import android.os.Bundle +import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels @@ -35,6 +36,7 @@ import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.metrics.performance.JankStats +import androidx.profileinstaller.ProfileVerifier import com.google.accompanist.systemuicontroller.rememberSystemUiController import com.google.samples.apps.nowinandroid.MainActivityUiState.Loading import com.google.samples.apps.nowinandroid.MainActivityUiState.Success @@ -47,11 +49,16 @@ import com.google.samples.apps.nowinandroid.core.model.data.DarkThemeConfig import com.google.samples.apps.nowinandroid.core.model.data.ThemeBrand import com.google.samples.apps.nowinandroid.ui.NiaApp import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.guava.await import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import javax.inject.Inject +private const val TAG = "MainActivity" + @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) @AndroidEntryPoint class MainActivity : ComponentActivity() { @@ -133,12 +140,48 @@ class MainActivity : ComponentActivity() { override fun onResume() { super.onResume() lazyStats.get().isTrackingEnabled = true + lifecycleScope.launch { + logCompilationStatus() + } } override fun onPause() { super.onPause() lazyStats.get().isTrackingEnabled = false } + + /** + * Logs the app's Baseline Profile Compilation Status using [ProfileVerifier]. + */ + private suspend fun logCompilationStatus() { + /* + When delivering through Google Play, the baseline profile is compiled during installation. + In this case you will see the correct state logged without any further action necessary. + To verify baseline profile installation locally, you need to manually trigger baseline + profile installation. + For immediate compilation, call: + `adb shell cmd package compile -f -m speed-profile com.example.macrobenchmark.target` + You can also trigger background optimizations: + `adb shell pm bg-dexopt-job` + Both jobs run asynchronously and might take some time complete. + To see quick turnaround of the ProfileVerifier, we recommend using `speed-profile`. + If you don't do either of these steps, you might only see the profile status reported as + "enqueued for compilation" when running the sample locally. + */ + withContext(Dispatchers.IO) { + val status = ProfileVerifier.getCompilationStatusAsync().await() + Log.d(TAG, "ProfileInstaller status code: ${status.profileInstallResultCode}") + Log.d( + TAG, + when { + status.isCompiledWithProfile -> "ProfileInstaller: is compiled with profile" + status.hasProfileEnqueuedForCompilation() -> + "ProfileInstaller: Enqueued for compilation" + else -> "Profile not compiled or enqueued" + }, + ) + } + } } /** diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b0046ff66..3be086b09 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ androidxLifecycle = "2.6.0-alpha05" androidxMacroBenchmark = "1.2.0-alpha16" androidxMetrics = "1.0.0-alpha03" androidxNavigation = "2.5.3" -androidxProfileinstaller = "1.2.1" +androidxProfileinstaller = "1.3.1" androidxStartup = "1.1.1" androidxTestCore = "1.5.0" androidxTestExt = "1.1.4" @@ -117,6 +117,7 @@ hilt-ext-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "hi junit4 = { group = "junit", name = "junit", version.ref = "junit4" } kotlin-stdlib = { group = "org.jetbrains.kotlin", name = "kotlin-stdlib-jdk8", version.ref = "kotlin" } kotlinx-coroutines-android = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } +kotlinx-coroutines-guava = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-guava", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" } kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }