【问题标题】:Plugin system with DexClassLoader() and user interface带有 DexClassLoader() 和用户界面的插件系统
【发布时间】:2017-11-07 22:56:11
【问题描述】:

对于一个长期的学生项目,我正在尝试开发一个带有插件的模块化应用程序。具体来说,我们会:

  • 一个主应用程序,我们可以在其中搜索、更新、删除和运行插件。这个主应用程序还会存储来自插件的一些数据。

  • 从 HTTP 服务器下载的几个插件,带有代码和 GUI 组件。

现在,我有一个主应用程序,它能够从 HTTP 下载一个 .apk 文件,并从这个 .apk 文件中定义的类创建一个新实例。我使用这里描述的方式:http://android-developers.blogspot.fr/2011/07/custom-class-loading-in-dalvik.html 和 DexClassLoader() 方法。

但我看不到如何显示作为资源存储在插件 .apk 文件中的布局(或任何其他 GUI 组件)。例如,我尝试使用插件类名从主应用程序创建一个 Intent,但没有成功:

DexClassLoader cl = new DexClassLoader(...);
Class<?> libClass = cl.loadClass("plugin_classname");
Intent intent = new Intent(this.getApplicationContext(), libClass);
startActivity(intent);

这不起作用,因为 Intent 没有在主应用程序的 AndroidManifest.xml 中声明。这在另一个线程中也有描述:Android- Using DexClassLoader to load apk file

这是否意味着绝对没有办法构建这样一个“动态”用户界面?更一般地说,这种类型的插件系统可以在Android上完成吗?我应该尝试其他方法吗?

【问题讨论】:

  • 与其使 Activity 动态化,不如始终使用相同的 Activity 并使用 DexClassLoader 来加载片段。
  • 你是如何打造你的plugin.jar。实现接口的jar?我有一个由 Eclipse 构建的带有 classes.dex 条目的 jar,但 loadClass 总是抛出异常。

标签: android dexclassloader


【解决方案1】:

我曾经尝试过同样的事情,发现不可能。如果从那时起(2011年1月)基本机制没有改变,仍然是不可能的。技术细节在我的博客中用日语和英语进行了描述。

博客:动态添加AndroidManifest.xml中未声明的Activity(不可能)
http://darutk-oboegaki.blogspot.jp/2011/01/androidmanifestxml-activity.html

【讨论】:

    【解决方案2】:

    看到这个答案。讲的是如何在运行时动态运行Android的'Activity'、'Service',在AndroidManifest.xml中没有声明,运行时:https://stackoverflow.com/a/41112682/2801776

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多