android-DexClassLoader,重新加载代码失败与信号7

android-DexClassLoader,重新加载代码失败与信号7,第1张

概述我正在尝试构建一个插件系统,其中DexClassLoader正在从其他安装的包含片段(我的插件)的apk中获取代码,并在主机中显示它们.这工作得很好.我还希望使插件可热插拔,这意味着我可以从插件更改代码,重新安装它,主机会注意到并加载新代码.如果我是第一次更改代码,这也可以.(尽管我认为

我正在尝试构建一个插件系统,其中DexClassLoader正在从其他安装的包含片段(我的插件)的apk中获取代码,并在主机中显示它们.这工作得很好.

我还希望使插件可热插拔,这意味着我可以从插件更改代码,重新安装它,主机会注意到并加载新代码.如果我是第一次更改代码,这也可以. (尽管我认为不应这样做,但似乎我对这段代码有错误的理解:

try { requiredClass = Class.forname(fullname); } catch(ClassNotFoundException e) { isLoaded = false; }

)

如果我第二次尝试使用相同的插件,则主机将在requiredClass = classLoader.loadClass(fullname);下关闭.用类似的东西

libc Fatal signal 7 (SIGBUS) at 0x596ed4d6 (code=2), thread 28814
(ctivityapp.host)

是否有人对DexClassLoader的功能有更深入的了解,并且可以告诉我,这里发生了什么?我对此很困惑.

这是加载外部代码的方法的完整代码:

     /**     * takes the name of a package as String, and trIEs to load the code from the corresponding akp using DexclassLaoder.      * Checking if a package is a valID plugin must be done before calling this.      * The Plugin must contain a public class UI that extends Fragment and implements plugin as a starting point for loading     * @param packagename The full name of the package, as String     * @return the plugins object if loaded, null otherwise     */    private Plugin attachPluginToHost(String packagename) {        try {            Class<?> requiredClass = null;            final ApplicationInfo info = context.getPackageManager().getApplicationInfo(packagename,0);            final String apkPath = info.sourceDir;            final file dexTemp = context.getDir("temp_folder", 0);            final String fullname = packagename + ".UI";            boolean isLoaded = true;            // Check if class loaded            try {                requiredClass = Class.forname(fullname);            } catch(ClassNotFoundException e) {                isLoaded = false;            }            if (!isLoaded) {                final DexClassLoader classLoader = new DexClassLoader(apkPath, dexTemp.getabsolutePath(), null, context.getApplicationContext().getClassLoader());                requiredClass = classLoader.loadClass(fullname);            }            if (null != requiredClass) {               // Try to cast to required interface to ensure that it's can be cast                final Plugin plugin = Plugin.class.cast(requiredClass.newInstance());                installedplugins.put(plugin.getname(), plugin);                return plugin;            }            } catch (PackageManager.nameNotFoundException e) {                e.printstacktrace();            } catch (ClassNotFoundException e) {                e.printstacktrace();            } catch (InstantiationException e) {                e.printstacktrace();            } catch (illegalaccessexception e) {                e.printstacktrace();            }            return null;    }

提前谢谢了!

解决方法:

并不是说它真的很重要(因为没有人真正在查看它),或者我什至不了解发生了什么,但是在重新加载插件之前删除dexTemp.getabsolutePath()中的插件对应文件即可解决问题.

PS:风滚草徽章,是的!

总结

以上是内存溢出为你收集整理的android-DexClassLoader,重新加载代码失败与信号7全部内容,希望文章能够帮你解决android-DexClassLoader,重新加载代码失败与信号7所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1079365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存