Android即时应用:分割单个活动应用的策略

时间:2017-05-20 19:56:41

标签: android android-fragments android-activity android-instant-apps

我目前正在研究如何获得应用的即时应用版本。 我遇到的主要问题是如何将应用程序拆分为更小的块,以便满足即时应用模块最大4MB限制的要求。

现在我们的应用程序是一个包含多个片段视图的活动。 我们的主要Activity和Application类基本上掌握了大多数应用程序依赖项。 app gradle文件也是如此。我无法将其减少到4mb。

此时我认为除了创建一个包含原始Activity部分活动的多个活动的全新项目之外别无选择。 问题是片段视图通常与原始活动有依赖关系(因为活动或多或少是控制器)。所以我也需要修改它们。

我想知道是否有人在那里处理同样的挑战。想听听你采取什么方法来解决这种情况。

4 个答案:

答案 0 :(得分:2)

我不确定是否有适用于所有应用的单一策略。在选择是否或如何重构您的应用程序时,有许多因素需要考虑(对于Instant Apps或其他方式)。

话虽如此,鉴于您提供的信息,这里有一些一般性指导。

选项#1 - 将当前APK降低到4MB或更低

鉴于您当前的APK大约为10MB,并且显然还有一些进一步优化大小的空间,因此可能会创建一个< = 4MB的即时应用功能APK。 docs有一些关于缩小APK尺寸的精彩信息,但这里有一些建议,根据您提供的信息,这些建议可能会给您带来最大的收益。请注意,您可以构建模块,以便这些更改仅对已编译的Instant App二进制文件产生影响,而不会影响常规APK。

  • 可绘制资源 - 删除多个密度存储桶,只保留一个存储桶(Android系统仍会根据您不包括的其他密度自动扩展资源),您可能只希望保留xhdpi或{{{} 1}}
  • 可绘制资源 - 如果有任何大型drawable,请查看是否可以删除它们(例如,启动画面drawables - Instant Apps不需要启动画面,因为系统在Instant App启动之前为您显示一个)
  • 可绘制资源 - 使用您剩下的绘图,看看您是否可以转换为webp格式,这种格式在所有Instant App设备上原生支持(对于某些图形,您也可以使用矢量绘图来查看)
  • 翻译字符串 - 您可以根据最大的市场删除其中一些吗?即时应用程序还没有在某些国家/地区推出(确切列表将很快发布)但如果你有印度,印度尼西亚或巴西(新兴市场)的字符串,你可以删除那些为你的即时应用程序
  • 布局文件 - 如果您有特定大小的特定布局文件,您可能需要考虑使用较新的布局管理器,例如ConstraintLayout,这可以帮助展平和简化布局(更高性能) )并且可能缩小尺寸
  • 库和代码 - 您的代码中是否有任何可能与Instant App无关的库或部分?如果是这样,请确保删除模块的结构,以使这些模块不包含在Instant App二进制文件中
  • 否则确保您同时启用Proguard minify enabledshrinkResources

选项#2 - 重构您的应用

如果您认为可以将当前的APK降低到4MB或更低,那么下一步就是重构。如何实现这在很大程度上取决于您当前的代码库和应用程序的功能。但是,从较高级别开始,您应该确定应用程序中的任何逻辑断点,这些断点可以很好地排列为Instant App的关键入口点。例如,旅行应用程序可能为其酒店,航班和汽车租赁体验提供单独的入口点。

否则,您在原始问题中所做的大部分陈述都是正确的。您需要将应用从单个活动中分解为更加模块化的形式。

  

问题是片段视图通常具有依赖关系   原始活动(因为活动或多或少是一个控制者)。

通常应该避免对父活动有很大依赖性的子片段。如果可能的话,它们应该是相当划分的。这可能是解决问题的良好开端。

答案 1 :(得分:0)

尽管谷歌建议我为即时应用程序创建了一个全新的项目。将现有应用程序重构为功能和基础项目的整个过程很难。我花了将近一个月的时间来完成它,但失败了。我发现整个即时应用程序结构方式过于复杂,但仍然无法理解。 只需在真实应用和即时应用之间复制和粘贴代码就会更快。在许多情况下,真正的应用程序和即时应用程序之间的逻辑无论如何都略有不同。

答案 2 :(得分:0)

我们必须为200k +代码行项目做到这一点,我们的方法是创建一个仅供即时应用程序使用的新活动。我们在功能模块中创建了此活动。

然后我们将该功能使用的所有片段移动到功能模型中,并在即时应用活动和已安装的活动中使用这些片段。

然后我们将功能活动与必要的回调挂钩。

如果要在已安装的应用中排除功能活动,您只需在依赖关系链中再将该活动移动一步即可,但这对我们来说并不重要,因此我们将其保留在其中。

优点:节省大量时间 缺点:进行多项活动仍然是一种更好的设计。

答案 3 :(得分:0)

正如其他人已经提到的那样,您必须重构整个应用程序。但是任何人都没有清楚写的是下面的句子。

由于一个活动中有多个片段,因此此结构应提供将片段拆分为多个活动的功能。所有这些足够小的表格,然后是您的即时应用程序。