【发布时间】:2017-04-29 01:59:34
【问题描述】:
好的,所以我有一个 Android 应用程序,我开始为该应用程序创建一个插件系统,以便开发人员可以编写内容提供程序,然后该应用程序可以使用这些内容提供程序来生成不同的内容,我不会完成整个过程,但一切正常,就像所以:
1)
我创建了一个名为com.myaddonlib 的库,我在我的项目中导入了这个库,其中有一个接口和不同的对象。
2)
现在开发人员可以在他的端创建一个简单的 Java 项目,导入库com.myaddonlib,并在他的主类上实现接口,该接口具有从库返回不同对象的方法。
3) 回到 android 应用程序,我可以加载开发人员创建的 .jar 文件(在将 classes.dex 添加到 jar 文件之后),使用 android DexClassLoader 我可以像这样加载实现的接口:
DexClassLoader classloader = new DexClassLoader(jarFilePath, tempDirectory, null, context.getClass().getClassLoader());
Class classToLoad = classloader.loadClass("com.apackage.Addon");
其中Addon 是插件开发人员创建的类,它实现了位于名为com.apackage 的包中的库中的接口。
然后,我可以将库 com.myaddonlib 中的接口转换为 classToLoad 的新实例,并调用插件开发人员实现的函数。
现在的问题是我决定更新插件库并从类中删除其中一个变量,这意味着插件的类现在与更新后的库中的类(在应用程序中使用)不同。即使未使用更改的变量,也会导致应用程序崩溃而没有任何错误。只是两个类不同的事实(即使唯一的区别只是缺少变量)会导致某些故障。现在这不是一个容易解释的过程,所以我会理解,鉴于我的英语不好,有些人难以理解。 我的问题是我需要知道如何避免由于两端之一库的更改而导致的崩溃。还有java在这种情况下是如何处理对象变化的
【问题讨论】:
-
假设插件更新是在运行时完成的,Android Studio 的即时运行解决了类似的问题。尝试阅读有关它的更多信息,例如here。
-
@Alex Instant run 是据我所知的开发工具,不能在生产中使用,我什至怀疑它应该,我说的是在单独的 .dex 文件中加载插件,如上所述,根据加载的插件重写应用程序 dex 在我看来是一个很大的安全风险
-
我并不是说即时运行是解决您上述问题的方法。我只是说即时运行解决了在运行时重新加载类的问题,这与您正在寻找的类似(据我所知) - 通过查看它的工作原理,您希望能够获取构建您自己的解决方案的想法。
-
@Alex 是的,我明白你的意思,谢谢你的提议,但问题是我已经设法完成了所有事情,唯一导致问题的部分是插件 dex 有一份android 项目中的类,如果其中任何一个有差异,则会导致问题。
-
您是否有机会提供一个简单的示例来说明您的问题(初始 apk、插件 dex 和修改后的 apk)?不需要完整的解决方案,只需相关部分即可。
标签: java android reflection dex