2013-06-12 38 views
15

我只是好奇:如何在Android上运行外部下载但未安装的应用程序?

一些应用程序,通常为开发人员,允许下载其他示例应用程序,并执行示例应用程序,而无需安装它们。

这样的应用程序的一个例子是很酷的“DevAppsDirect”应用程序(强烈推荐它BTW)。

我的问题是:

这样的应用程序如何工作?

我的意思是,他们是否下载APK?他们如何跳过安装阶段并以某种方式运行下载的应用程序?他们以某种方式合并下载的内容?它是否就像一个插件?

这样的事情对于需要插件和扩展的应用程序可能是有用的,也可能是我想不到的其他想法。

我也想知道其他应用程序如何使用插件机制。许多应用程序允许通过Play商店下载其他插件应用程序。他们以某种方式在其他apk文件中运行一些代码?他们甚至可以达到其他apk文件吗?有没有办法告诉android哪些应用可以访问我的apk文件?

+0

您是否在这个问题上得到了明确的发现?任何进一步的调查 –

+0

@VishalVyas只有线索。如果你愿意,你可以联系DevAppDirect并要求他们提供SDK。也许他们会接受。 –

+0

@androiddeveloper你找到了解决问题的方法吗? –

回答

8

您可以使用Android的类加载器(在这种情况下可能是PathClassLoader)在运行时动态加载类,而无需安装它们。

看看例如https://github.com/Rookery/AndroidDynamicLoader看看如何实现。

插件apk可能甚至不需要复杂的东西,但可以通过Intents发送到导出的活动并发回结果进行通信。您可以使用PackageManager(http://developer.android.com/reference/android/content/pm/PackageManager.html)查询哪些意图活动已注册。

+1

这看起来确实很有希望,但是您能否请您展示一些示例代码?例如,假设我已经下载了一个apk文件到内部/外部存储器,我应该怎么做才能在其中启动应用程序? –

+1

@androiddeveloper:“假设我已经下载了一个apk文件到内部/外部存储器,接下来我应该怎么做才能在其中启动应用程序?” - 这是不可能的。 – CommonsWare

+1

@CommonsWare是正确的。 PackageManager不知道你的sideloaded类,所以它不能启动它们。 根据DevAppsDirect,他们的“技术在DevAppsDirect应用程序内创建了一个模拟的Android环境。”。我假设这意味着他们以某种方式手动调用生命周期函数(onCreate等),而不是依靠Android启动应用 – Neiti01

2

非常有趣!我认为这是可行的,你自己并没有尝试过。

  • 如果你在你的服务器的APK,您可以从您的应用程序
  • 现在你可以使用压缩实用程序解压到你自己的应用程序了私有内存
  • 解析清单文件,以确定主下载活动
  • 接下来,您可以使用ClassLoaderDexClassLoader来动态加载活动。

我相信这是什么DevAppsDirect

+0

你如何做最后2个步骤(解析清单和使用装载机)?我甚至不认为清单是可读的格式......即使在这之后,你如何使用装载机? –

+0

有很多实用工具会提取apk,你可以完整地查看Manifest文件。例如dex2Jar,apktool等。您可以在应用程序本身中使用jar。 并加载dex文件,File file = new File(“/ data/data/com.android.myapp/otherapp/classes.dex”); DexFile appDexFile = new DexFile(file); – blganesh101

+0

你有没有在android平台上尝试过这个解决方案?它工作?步骤2之后的 –

1

的推移,你应该尝试使用Manifest Viewer检查出DevAppsDirect的AndroidManifest.xml中。可悲的是,该应用程序没有选项来导出清单。匆匆一瞥,我不认为他实际上正在安装列表中显示的应用程序。你应该看看。

+0

他没有,我写道他没有安装该应用程序。不知何故,他提取了需要的东西,然后启动它。 –

1

看来DevAppsDirect使用了一个名为“Launcher”的Android开放源代码项目的一部分,我的猜测是他们将操作系统的这一部分进行了调整,以便它们可以将它包含在自己的应用程序中,作为Demo的图书馆。

启动器负责电话的主屏幕,启动其他应用程序,托管窗口小部件等。

您可以在这里获得Android开源项目的副本:http://source.android.com/source/downloading.html并查看com.android.launcher包。

+0

很酷,但有没有任何图书馆做到了?这是第一步,并且很难理解如此庞大的代码并只采用所需的代码。 –

+0

嗯......这正是DevAppsDirect应用程序的价值......我不认为他们使用了现有的库,他们可能自己调整了它,你可能必须通过浏览Launcher的代码自己弄清楚它自己并通过试验和错误...你也可以看看Cyanogenmod,他们也破解了Launcher,他们的所有代码都在github中(https://github.com/CyanogenMod)。 –

6

我已经与devAppsDirect(网站here)的开发者聊过,和这里的什么,他写道:

背后DevAppsDirect该技术被称为inAppSquared (www.inAppSquared.com)。简而言之,在AppSquared中,您可以将一个Android应用转换为插件。这只使用公开可用的Android API完成,不涉及任何疯狂的黑客行为。

我通过创建一个新的新移动平台来做到这一点,就像Xamarin 和Titanium是移动平台一样。差异在于AppSquared的 与Android API具有相同的API,并且一旦将应用移植到 的应用内,它可以在未安装的情况下运行。

这项技术有很多可能性。您提到了 插件和扩展,但它也可用于App Discovery, 广告,订阅服务,A/B测试,bug修复以及更多 。

相关问题