【问题标题】:Create Plugins/Add-ons/Extentions in separate Apk for an App在单独的 Apk 中为应用创建插件/附加组件/扩展
【发布时间】:2018-04-02 15:35:39
【问题描述】:

我应该创建一个具有基本功能的“容器”应用程序。

在“Container”应用中,我有一个 NavigationView(项目是根据安装的插件动态添加的)和一个 FrameLayout。

在一个单独的 apk 中,我应该创建一个插件,以我自己的视图向我的应用程序添加功能。

问题是:如何在 Plugins 应用中创建带有 View 的 Fragment 并将它们移动到 Context 应用的 FrameLayout。

这里有两张图片可以更好地解释这种情况

有人有示例代码吗?链接到教程?或者告诉我该怎么做?

我尝试创建一个 AIDL 用于进程之间的通信,但只传递原始数据,不允许传递:对象、资源、图像等。

【问题讨论】:

  • 您想要的通常不可能以安全的方式进行。欢迎您让插件向“容器”应用提供 RemoteViews,就像应用小部件通过 AppWidgetManager 向主屏幕提供 RemoteViews 一样。

标签: android plugins view apk add-on


【解决方案1】:

有可能,当您尝试加载 apk 时需要两件事:dex 代码和资源。

使用 dex 代码,你可以做的就是修改当前上下文的默认 ClassLoader。为每个插件添加单独的ClassLoader,并将它们放入上下文的ClassLoader,并修改上下文的ClassLoader的findClass方法,使其首先从插件的ClassLoader中找到类,如果找不到则回退到传统的ClassLoader方式。我认为PathClassLoader会解决问题,你要做的就是通过插件的文件路径传递给它。

有了资源,你需要做的是从 Resources 类中获取旧的 AssetManager,并通过反射调用 addAssetPath,并将插件的 apk 路径传递给它。

完成这两个步骤后,您将拥有一个插件,并且其所有类和资源的运行方式与常规应用没有太大区别。

ps:请注意,要让它在不同的系统版本和不同的自定义 rom 上正常工作还有很多工作要做,这两个步骤不会让你从插件添加新的活动/服务/广播/提供者,因为你需要将它们注册到SystemServer,这是受系统限制的,我认为没有root是没有办法的。

---------------我是分隔符---------------- ------------

如果您的应用能够运行可从 Internet 下载的代码,play-store 将不允许您的应用发布。因为不能保证这些代码会从某人的手机中收集私人数据,或者做任何非法的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多