【问题标题】:How to run external, downloaded yet not installed apps on Android?如何在 Android 上运行外部、已下载但尚未安装的应用程序?
【发布时间】:2013-06-08 05:25:43
【问题描述】:

我只是好奇:

一些应用程序,通常是为开发人员提供的,允许下载其他示例应用程序并在不安装示例应用程序的情况下执行它们。

这种应用的一个例子是酷的“DevAppsDirect”应用(强烈推荐它顺便说一句)。

我的问题是:

此类应用程序如何工作?

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

这样的东西可能对需要插件和扩展的应用程序很有用,也许还有其他我想不到的想法。

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

【问题讨论】:

  • 你对这个问题有什么明确的发现吗?有进一步调查吗?
  • @VishalVyas 只有线索。如果您愿意,可以联系 DevAppDirect 并向他们索要 SDK。也许他们会接受。
  • @androiddeveloper 你找到方法了吗?
  • @ShashankSrivastava 不。我只是对此感兴趣,而且是很久以前的事了。对不起。知道如何做好它仍然很有趣。

标签: android plugins installation apk


【解决方案1】:

我已经与 devAppsDirect(网站here)的开发者进行了交谈,他是这样写的:

DevAppsDirect 背后的技术称为 inAppSquared (www.inAppSquared.com)。简而言之,inAppSquared 允许您 将 Android 应用程序变成插件。这仅使用 公开可用的 Android API,不涉及疯狂的黑客攻击。

我通过使用 Xamarin 相同的方式创建一个新的移动平台来做到这一点 Titanium 是移动平台。区别在于AppSquared有 与 Android API 相同的 API,并且一旦将应用程序移植到 inAppSquared 无需安装即可运行。

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

【讨论】:

    【解决方案2】:

    似乎 DevAppsDirect 使用了名为“Launcher”的 Android 开源项目的一部分,我猜他们采用了操作系统的这一部分并对其进行了调整,以便他们可以将其包含在自己的应用程序中以从库作为演示。

    Launcher 负责手机的主屏幕,启动其他应用程序,托管小部件等。

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

    【讨论】:

    • 很酷,但是有没有做过的图书馆?这是第一步,要理解这么大的代码并只取所需的东西是非常困难的。
    • 嗯……这正是 DevAppsDirect 应用程序的价值……我认为他们没有使用现有的库来做到这一点,他们可能自己调整了它,你可能需要弄清楚通过浏览 Launcher 的代码并通过反复试验找出自己...您还可以看看 Cyanogenmod,他们还破解了 Launcher,他们的所有代码都在 github (github.com/CyanogenMod) 中。
    【解决方案3】:

    您应该尝试使用 Manifest Viewer 查看 DevAppsDirect 的 AndroidManifest.xml。遗憾的是,该应用程序没有导出清单的选项。粗略一看,我认为他实际上并没有安装列表中显示的应用程序。你应该看看。

    【讨论】:

    • 他没有,我写过他没有安装应用程序。他以某种方式提取了所需的内容,然后启动它。
    【解决方案4】:

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

    • 如果您的服务器中有一个 apk,您可以从您的应用程序中下载它
    • 现在您可以使用 zip 实用程序解压缩到您自己的应用程序私有内存中
    • 解析 Manifest 文件以确定主要活动
    • 接下来您可以使用ClassLoaderDexClassLoader 来动态加载活动。

    我相信这就是 DevAppsDirect 中发生的事情

    【讨论】:

    • 你如何做最后两个步骤(解析清单和使用加载器)?我什至不认为清单是可读的格式......即使在这之后,你如何使用加载器?
    • 有很多实用程序可以提取 apk,您可以完整查看 Manifest 文件。例如 dex2Jar、apktool 等。您可以在应用程序本身中使用 jar。并加载dex文件,File file = new File("/data/data/com.android.myapp/otherapp/classes.dex"); DexFile appDexFile = new DexFile(file);
    • 你在安卓平台上试过这个解决方案吗?成功了吗?
    • 从第 2 步开始,它涉及集成 un-dex 实用程序。我知道您可以从 Android 运行 Java 程序(只要 Android 支持这些库),可能值得走这条路。 undex 操作的结果是另一个 jar 文件。
    • 是的,这里的挑战不是取消索引,它几乎是可行的。我猜类加载器的事情很简单。文件 dir1 = getDir("dex", 0); DexClassLoader classLoader = new DexClassLoader(dexpath, dir1.getAbsolutePath(), null, getClass().getClassLoader()); Class myClass = (Class) Class.forName("com.myapp.MainClass");对象 myInstance = myClass.newInstance();方法 myMethod = myClass.getMethod("onCreate"); doSomething.invoke(myInstance)
    【解决方案5】:

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

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

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

    【讨论】:

    • 这看起来很有希望,但你能展示一些示例代码吗?例如,假设我已经将一个 apk 文件下载到内部/外部存储中,接下来我应该怎么做才能在其中启动应用程序?
    • @androiddeveloper: "假设我已经下载了一个 apk 文件到内部/外部存储,接下来我应该怎么做才能在其中启动应用程序?" ——这是不可能的。
    • @CommonsWare 是正确的。 PackageManager 不知道您的侧载类,因此它无法启动它们。根据 DevAppsDirect,他们的“技术在 DevAppsDirect 应用程序中创建了一个模拟的 Android 环境。”。我假设这意味着他们以某种方式手动调用生命周期函数(onCreate 等),而不是依赖 Android 启动应用程序
    • 不,我已经调查过了。根据他们私有应用存储的内容,他们下载一个apk并得到一个dex文件。因为我可以看到该任务是 android 设备上的新任务,它以某种方式作为不同的应用程序运行。它没有安装,但它以某种方式运行。我也认为它与应用程序本身共享相同的文件夹。
    • DevAppsDirect 开发人员很棒,他的应用程序也很棒,但他也试图让自己听起来像是在使用某种秘密的神秘酱汁。他能够以相同的基础应用程序包名称、相同的 SharedUserId、与他的启动应用程序相同的权限重新打包应用程序,并且他每次都必须使用相同的开发人员密钥对应用程序进行签名。这只有在您首先可以访问源代码的情况下才有可能,例如开源应用程序,或者所有来自同一家公司发布的应用程序,这些应用程序对您的源代码足够信任。
    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2015-07-12
    • 1970-01-01
    • 2013-04-01
    • 2015-10-17
    • 2011-09-17
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多