Search code examples
androidproguard

Unable Instantiate Fragment after Enabling Proguard


I am experiencing Runtime exception after enabling the minified and proguard. It only happens to the fragment that inside Dynamic Feature Module that i navigate into using deeplink. Another fragment inside the :app module doesnt get affected either by deeplink or using default bottom view navigation. Here is the logcat:

2021-01-30 19:41:03.026 5152-5152/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.wiryadev.gamemade, PID: 5152
    androidx.fragment.app.Fragment$e: Unable to instantiate fragment com.wiryadev.gamemade.favorite.LibraryFragment: calling Fragment constructor caused an exception
        at androidx.fragment.app.Fragment.S(:566)
        at b.l.b.f.d(:57)
        at b.l.b.l$c.a(:390)
        at b.q.y.b.h(:132)
        at b.q.y.b.i(:162)
        at b.q.y.b.b(:58)
        at androidx.navigation.NavController.t(:1057)
        at androidx.navigation.NavController.o(:942)
        at androidx.navigation.NavController.n(:875)
        at b.q.z.b.c(:97)
        at b.q.z.b$a.a(:531)
        at com.google.android.material.bottomnavigation.BottomNavigationView$a.a(:243)
        at b.b.e.j.g.h(:834)
        at b.b.e.j.i.k(:158)
        at b.b.e.j.g.O(:985)
        at d.c.a.a.f.c$a.onClick(:127)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        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:7356)
        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:930)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at androidx.fragment.app.Fragment.S(:548)
        at b.l.b.f.d(:57) 
        at b.l.b.l$c.a(:390) 
        at b.q.y.b.h(:132) 
        at b.q.y.b.i(:162) 
        at b.q.y.b.b(:58) 
        at androidx.navigation.NavController.t(:1057) 
        at androidx.navigation.NavController.o(:942) 
        at androidx.navigation.NavController.n(:875) 
        at b.q.z.b.c(:97) 
        at b.q.z.b$a.a(:531) 
        at com.google.android.material.bottomnavigation.BottomNavigationView$a.a(:243) 
        at b.b.e.j.g.h(:834) 
        at b.b.e.j.i.k(:158) 
        at b.b.e.j.g.O(:985) 
        at d.c.a.a.f.c$a.onClick(:127) 
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        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:7356) 
        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:930) 
     Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at androidx.fragment.app.Fragment.S(:548) 
        at b.l.b.f.d(:57) 
        at b.l.b.l$c.a(:390) 
        at b.q.y.b.h(:132) 
        at b.q.y.b.i(:162) 
        at b.q.y.b.b(:58) 
        at androidx.navigation.NavController.t(:1057) 
        at androidx.navigation.NavController.o(:942) 
        at androidx.navigation.NavController.n(:875) 
        at b.q.z.b.c(:97) 
        at b.q.z.b$a.a(:531) 
        at com.google.android.material.bottomnavigation.BottomNavigationView$a.a(:243) 
        at b.b.e.j.g.h(:834) 
        at b.b.e.j.i.k(:158) 
        at b.b.e.j.g.O(:985) 
        at d.c.a.a.f.c$a.onClick(:127) 
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        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:7356) 
        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:930) 
     Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/com.wiryadev.gamemade-0WdQ4RQ7wK7O2BstfJCacQ==/base.apk", zip file "/data/app/com.wiryadev.gamemade-0WdQ4RQ7wK7O2BstfJCacQ==/split_favorite.apk"],nativeLibraryDirectories=[/data/app/com.wiryadev.gamemade-0WdQ4RQ7wK7O2BstfJCacQ==/lib/x86, /data/app/com.wiryadev.gamemade-0WdQ4RQ7wK7O2BstfJCacQ==/base.apk!/lib/x86, /data/app/com.wiryadev.gamemade-0WdQ4RQ7wK7O2BstfJCacQ==/split_favorite.apk!/lib/x86, /system/lib, /system/product/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at java.lang.reflect.Constructor.newInstance0(Native Method) 
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343) 
        at androidx.fragment.app.Fragment.S(:548) 
        at b.l.b.f.d(:57) 
        at b.l.b.l$c.a(:390) 
        at b.q.y.b.h(:132) 
        at b.q.y.b.i(:162) 
        at b.q.y.b.b(:58) 
        at androidx.navigation.NavController.t(:1057) 
        at androidx.navigation.NavController.o(:942) 
        at androidx.navigation.NavController.n(:875) 
        at b.q.z.b.c(:97) 
        at b.q.z.b$a.a(:531) 
        at com.google.android.material.bottomnavigation.BottomNavigationView$a.a(:243) 
        at b.b.e.j.g.h(:834) 
        at b.b.e.j.i.k(:158) 
        at b.b.e.j.g.O(:985) 
        at d.c.a.a.f.c$a.onClick(:127) 
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        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:7356) 
        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:930) 
2021-01-30 19:41:03.133 2049-2141/? E/InputDispatcher: channel '66c185c com.wiryadev.gamemade/com.wiryadev.gamemade.ui.main.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-01-30 19:41:03.390 2575-2631/? E/ModuleIdSetter: exception when setting module id
    java.lang.IllegalStateException: Unable to get current module info in ModuleManager created with non-module Context
        at com.google.android.chimera.config.ModuleManager.getCurrentModule(:com.google.android.gms@[email protected] (120700-349456378):2)
        at agdf.a(:com.google.android.gms@[email protected] (120700-349456378):4)
        at agdi.aa(:com.google.android.gms@[email protected] (120700-349456378):1)
        at afzt.a(Unknown Source:3)
        at siq.a(:com.google.android.gms@[email protected] (120700-349456378):0)
        at seu.f(:com.google.android.gms@[email protected] (120700-349456378):1)
        at ses.e(:com.google.android.gms@[email protected] (120700-349456378):1)
        at shm.p(:com.google.android.gms@[email protected] (120700-349456378):2)
        at shm.v(:com.google.android.gms@[email protected] (120700-349456378):3)
        at shm.e(:com.google.android.gms@[email protected] (120700-349456378):2)
        at shq.handleMessage(:com.google.android.gms@[email protected] (120700-349456378):70)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at afso.iC(:com.google.android.gms@[email protected] (120700-349456378):0)
        at afso.dispatchMessage(:com.google.android.gms@[email protected] (120700-349456378):11)
        at android.os.Looper.loop(Looper.java:214)
        at android.os.HandlerThread.run(HandlerThread.java:67)

I tried adding this line which i got from here but doesnt work.

-keepnames class androidx.navigation.fragment.NavHostFragment

Anyone experienced this? What should i do?

Update:

shared_depencies.gradle that implemented across module:

dependencies {
    implementation "androidx.appcompat:appcompat:$appcompat_version"
    implementation "androidx.core:core-ktx:$core_ktx_version"
    implementation "androidx.constraintlayout:constraintlayout:$constraint_version"
    implementation "androidx.navigation:navigation-fragment-ktx:$navigation_version"
    implementation "androidx.navigation:navigation-ui-ktx:$navigation_version"

    testImplementation "junit:junit:$junit_version"
    androidTestImplementation "androidx.test.ext:junit:$androidx_junit_version"
    androidTestImplementation "androidx.test.espresso:espresso-core:$espresso_version"

    implementation "androidx.multidex:multidex:$multidex_version"
    debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakcanary_version"

    // UI
    implementation "androidx.recyclerview:recyclerview:$recyclerview_version"
    implementation "com.google.android.material:material:$material_version"
    implementation "io.coil-kt:coil:$coil_version"
    implementation "com.airbnb.android:lottie:$lottie_version"
    implementation "com.facebook.shimmer:shimmer:$shimmer_version"

    // Hilt
    implementation "com.google.dagger:hilt-android:$hilt_version"
    kapt "com.google.dagger:hilt-compiler:$hilt_version"
    implementation "androidx.hilt:hilt-lifecycle-viewmodel:$hilt_jetpack_version"
}

The shared dependency is applied by:

apply from: '../shared_dependencies.gradle'

core module dependencies:

dependencies {
    //noinspection DifferentStdlibGradleVersion
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"

    // Room
    api "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    androidTestImplementation "androidx.room:room-testing:$room_version"

    // Retrofit
    api "com.squareup.retrofit2:retrofit:$retrofit_version"
    api "com.squareup.retrofit2:converter-gson:$retrofit_version"
    api "com.squareup.okhttp3:logging-interceptor:$logging_interceptor_version"

    // Coroutine
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$kotlin_coroutines_version"
    implementation "androidx.room:room-ktx:$room_version"

    // Lifecycle
    api "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
    api "androidx.activity:activity-ktx:$activity_ktx_version"
    api "androidx.fragment:fragment-ktx:$fragment_ktx_version"

    // Security
    implementation "net.zetetic:android-database-sqlcipher:$sqlcipher_version"
    implementation "androidx.sqlite:sqlite-ktx:$sqlite_version"
}

app module dependencies

dependencies {
    implementation project(":core")
    //noinspection DifferentStdlibGradleVersion
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

dynamic feature module dependencies:

dependencies {
    implementation project(":app")
    implementation project(":core")
    //noinspection DifferentStdlibGradleVersion
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}

Additional Info:

  • This will happens if the :app module being obfuscated too
  • If only :core module being obfuscated, it is okay
  • The dynamic feature module not being obfuscated at all

Solution

  • Turns out i have to change the context that i pass into Dagger in the dynamic feature module fragment. So, instead using requireContext(), use requireActivity().appicationContext in my case. The code should be looking like this:

    DaggerFavoriteComponent.builder()
        .context(requireActivity())
        .appDependencies(
            EntryPointAccessors.fromApplication(
                requireActivity().applicationContext,
                FavoriteModuleDependencies::class.java
            )
        )
        .build()
        .inject(this)