[EDIT] : please find the added AndroidManifest.xml
My perfectly fonctionnal app in debug mode crashes on Start in release mode. "excepton occured: Multiple entries with same key: e4.b=true and e4.b=true"
Manifest :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal"
android:requestLegacyExternalStorage="true">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission
android:name="android.permission.READ_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.CAMERA" />
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
<application
android:name=".HiltWms"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.App.Starting"
tools:targetApi="31">
<receiver
android:name=".helper.download.DownloadCompletedReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
</intent-filter>
</receiver>
<activity
android:name=".MainActivity"
android:exported="true"
android:theme="@style/Theme.MyApp">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".HomeActivity"
android:exported="false"
android:label="@string/title_activity_home"
android:theme="@style/Theme.MyApp" />
<activity
android:name=".ScanActivity"
android:exported="false"
android:label="@string/title_activity_scan"
android:theme="@style/Theme.MyApp" />
<activity
android:name=".CrashActivity"
android:exported="false"
android:label="@string/title_activity_crash"
android:theme="@style/Theme.MyApp" />
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application>
</manifest>
Here's the log :
FATAL EXCEPTION: main
Process: release.example.myapp, PID: 18110
java.lang.IllegalArgumentException: Multiple entries with same key: e4.b=true and e4.b=true
at f5.e.a(SourceFile:45)
at A4.h.e(SourceFile:464)
at S2.G.a(SourceFile:55)
at X4.m5.b(SourceFile:11)
at S2.Y.g(SourceFile:10)
at Y4.u3.a(SourceFile:21)
at X4.f5.a(SourceFile:162)
at S2.l0.o(SourceFile:174)
at B0.c.o(SourceFile:52)
at k0.k0.o(SourceFile:170)
at B0.c.o(SourceFile:52)
at t0.d.b(SourceFile:150)
at q0.J1.a(SourceFile:128)
at S2.l0.o(SourceFile:79)
at B0.c.o(SourceFile:52)
at t0.d.a(SourceFile:233)
at q0.p2.a(SourceFile:77)
at D1.o.o(SourceFile:318)
at B0.c.o(SourceFile:52)
at t0.d.b(SourceFile:150)
at q0.K0.a(SourceFile:224)
at G3.e.a(SourceFile:1048)
at S2.m0.o(SourceFile:350)
at B0.c.o(SourceFile:52)
at f1.l0.a(SourceFile:70)
at D0.y.o(SourceFile:671)
at B0.c.o(SourceFile:52)
at t0.d.b(SourceFile:150)
at f1.m0.a(SourceFile:309)
at O3.l.o(SourceFile:1409)
at B0.c.o(SourceFile:52)
at t0.d.b(SourceFile:150)
at androidx.compose.ui.platform.AndroidCompositionLocals_androidKt.a(SourceFile:592)
at f1.p1.o(SourceFile:250)
at B0.c.o(SourceFile:52)
at t0.d.a(SourceFile:233)
at f1.p1.o(SourceFile:213)
at B0.c.o(SourceFile:52)
at t0.d.L(SourceFile:15)
at t0.p.p(SourceFile:203)
at t0.t.k(SourceFile:32)
at t0.t0.a(SourceFile:44)
at t0.t.l(SourceFile:9)
at t0.t.b(SourceFile:3)
at a0.j0.q(SourceFile:1015)
at f1.v.setOnViewTreeOwnersAvailable(SourceFile:7)
at f1.q1.b(SourceFile:10)
at f1.q1.i(SourceFile:19)
at androidx.lifecycle.u.a(SourceFile:23)
at androidx.lifecycle.v.a(SourceFile:216)
at a0.j0.q(SourceFile:984)
at f1.v.onAttachedToWindow(SourceFile:120)
at android.view.View.dispatchAttachedToWindow(View.java:20109)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3430)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewGroup.dispatchAttachedToWindow(ViewGroup.java:3437)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2050)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1743)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7772)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1036)
at android.view.Choreographer.doCallbacks(Choreographer.java:859)
at android.view.Choreographer.doFrame(Choreographer.java:794)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1021)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7397)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
It could be incompatible librairies versions, here is my build.gradle (Project) and (app)
buildscript {
ext {
// core
kotlin_core = '1.13.1'
// base
activity_compose_version = '1.9.2'
compose_version = '1.7.0'
material_version = '1.7.0'
material3_version = '1.3.0'
material_icon_version = '1.7.0'
navigation_compose_version = '2.8.0'
lifecycle_version = '2.8.5'
hilt_version = '2.52'
hilt_navigation_version = '1.2.0'
room_version = '2.6.1'
core_splashscreen_version = '1.0.1'
composeAnimation = '1.7.0'
}
dependencies {
classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
}
}
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '8.5.2' apply false // 8.0.2
id 'com.android.library' version '8.5.2' apply false // 8.0.2
id 'org.jetbrains.kotlin.android' version '1.9.24' apply false
id 'org.jetbrains.kotlin.jvm' version '1.7.0' apply false
}
tasks.register('clean', Delete) {
delete rootProject.layout.buildDirectory
}
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id "dagger.hilt.android.plugin"
id 'kotlin-kapt'
}
android {
namespace 'com.example.myapp'
compileSdk 34
defaultConfig {
// applicationId "test.example.myapp"
applicationId "release.example.myapp"
minSdk 25
targetSdk 34
versionCode 2
versionName "0.0.2"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
// Required when setting minSdkVersion to 20 or lower
// multiDexEnabled true
}
buildTypes {
debug {
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
}
kotlinOptions {
jvmTarget = '17'
}
buildFeatures {
compose true
buildConfig = true
}
composeOptions {
kotlinCompilerExtensionVersion '1.5.14'
}
packagingOptions {
resources {
excludes += '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation "androidx.core:core-ktx:$kotlin_core"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version "
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version "
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version"
implementation "androidx.activity:activity-compose:$activity_compose_version"
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation "androidx.compose.material:material:$material_version"
implementation "androidx.compose.material3:material3:$material3_version"
implementation "androidx.compose.animation:animation-android:$composeAnimation"
implementation "androidx.navigation:navigation-compose:$navigation_compose_version"
implementation 'androidx.compose.ui:ui-graphics'
implementation platform('androidx.compose:compose-bom:2024.09.00')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.2.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
androidTestImplementation platform('androidx.compose:compose-bom:2024.09.00')
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_version"
// Icons
implementation "androidx.compose.material:material-icons-extended:$material_icon_version"
// DataStore
implementation "androidx.datastore:datastore-preferences:1.1.1"
implementation 'androidx.datastore:datastore-preferences-rxjava2:1.1.1'
implementation 'androidx.datastore:datastore-preferences-rxjava3:1.1.1'
implementation "androidx.datastore:datastore:1.1.1"
implementation 'androidx.datastore:datastore-rxjava2:1.1.1'
implementation 'androidx.datastore:datastore-rxjava3:1.1.1'
// Hilt
implementation "androidx.hilt:hilt-navigation-compose:$hilt_navigation_version"
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
//Room
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"
// Splash API
implementation "androidx.core:core-splashscreen:$core_splashscreen_version"
// HTTP calls
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.14'
// JSON handler
implementation 'com.google.code.gson:gson:2.11.0'
// system bars customization
implementation 'com.google.accompanist:accompanist-systemuicontroller:0.36.0'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
implementation 'io.reactivex.rxjava3:rxjava:3.1.9'
implementation 'androidx.appcompat:appcompat:1.7.0' // 1.4.0
implementation 'com.google.mlkit:barcode-scanning:17.3.0' //17.0.3'
implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1' //18.1.0
def camerax_version = '1.3.4' //"1.0.2"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}" // 1.0.0-alpha29
// Camera Permission
implementation 'com.google.accompanist:accompanist-permissions:0.36.0'
implementation 'com.google.guava:guava:33.3.0-android'
// Coil animation
implementation 'io.coil-kt:coil:2.7.0'
implementation 'io.coil-kt:coil-gif:2.7.0'
implementation 'io.coil-kt:coil-compose:2.7.0'
// For AGP 7.4+
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.2'
}
// Allow references to generated code
kapt {
correctErrorTypes true
useBuildCache = true
}
configurations {
// Resolves dependency conflict caused by some dependencies use
// com.google.guava:guava and com.google.guava:listenablefuture together.
all*.exclude group: 'com.google.guava', module: 'listenablefuture'
}
I know it could be about the proguard obfuscation rules but I don't know where to start to add the correct rules.
Thank you if you can help me !
Thanks to @Gg M I found a line in mapping.txt referring to the error " Multiple entries with same key: e4.b=true and e4.b=true" In myapp\app\build\outputs\mapping\release\mapping.txt :
com.example.myapp.views.prints.PrintsViewModel -> e4.b:
We can't instantiate multiple viewModel consumming the same Repository. Example :
class GeneralViewModel @Inject constructor(
private val repoPrint: PrintRepository
) : ViewModel() {
val printsList = repoPrint.getPrintsFromRoom()
}