android - 从 sd 卡中的库加载片段时,Android 系统无法在活动娱乐时找到片段?
问题描述
我已经从外部库中加载了一个片段,成功地在 sd 卡中可用,但是当 android 系统重新创建活动时,我的应用程序崩溃,因为 android 系统无法找到外部库中可用的片段类。
从外部 apk 加载片段的代码。
final String libPath = Environment.getExternalStorageDirectory() + "/lib.apk";
final File tmpDir = getDir("dex", 0);
final File tmpDir1 = new File(libPath);
Log.d(TAG, ""+tmpDir1.exists());
final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
final Class<Fragment> classToLoad = (Class<Fragment>) classloader.loadClass("com.example.sujeetkumarsinha.librarycode2.MyFragment");
错误代码
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sujeetkumarsinha.dynamic_code_run/com.example.sujeetkumarsinha.myapplication.MainActivity}: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.sujeetkumarsinha.librarycode2.MyFragment: make sure class name exists, is public, and has an empty constructor that is public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2678)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2743)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4560)
at android.app.ActivityThread.-wrap19(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment com.example.sujeetkumarsinha.librarycode2.MyFragment: make sure class name exists, is public, and has an empty constructor that is public
at android.support.v4.app.Fragment.instantiate(Fragment.java:449)
at android.support.v4.app.FragmentContainer.instantiate(FragmentContainer.java:33)
at android.support.v4.app.FragmentState.instantiate(Fragment.java:110)
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:2940)
at android.support.v4.app.FragmentController.restoreAllState(FragmentController.java:149)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:287)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:85)
at com.example.sujeetkumarsinha.myapplication.MainActivity.onCreate(MainActivity.java:26)
at android.app.Activity.performCreate(Activity.java:6687)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2631)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2743)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4560)
at android.app.ActivityThread.-wrap19(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.example.sujeetkumarsinha.librarycode2.MyFragment" on path: DexPathList[[zip file "/data/app/com.example.sujeetkumarsinha.dynamic_code_run-1/base.apk"],nativeLibraryDirectories=[/data/app/com.example.sujeetkumarsinha.dynamic_code_run-1/lib/arm, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at android.support.v4.app.Fragment.instantiate(Fragment.java:439)
at android.support.v4.app.FragmentContainer.instantiate(FragmentContainer.java:33)
at android.support.v4.app.FragmentState.instantiate(Fragment.java:110)
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:2940)
at android.support.v4.app.FragmentController.restoreAllState(FragmentController.java:149)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:287)
at android.support.v7.app.AppCompatActivity.onCreate(AppCompatActivity.java:85)
at com.example.sujeetkumarsinha.myapplication.MainActivity.onCreate(MainActivity.java:26)
at android.app.Activity.performCreate(Activity.java:6687)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1140)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2631)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2743)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4560)
at android.app.ActivityThread.-wrap19(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1496)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6165)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:888)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:778)
解决方案
推荐阅读
- java - 如何让 maven 使用已安装的 java 创建 jar 文件?
- flutter - Flutter:如何保存数据来自提供者列表中的数据库(未来)
- php - 为什么我无法在我的 Wordpress 单一自定义帖子类型模板中访问 $post 数据?
- cross-compiling - 无法使用 armv8-rpi4-linux-gnueabihf-gcc 编译 u-boot
- android - 如何在 Android 11 上获得持久文件夹权限?
- lua - ROBLOX LUA(u) 检查函数的参数
- laravel - Laravel 插入后一对多结果为空
- node.js - 如何从集合中获取指定信息
- shiboken2 - 无法识别 shiboken 版本 (5.15.2)
- c# - 如何在内容页面中将 Listview 与变量绑定