2012-04-03 231 views
8

我试图了解是否可以将Android应用拆分为两部分(从一个APK安装)。我正在研究这个功能,将一部分安装在设备内存上,另一部分安装在SD-CARD上。这两部分属于一起,不应单独安装。将Android应用拆分为两部分

注:我需要单独不仅资源,而且活动,使APK Expansion Files不是一个解决方案,因为没有提供这样的功能。

+0

你是什么意思与“单独安装”?我想你有一些资源(如图像,视频)安装在SD卡内存问题,对不对?或者你是什么意思? – 2012-04-03 06:35:24

+0

我的意思是说,对于设备,两个部分应该一起安装/拆卸。我正在考虑的应用程序中有一部分我希望始终可用(安装在设备内存上),另一部分用户可通过删除SD-CARD使其不可用(临时)。另外,当用户决定将应用程序移入或移出SD-CARD时,我想要在设备内存中安装的部分应该始终保持在那里。 – Louis 2012-04-03 07:09:22

+0

这不适用于单个应用程序。但你应该可以用2个独立的应用程序来完成它。 – 2017-01-30 18:54:59

回答

0

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

Multiple APK Support

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

通过与多个APK发布应用,您可以:

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

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

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

目前,这些是唯一的设备特性,谷歌播放 支持发布多个APK为相同的应用程序。

+0

谢谢你的回应,但这不是我的意思。我的应用程序有两个部分应该始终可用,一部分在用户取出SD卡时可能不可用,然后在再次插入卡时可用。 – Louis 2012-04-03 08:06:02

0

您的应用程序只能检查sd卡当前是否可用(“插入”)。如果它可用,你的应用程序就像正常一样工作,如果SD卡不可用,应用程序将自动退出/显示弹出/启动不同的活动/任何。

+0

如何在“移动”过程中向sd卡推送所选活动和服务? – msangel 2017-01-25 13:35:31

+0

对不起,我完全不了解您的句子:作者评论x – jdstaerk 2017-01-25 13:55:24

+0

:“我正在考虑的应用程序有一个部分,我希望始终可用(安装在设备内存上)和一个用户可能制作的部分通过移除SD-CARD不可用(暂时)。“ – msangel 2017-01-25 14:25:57

0

如果你只是寻找一种方式来保持外部驱动器上的应用程序资源,Harry's answer将是有益的。

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

替代

两个应用程序

创建两个独立的两个应用程序,并检查它们中任开始时,如果安装了另一个。如果没有,请求用户安装另一个用户并将用户转发到应用商店。

一个应用程序将检查外部存储

我不知道你的使用情况,但是从你的意见听起来像你找错了解决方案。

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

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

结论

您的解决方案可能是太复杂了,你应该寻找替代品。

1

APK扩展文件

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

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

下载扩展文件

在大多数情况下,谷歌Play的下载,并在安装或更新的APK的同时节省了您的扩展文件到设备。这样,扩展文件在您的应用程序第一次启动时可用。但是,在某些情况下,您的应用必须通过从Google Play的应用授权服​​务响应中提供给您的URL请求这些文件来下载扩展文件。

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

应用程序启动时,寻找在共享存储位置扩展文件(在Android/OBB //目录)。 如果扩展文件存在,您就全部设置好了,并且您的应用程序可以继续。 如果扩展文件不存在: 使用Google Play的应用程序许可执行请求以获取应用程序的扩展文件名称,大小和URL。 使用Google Play提供的网址下载扩展文件并保存扩展文件。您必须将文件保存到共享存储位置(Android/obb //),并使用Google Play响应提供的确切文件名。

Source

+0

扩展文件适用于不属于活动等程序代码的资产。 – 2017-01-31 11:38:49

0

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

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

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

3

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

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

我还没有试过这种尚未的活动,但在理论上似乎是合法的。

让我知道这是否工作。谢谢!

+0

可能您首先必须在安全选项中启用APK“未知来源的安装”。 – 2017-01-31 11:41:15

+0

可能是的。但我相信这将是路易斯问题的最接近的解决方案。 – Shrikant 2017-02-01 07:53:05

0

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

<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> 

这会为应用程序创建两个入口点,两个不同的启动图标一个名为“验证火力地堡”等命名为“谷歌验证”都将打开不同的活动。

+0

我想你误解了这个问题。 – 2017-02-01 08:17:31