2

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

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

在这一点上,除了创建一个包含多个活动和部分原始活动的全新项目外,我没有其他选择。问题是片段视图通常与原始活动有依赖关系(因为活动或多或少是一个控制器)。所以我也需要修改这些。

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

4

4 回答 4

2

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

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

选项 #1 - 将当前 APK 减少到 4MB 或更少

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

  • 可绘制资源 - 删除多个密度桶,只保留一个桶(Android 系统仍会自动缩放资产以适应您不包括的其他密度),您可能只想保留xhdpi或可能xxhdpi
  • 可绘制资源 - 如果有任何大型可绘制资源,请查看是否可以删除它们(例如,闪屏可绘制资源——即时应用不需要闪屏,因为系统会在即时应用启动之前为您显示)
  • 可绘制资源 - 使用您留下的可绘制资源,看看您是否可以转换为webp所有即时应用设备本机支持的格式(对于某些图形,您还可以查看使用矢量可绘制资源)
  • 翻译字符串——你能根据你最大的市场删除其中的一些吗?Instant Apps 还没有在某些国家/地区推出(确切的列表有望很快发布),但如果您有针对印度、印度尼西亚或巴西(新兴市场)的字符串,您可以为您的 Instant App 删除这些字符串
  • 布局文件 - 如果您有尺寸特别大的特定布局文件,您可能需要考虑使用更新的布局管理器,例如ConstraintLayout,这可以帮助扁平化和简化您的布局(性能更高)并可能缩小尺寸
  • 库和代码 - 您的代码中是否有任何可能与 Instant App 无关的库或部分?如果是这样,请确保删除模块的结构,以便它们不包含在 Instant App 二进制文件中
  • 否则请确保您已启用 Proguard minifyshrinkResources打开

选项 #2 - 重构您的应用程序

如果您认为无法将当前 APK 减少到 4MB 或更小,那么下一步就是考虑重构。这在很大程度上取决于您当前的代码库和应用程序的功能。但是,从高层次上看,您应该识别应用程序中的任何逻辑断点,这些断点可以很好地排列为即时应​​用程序的关键入口点。例如,一个旅游应用程序可能为其酒店、航班和汽车租赁体验提供单独的入口点。

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

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

您通常应该避免子片段严重依赖其父活动。如果可能的话,它们应该被完全分隔开。这可能是解决问题的良好第一步。

于 2017-05-23T04:07:04.237 回答
0

正如其他人已经说过的那样,您必须重构整个应用程序。但是没有人写清楚的是下面这句话。

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

于 2018-07-11T06:03:24.493 回答
0

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

于 2017-07-18T13:53:39.670 回答
0

对于一个超过 200k 行代码的项目,我们必须这样做,我们的方法是创建一个只供即时应用程序使用的新活动。我们在功能模块中创建了这个活动。

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

然后我们将功能活动与必要的回调联系起来。

如果您想在已安装的应用程序中排除功能活动,您可以简单地将该活动在依赖链中再上移一步,但这对我们来说并不重要,所以我们保留了它。

优点:节省大量时间缺点:仍然是一个更好的设计,可以有多个活动。

于 2017-09-08T07:49:52.073 回答