android.app.Fragment$InstantiationException异常的解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011386173/article/details/84667321

可编译通过,但是运行的时候就crash。

异常堆栈:

(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: Process: com.android.settings, PID: 3202
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.settings/com.android.settings.SubSettings}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.test.settings.wifi.tether.WifiTetherUserListSettingsConnected: make sure class name exists, is public, and has an empty constructor that is public
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:106)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:193)
(181130_17:03:40.550)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6669)
(181130_17:03:40.551)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
(181130_17:03:40.607)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.test.settings.wifi.tether.WifiTetherUserListSettingsConnected: make sure class name exists, is public, and has an empty constructor that is public
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.Fragment.instantiate(Fragment.java:538)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at com.android.settings.SettingsActivity.switchToFragment(SettingsActivity.java:589)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at com.android.settings.SettingsActivity.launchSettingFragment(SettingsActivity.java:389)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at com.android.settings.SettingsActivity.onCreate(SettingsActivity.java:293)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7136)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7127)
(181130_17:03:40.617)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	... 11 more
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.test.settings.wifi.tether.WifiTetherUserListSettingsConnected" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.android.settings-knknGRqBuThyYHYFLtJtgg==/base.apk"],nativeLibraryDirectories=[/data/app/com.android.settings-knknGRqBuThyYHYFLtJtgg==/lib/arm64, /system/lib64]]
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at dalvk.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	at android.app.Fragment.instantiate(Fragment.java:524)
(181130_17:03:40.618)11-29 15:48:54.149  3202  3202 E AndroidRuntime: 	... 18 more

可以看到,根本原因是fragment中出现的异常:

E AndroidRuntime: Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.test.settings.wifi.tether.WifiTetherUserListSettingsConnected: make sure class name exists, is public, and has an empty constructor that is public
E AndroidRuntime: 	at android.app.Fragment.instantiate(Fragment.java:538)
E AndroidRuntime: 	at com.android.settings.SettingsActivity.switchToFragment(SettingsActivity.java:589)
E AndroidRuntime: 	at com.android.settings.SettingsActivity.launchSettingFragment(SettingsActivity.java:389)
E AndroidRuntime: 	at com.android.settings.SettingsActivity.onCreate(SettingsActivity.java:293)
E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7136)
E AndroidRuntime: 	at android.app.Activity.performCreate(Activity.java:7127)
E AndroidRuntime: 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
E AndroidRuntime: 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)

查看这个异常中涉及到的Fragment:

明明异常中的条件都满足:public class,has empty constructor that is public。

但是还是报错了。

根据堆栈信息其实可以看到是在类加载的时候出现了异常,反射没有起作用。

根据https://www.tuicool.com/articles/nU7bAz分析的原因:代码混淆。

解决方案:修改setting模块下的proguard.flags文件,引入出现异常的Fragment所在的类包。

如:

 -keep class com.test.settings.wifi.tether.WifiTetherUserListSettingsConnected

本项目中,在原生的setting下进行修改。参考原生的包含方式,修改如下:

然后再编译运行,就OK了。

猜你喜欢

转载自blog.csdn.net/u011386173/article/details/84667321