Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proguard causing runtime exception with Android Navigation Component

I'm experiencing this crash when using proguard after integrating the NavigationComponent (android.arch.navigation:navigation-fragment-ktx:1.0.0-alpha01) into my project with target and compile sdk of 27

    2018-05-16 12:13:14.044 24573-24573/com.mypackage.myapp.x E/AndroidRuntime: FATAL EXCEPTION: main     Process: com.mypackage.myapp.x, PID: 24573     java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage.myapp.x/com.mypackage.myapp.MainActivity}: android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class fragment         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2925)         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060)         at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)         at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)         at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)         at android.os.Handler.dispatchMessage(Handler.java:106)         at android.os.Looper.loop(Looper.java:164)         at android.app.ActivityThread.main(ActivityThread.java:6649)         at java.lang.reflect.Method.invoke(Native Method)         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)      Caused by: android.view.InflateException: Binary XML file line #16: Binary XML file line #16: Error inflating class fragment      Caused by: android.view.InflateException: Binary XML file line #16: Error inflating class fragment      Caused by: java.lang.RuntimeException: Exception inflating com.mypackage.myapp.x:navigation/nav_graph line 7         at androidx.navigation.j.a(Unknown Source:124)         at androidx.navigation.d.a(Unknown Source:4)         at androidx.navigation.fragment.NavHostFragment.a(Unknown Source:88)         at android.support.v4.app.Fragment.l(Unknown Source:15)         at android.support.v4.app.m.a(Unknown Source:369)         at android.support.v4.app.m.b(Unknown Source:7)         at android.support.v4.app.m.a(Unknown Source:74)         at android.support.v4.app.m.onCreateView(Unknown Source:216)         at android.support.v4.app.j.a(Unknown Source:4)         at android.support.v4.app.h.a(Unknown Source:2)         at android.support.v4.app.d.onCreateView(Unknown Source:0)         at android.support.v4.app.h.onCreateView(Unknown Source:0)         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)         at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)         at android.view.LayoutInflater.rInflate(LayoutInflater.java:866)         at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)         at android.view.LayoutInflater.inflate(LayoutInflater.java:515)         at android.view.LayoutInflater.inflate(LayoutInflater.java:423)         at android.view.LayoutInflater.inflate(LayoutInflater.java:374)         at android.support.v7.app.AppCompatDelegateImplV9.b(Unknown Source:23)         at android.support.v7.app.d.setContentView(Unknown Source:4)         at com.mypackage.myapp.MainActivity.onCreate(Unknown Source:12)         at android.app.Activity.performCreate(Activity.java:7130)         at android.app.Activity.performCreate(Activity.java:7121)         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1262)         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2905)         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3060)         at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)         at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:110)         at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1800)         at android.os.Handler.dispatchMessage(Handler.java:106)         at android.os.Looper.loop(Looper.java:164)         at android.app.ActivityThread.main(ActivityThread.java:6649)         at java.lang.reflect.Method.invoke(Native Method)     2018-05-16 12:13:14.044 24573-24573/com.mypackage.myapp.x E/AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)      Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.mypackage.myapp.fragments.MainFragment         at androidx.navigation.fragment.b$a.a(Unknown Source:58)         at androidx.navigation.fragment.b$a.a(Unknown Source:19)         at androidx.navigation.j.a(Unknown Source:16)         at androidx.navigation.j.a(Unknown Source:133)         at androidx.navigation.j.a(Unknown Source:31)             ... 38 more      Caused by: java.lang.ClassNotFoundException: com.mypackage.myapp.fragments.MainFragment         at java.lang.Class.classForName(Native Method)         at java.lang.Class.forName(Class.java:453)         at androidx.navigation.fragment.b$a.a(Unknown Source:45)             ... 42 more      Caused by: java.lang.ClassNotFoundException: Didn't find class "com.mypackage.myapp.fragments.MainFragment" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.mypackage.myapp.x-ysts055HQTtJTv5J2uej3g==/base.apk"],nativeLibraryDirectories=[/data/app/com.mypackage.myapp.x-ysts055HQTtJTv5J2uej3g==/lib/x86, /system/lib]]         at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:125)         at java.lang.ClassLoader.loadClass(ClassLoader.java:379)         at java.lang.ClassLoader.loadClass(ClassLoader.java:312)             ... 45 more 

It might be because AAPT is not yet producing keep rules for the navigation component?

like image 381
Kayvan N Avatar asked May 16 '18 19:05

Kayvan N


1 Answers

I know that Proguard and R8 should be keeping all the children of library classes but in this case, the fragment class seems to be missing. This keep rule solved my issue but technically we should not need this rule at all!

-keep class * extends android.support.v4.app.Fragment{}

If you are using AndroidX, then use this rule: -keep class * extends androidx.fragment.app.Fragment{}

If you use argType in your navigation XML, you also need a rule for the referenced classes, for example: -keep class com.example.model.MyModel. Or even better, exclude parcelable and serializable classes from being renamed, as recommended by the official documentation. -keepnames class * extends android.os.Parcelable -keepnames class * extends java.io.Serializable

like image 76
Kayvan N Avatar answered Sep 20 '22 21:09

Kayvan N