Status Update
Comments
cu...@google.com <cu...@google.com>
ap...@google.com <ap...@google.com> #2
Can you share your Gradle build file and how room-compiler
is being setup? The error is indicating that the Room processor likely did not run which in turns means the generated implementation of the database was not created and can't be found.
cu...@google.com <cu...@google.com> #3
This is my gradle file. I need to re -explain it runs well in Android, iOS, and Desktop's debug.It only crash when runRelease on desktop.
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilationTask
plugins {
alias(libs.plugins.kotlinMultiplatform)
alias(libs.plugins.androidApplication)
alias(libs.plugins.composeMultiplatform)
alias(libs.plugins.composeCompiler)
alias(libs.plugins.kotlinCocoapods)
alias(libs.plugins.googleKsp)
alias(libs.plugins.kotlinSerialization)
alias(libs.plugins.androidxRoom)
}
kotlin {
androidTarget {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_11)
}
}
iosX64()
iosArm64()
iosSimulatorArm64()
cocoapods {
summary = "Some description for the Shared Module"
homepage = "Link to the Shared Module homepage"
version = "1.0"
ios.deploymentTarget = "13.0"
podfile = project.file("../iosApp/Podfile")
framework {
baseName = "ComposeApp"
isStatic = true
}
}
jvm("desktop")
sourceSets {
val desktopMain by getting
androidMain.dependencies {
implementation(compose.preview)
implementation(libs.androidx.activity.compose)
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.foundation)
implementation(compose.material3)
implementation(compose.ui)
implementation(compose.components.resources)
implementation(compose.components.uiToolingPreview)
implementation(libs.androidx.lifecycle.viewmodel)
implementation(libs.androidx.lifecycle.runtime.compose)
implementation(libs.androidx.navigation)
// Serialization
implementation(libs.kotlinx.serialization.json)
// Room
implementation(libs.androidx.room.runtime)
implementation(libs.androidx.sqlite.bundled)
}
desktopMain.dependencies {
implementation(compose.desktop.currentOs)
implementation(libs.kotlinx.coroutines.swing)
}
}
}
android {
namespace = "xxx"
compileSdk = libs.versions.android.compileSdk.get().toInt()
defaultConfig {
applicationId = "xxx"
minSdk = libs.versions.android.minSdk.get().toInt()
targetSdk = libs.versions.android.targetSdk.get().toInt()
versionCode = 1
versionName = "1.0"
}
packaging {
resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}"
}
}
buildTypes {
getByName("release") {
isMinifyEnabled = false
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}
}
dependencies {
debugImplementation(compose.uiTooling)
}
compose.desktop {
application {
mainClass = "xxx.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "xxx"
packageVersion = "1.0.0"
}
}
}
dependencies {
kspCommonMainMetadata(libs.koin.ksp.compiler)
listOf(
"kspAndroid",
"kspDesktop",
"kspIosX64",
"kspIosArm64",
"kspIosSimulatorArm64"
).forEach {
add(it, libs.androidx.room.compiler)
}
}
project.tasks.withType(KotlinCompilationTask::class.java).configureEach {
if (name != "kspCommonMainKotlinMetadata") {
dependsOn("kspCommonMainKotlinMetadata")
}
}
kotlin.sourceSets.commonMain {
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
room {
schemaDirectory("$projectDir/schemas")
}
ap...@google.com <ap...@google.com> #4
Does release
have some type of obfuscation? The generated database file is found via reflection and if the class is renamed due to obfuscation, that could be a cause. For room-runtime
ships with proguard rules
Also, one thing in the build file is you seem to have an outdated workaround where Room is applied to the common source set and a manual dependency to the KSP generated in metadata is added, those workarounds should be removed if using the latest version. Specifically the lines:
// in dependencies
kspCommonMainMetadata(libs.koin.ksp.compiler)
project.tasks.withType(KotlinCompilationTask::class.java).configureEach {
if (name != "kspCommonMainKotlinMetadata") {
dependsOn("kspCommonMainKotlinMetadata")
}
}
kotlin.sourceSets.commonMain {
kotlin.srcDir("build/generated/ksp/metadata/commonMain/kotlin")
}
I'm not sure if it'll solve your issue but wanted to call them out.
Description
If you show 2
BiometricPrompt
s back-to-back on a Pixel 4 (which uses face unlock), the second prompt will be immediately dismissed. This does not happen on devices that use fingerprint, like a Pixel 2.I've attached a sample project that reproduces the issue. You can configure the delay between the first prompt being dismissed and the second being shown - with a delay of 400ms the issue reliably reproduces, and with a delay of 600ms it does not.
Here's a video of the sample on a Pixel 4:https://i.imgur.com/4sCWOm0.mp4
Here's a video of the sample on a Pixel 2:https://i.imgur.com/5dDI4zO.mp4
I believe it's caused by this , which has a 500ms delay for face unlock and runs after the second prompt has been shown when 2 are shown back-to-back.
postDelayed
Note that this is a bug in the framework, not in the androidx.biometric library, but there doesn't seems to be a relevant component for framework biometrics (and it should be possible to work around this in androidx).
BUILD INFO:
STEPS TO REPRODUCE:
EXPECTED RESULTS: Both prompts work correctly.
OBSERVED RESULTS: The second prompt is immediately dismissed.
NUMBER OF TIMES YOU WERE ABLE TO REPRODUCE: 3/3