【问题标题】:Split Android app in two parts将 Android 应用分成两部分
【发布时间】:2017-02-01 06:10:32
【问题描述】:

我试图了解是否可以将 Android 应用拆分为两部分(从一个 APK 安装)。我对此进行了研究,以将一部分安装在设备内存上,另一部分安装在 SD-CARD 上。这两部分是一体的,不应单独安装。

注意:我不仅需要分离资源,还需要分离活动,所以APK Expansion Files不是解决方案,因为不提供这样的功能。

【问题讨论】:

  • “单独安装”是什么意思?我想你有一些资源(如图像、视频)要安装在 SD 卡中以解决内存问题,对吧?或者你是什么意思?
  • 我的意思是对于设备,这两个部分应该一起安装/移除。我正在考虑的应用程序有一部分我希望始终可用(安装在设备内存上)和一部分用户可能通过移除 SD 卡使其不可用(临时)。此外,当用户决定将应用程序移入或移出 SD 卡时,我希望安装在设备内存中的部分应始终保留在那里。
  • 这在单个应用程序中是不可能的。但是您应该可以使用 2 个单独的应用程序来做到这一点。

标签: android android-install-apk


【解决方案1】:

我认为这是可能的。您可以尝试以下方法吗?

  1. 创建两个应用程序
  2. 在第一个 APK 的 Manifest 文件中,您应该有一个 MAIN 和 LAUNCHER 类别的 Activity。这样您的应用就会在启动器列表中可见
  3. 您不应该在第二个 APK 中有任何 MAIN 和 LAUNCHER 类别的 Activity,但您知道必须打开哪个 Activity 作为第二个应用的 Launcher Activity,因为它是您自己的应用。这样,您的第二个应用将永远不会出现在启动器的应用列表中
  4. 将第二个 APK 放在第一个 APK 的 assets 文件夹中
  5. 每当您的主应用程序想要使用第二个应用程序的内容时,请从资产文件夹 (as mentioned here) 安装第二个应用程序,并在 SDCard 上设置安装位置,如下所示:android:installLocation="preferExternal",然后启动您想要的第二个应用程序活动李>

我还没有尝试过,但理论上似乎是合法的。

让我知道这是否有效。谢谢!

【讨论】:

  • 可能您首先必须在安全选项中启用 APK“来自未知来源的安装”。
  • 可能是的。但我相信这将是最接近 Louis 问题的解决方案。
【解决方案2】:

APK 扩展文件

Google Play 目前要求您的 APK 文件不超过 100MB。对于大多数应用程序来说,这为所有应用程序的代码和资产提供了充足的空间。但是,某些应用程序需要更多空间来存储高保真图形、媒体文件或其他大型资产。以前,如果您的应用程序超过 100MB,您必须在用户打开应用程序时自行托管和下载额外资源。托管和提供额外文件的成本可能很高,而且用户体验通常不太理想。为了让您更轻松地完成此过程并让用户更愉快,Google Play 允许您附加两个大型扩展文件来补充您的 APK。

Google Play 会为您的应用托管扩展文件,并将它们免费提供给设备。扩展文件保存到设备的共享存储位置(SD 卡或 USB 可安装分区;也称为“外部”存储),您的应用可以在其中访问它们。在大多数设备上,Google Play 会在下载 APK 的同时下载扩展文件,因此当用户第一次打开应用程序时,您的应用程序就会拥有所需的一切。但是,在某些情况下,您的应用程序必须在您的应用程序启动时从 Google Play 下载文件。

下载扩展文件

在大多数情况下,Google Play 会在安装或更新 APK 的同时下载您的扩展文件并将其保存到设备中。这样,当您的应用程序第一次启动时,扩展文件就可用了。但是,在某些情况下,您的应用必须通过从 Google Play 的应用程序许可服务响应中提供给您的 URL 请求它们来自行下载扩展文件。

您需要下载扩展文件的基本逻辑如下:

当您的应用程序启动时,在共享存储位置(在 Android/obb// 目录中)查找扩展文件。 如果存在扩展文件,则一切就绪,您的应用程序可以继续。 如果扩展文件不存在: 使用 Google Play 的应用程序许可执行请求,以获取应用程序的扩展文件名、大小和 URL。 使用 Google Play 提供的 URL 下载扩展文件并保存扩展文件。您必须将文件保存到共享存储位置 (Android/obb//) 并使用 Google Play 响应提供的确切文件名。

Source

【讨论】:

  • 扩展文件适用于资产,而不适用于活动等程序代码。
【解决方案3】:

您的应用可以检查 sd 卡当前是否可用(“插入”)。如果它可用,则您的应用程序可以正常工作,如果 sd 卡不可用,应用程序将自动退出/显示弹出窗口/启动不同的活动/其他。

【讨论】:

  • 如何在“搬家”过程中仅将选定的活动和服务推送到 sd 卡?
  • 对不起,我没完全理解你的句子:x
  • 来自作者评论:“我正在考虑的应用程序有一部分我希望始终可用(安装在设备内存上)和一部分用户可能通过删除使其不可用(临时) SD 卡。”
  • 每个部分都应该有自己的活动。
【解决方案4】:

是的,这是可能的。但需要注意的是,可以分别安装这两个应用程序,因为它们都应该上传到商店。你只需要使用很多意图。

您需要使用 Intent 处理两个应用之间的所有通信。这意味着,必须使用对第二个应用程序的意图来询问第一个应用程序需要的所有内容,并且未能在设备中找到另一个应用程序应该触发对 Play 商店的意图。这样,您将有两个应用程序像一个一样工作。请记住,用户仍将决定在何处安装您的应用,但正如 christian-strempfer 指出的那样,可以将 SD 卡设置为首选目标。

如果这样做的目的是节省空间,您应该使您的资源(图像、声音等)动态化。由于所有这些都只是 apk 中的文件,因此您可以轻松地将它们替换为 SD 卡中的文件。您只需将它们上传到某处并在安装应用程序后下载它们。这样,您可以提供每个资产的确切版本并在需要时将其删除。您可以了解哪些屏幕最常用,并为您较少使用的屏幕删除资产。等等。

【讨论】:

    【解决方案5】:

    您可以,但不是出于您的原因。多个 APK 只是为了确保您的应用适用于多种设备 - 而不是在内部存储器和 SD 卡之间划分其总大小。

    Multiple APK Support

    尽管我们鼓励您开发和发布一个 APK 支持尽可能多的设备配置,这样做是 有时不可能。帮助您将应用程序发布为 尽可能多的设备,Google Play 允许您发布多个 同一应用程序列表下的 APK。 Google Play 然后供应 根据配置支持将每个 APK 发送到相应的设备 您已在每个 APK 的清单文件中声明。

    通过使用多个 APK 发布您的应用程序,您可以:

    每个 APK 支持不同的 OpenGL 纹理压缩格式。

    每个 APK 支持不同的屏幕配置。

    每个 APK 支持不同的平台版本。

    目前,这些是 Google Play 唯一的设备特征 支持将多个 APK 发布为同一个应用程序。

    【讨论】:

    • 感谢您的回复,但我不是这个意思。我的应用程序有两个部分,一个应该始终可用,另一个在用户移除他的 SD-CARD 时可能不可用,然后在再次插入卡时可用。
    【解决方案6】:

    也许这就是你想要的? APK Expansion Files

    【讨论】:

      【解决方案7】:

      如果您只是在寻找一种将应用程序资源保留在外部驱动器上的方法,Harry's answer 将很有用。

      否则,无法将一个应用安装分成两部分。您可以使用 android:installLocation 清单属性来定义要安装它的位置,甚至可以强制它仅在内部安装在设备上,但没有拆分它的选项。

      替代品

      两个应用程序

      您创建两个单独的两个应用程序并检查其中任何一个的启动,如果另一个已安装。如果没有,您要求用户安装另一个并将用户转发到应用商店。

      一个应用检查外部存储

      我不知道您的用例,但从您的 cmets 看来,您正在寻找错误的解决方案。

      我正在考虑的应用程序有一部分我希望始终可用(安装在设备内存上)和一部分用户可能通过移除 SD 卡使其不可用(临时)。此外,当用户决定将应用移入或移出 SD-CARD 时,我希望安装在设备内存中的部分应始终保留在那里。

      您可以检查外部存储是否可用,如果不可用,则阻止某些活动。如果您想确保它是同一张 SD 卡,您可以在首次运行时创建 UUID 并将其保存在内部和外部。如果它们匹配,那就是正确的 SD 卡。

      结论

      您的解决方案可能过于复杂,您应该寻找替代方案。

      【讨论】:

        【解决方案8】:

        您可以通过在 Manifest.xml 中定义两个 MAIN LAUNCHER 条目,从一个 APK 创建两个不同的启动活动

        <activity android:name=".ChooserActivity"
                    android:label="Auth Firebase">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
        
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
        
        
                <activity android:name=".GoogleSignInActivity"
                    android:label="Auth Google"
                    android:installLocation="preferExternal">
                    <intent-filter>
                        <action android:name="android.intent.action.MAIN" />
        
                        <category android:name="android.intent.category.LAUNCHER" />
                    </intent-filter>
                </activity>
        

        这将为应用创建两个入口点,两个不同的启动器图标,一个名为“Auth Firebase”,另一个名为“Auth Google”,两者都将打开不同的活动。

        【讨论】:

        • 我认为你误解了这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 2019-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多