Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Proguard使用Android导航组件导致运行时异常_Android_Android Proguard_Android Jetpack_Android Architecture Navigation - Fatal编程技术网

Proguard使用Android导航组件导致运行时异常

Proguard使用Android导航组件导致运行时异常,android,android-proguard,android-jetpack,android-architecture-navigation,Android,Android Proguard,Android Jetpack,Android Architecture Navigation,在将导航组件(android.arch.navigation:navigation fragment ktx:1.0.0-alpha01)与target和compile sdk 27集成到我的项目中后,使用proguard时,我遇到了这个崩溃 2018-05-16 12:13:14.044 24573-24573/com.mypackage.myapp.x E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mypackage

在将导航组件(
android.arch.navigation:navigation fragment ktx:1.0.0-alpha01
)与target和compile sdk 27集成到我的项目中后,使用proguard时,我遇到了这个崩溃

    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

这可能是因为AAPT尚未为导航组件生成保留规则?

我知道Proguard和R8应该保留库类的所有子类,但在这种情况下,片段类似乎丢失了。这个保留规则解决了我的问题,但从技术上讲,我们根本不需要这个规则

-keep class*扩展了android.support.v4.app.Fragment{}

如果您使用的是AndroidX,那么请使用以下规则:
-keep class*扩展AndroidX.fragment.app.fragment{}

如果在导航XML中使用
argType
,还需要引用类的规则,例如:
-keep class com.example.model.MyModel
。或者更好的方法是,按照。

-keepnames类*扩展了android.os.Parcelable
-keepnames类*扩展了java.io.Serializable

确实面临同样的问题。上面的答案给了我正确的研究方向。 据


我的问题是我在布局上使用了片段名称。在R8之后,名称会被混淆,从而导致问题


自从Android Gradle插件4.1以来,这是固定的

无需为
android:name
属性中定义的片段定义Proguard规则


请参见

这是一个已知的问题,但如果您能够确保在用户可见的环境中跟踪它,则会有所帮助location@ianhanniballake这是它的bug报告,带有一个复制问题的示例项目,谢谢Kayvan!我已经为此挣扎了一段时间:/。我修改了我的proguard,使其看起来像这样
-keep class com.example.myapp.**扩展了android.support.v4.app.Fragment{}
,使其更具体一点这实际上是一个非常糟糕的选择,无法让Fragment类的子类避免proguard混淆。相反,请查看片段所需的数据类型/模型,不要尝试序列化整个片段,因为它的生命周期是有限的,可以有许多不同的状态,但当前视图(例如片段)的状态必须由独立的类存储和处理,如ViewModel sThank you,以获取答案。我试图只保留导航功能,但它不起作用。你知道我可能需要保留一些依赖片段吗?我不想保留所有的碎片,这不是太多了吗?只需添加
-keepnames类androidx.navigation.fragment.NavHostFragment
我有runtimeException,只需添加
-keepnames类*扩展android.os.Parcelable
-keepnames类*扩展java.io.Serializable
就可以了。提问时请提供适当的标签。标记是一个关键字或标签,用于将您的问题与其他类似问题分类。使用正确的标记可以让其他人更容易找到和回答您的问题。如果我通过Args传递布尔值呢?在我尝试测试发布版本时节省了我很多时间谢谢@rodrigo.lourenco!像其他答案所建议的那样保留所有片段类对我来说太难了,有了这个小小的保留规则,它就可以正常工作了。你应该得到更多的升级投票。这可以在调试版本中测试吗?@IgorGanapolsky我想是的,你可以有一个模糊的调试版本。但是,如果您确实在尝试调试,那么请做好准备,因为一步一步的调试将无处不在。
-keep class * extends android.support.v4.app.Fragment{} <-this is not needed 
-keepnames class com.your.package.models.*
#-------------------------------------------------
# JetPack Navigation
# This fixes: Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment androidx.navigation.fragment.NavHostFragment: make sure class name exists
#-------------------------------------------------
-keepnames class androidx.navigation.fragment.NavHostFragment