【问题标题】:Allow others to develop plugins for my app允许其他人为我的应用开发插件
【发布时间】:2014-11-17 16:59:08
【问题描述】:

我正在开发a home screen replacement for Android,并在应用程序抽屉中提供搜索功能。我不仅希望允许(而不是强制)用户搜索已安装的应用程序,还希望允许(而不是强制)用户搜索其他内容,例如 Stack Overflow、Wikipedia 或他们的本地文件。

目前我正在自己开发这些所谓的“镜头”,但我认为如果其他人也能开发它们,那将是一个很酷的想法。所以我想知道是否有任何方法可以让其他开发人员做到这一点;为我的应用开发更多镜头。

所有镜头都应该继承自以下类;

Lens.java

public abstract class Lens
{
    protected Context context;

    protected Lens (Context context)
    {
        this.context = context;
    }

    public abstract List<LensSearchResult> search (String str) throws IOException, JSONException;

    public abstract String getName ();

    public abstract String getDescription ();

    public void onClick (String url)
    {
        if (url.startsWith ("http://") || url.startsWith ("https://"))
        {
            Intent intent = new Intent (Intent.ACTION_VIEW);
            intent.setData (Uri.parse (url));

            this.context.startActivity (intent);
        }
        else
        {
            throw new UnsupportedOperationException ();
        }
    }

    public void onLongPress (String url)
    {
    }

    protected String downloadStr (String url) throws IOException, JSONException
    {
        // Not important. Provided for convenience.
    }

    protected Drawable downloadImage (String url) throws IOException, JSONException
    {
        // Not important. Provided for convenience.
    }
}

开发人员应将Context 从其构造函数传递给超类,实现List&lt;LensSearchResult&gt; search (String str)String getName ()String getDescription ()。如果我们谈论的是一个 URL,这就是他们需要做的所有事情。否则他们也应该覆盖void onClick (String url),如果他们愿意这样做void onLongPress (String url)
这基本上就是“镜头”的组成部分。

那么我必须做些什么(如果可能的话)才能让其他开发人员能够为我的应用创建“镜头”?理想情况下,他们可以将它们分发到例如 Google Play 商店,但如有必要,我可以开发自己的平台,其他人可以上传他们的镜头。无论哪种方式,我仍然需要某种方式从我的应用程序中运行其他人的代码。

【问题讨论】:

  • “无论哪种方式,我仍然需要一些方法来从我的应用程序中运行其他人的代码”——如果你有任何意义的话。否则,您将成为恶意软件的载体。
  • @CommonsWare 我确实计划实施某种“信任列表”来解决这个问题,但最后,这与用户从 Play 商店安装应用程序有什么不同吗?
  • "这与用户从 Play 商店安装应用程序有什么不同吗?" - 是的,因为应用程序在单独的进程中运行。您当前的 API 不是围绕 IPC 设计的,并且似乎旨在尝试让第三方代码在您自己的进程中运行,这是一个安全漏洞。
  • @CommonsWare Dashclock 做了类似的事情。用户只需安装另一个“扩展”应用程序。该应用程序本身是开源的,因此这可能是一个不错的起点。
  • @NiekHaarman:“Dashclock 做了类似的事情”——使用为 IPC 设计的 API,不需要扩展魔法类等。如果有人想为第三方提供方便的 JAR开发者使用,这很好,但底层协议需要为 IPC 设计和实现。

标签: java android plugins


【解决方案1】:

如果您能想到更好的方法(也许就像 DashClock 所做的那样),我会全力以赴 :)

围绕 IPC 设计您的 API。让第三方插件实现您的主机应用程序使用的ServiceContentProvider 和/或BroadcastReceiver。虽然使用 AIDL 的绑定服务似乎是将现有 API 转换为使用 IPC 的最自然的方式,但插件的绑定服务有各种各样的问题(例如,API 版本控制),随着时间的推移处理起来很麻烦。

在您自己的应用程序中,您可以将低级 IPC 管道封装在一些类似于您现有 API 的类中。如果你想让第三方开发者使用你发布的一些库来让他们创建他们的插件,你也可以这样做。您需要自己创建一些插件,以测试您的 API 并为第三方开发人员提供示例。

鉴于所有这些,您可以通过多种方式发现插件何时安装和删除。例如,ACTION_PACKAGE_ADDEDACTION_PACKAGE_REMOVED 广播可以告诉您何时添加和删除其他应用程序。然后,您可以使用PackageManager 来查看它们是否是您的插件之一(例如,它们是否实现了您的 IPC 端点?)。或者,使用PackageManager 上的方法(如queryIntentServices())来轮询插件实现,如果这样更有意义的话。

【讨论】:

  • 谢谢!这至少让我知道在哪里看:)
  • @RobinJ:编写插件架构很复杂——可以写一本关于这个主题的短书。可能有很多肮脏的细节,例如插件生命周期、安全性(例如,防止其他应用程序欺骗对插件的调用)、处理旧插件/新主机(或新插件/旧主机)等等。我不是说“不要写它”,而是确保你有一个明确的理由来写它,你觉得相当有信心会让它值得工程努力。
  • Erm...我这样做主要是因为挑战:) 我仍在学习 Android 开发(您的书对这方面有很大帮助)。
  • @RobinJ:如果你有我的书,我有一个关于插件的章节,从本书 6.2 版(几小时前发布)的第 2287 页开始。
  • 太棒了!我去下载新版本看看! :)
【解决方案2】:

使用插件的实际应用程序可能会给您一些想法。这是使用它们的应用程序的插件开发者页面:

http://www.twofortyfouram.com/developer

【讨论】:

    猜你喜欢
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多