| 按条件分发 | 允许您指定特定的用户设备需求(例如硬件特性、区域设置和最低 API 级别),以确定是否在安装应用时下载模块化功能。 | 如果购物平台应用的用户遍布全球,您可能需要支持仅在特定地区使用的支付方式。为了减小应用的初始下载大小,您可以创建单独的功能模块处理特定类型的支付方式,并将这些模块根据用户的注册区域视条件安装在用户设备上。 | 创建功能模块并配置按条件分发。 |
| 免安装分发 | Google Play 免安装体验让用户无需在设备上安装 APK 即可与应用互动。用户可以通过 Google Play 商店中的“立即体验”按钮或您创建的网址体验您的应用。这种内容提供形式可让您更轻松地提高应用的使用率。
借助免安装分发方式,您可利用 Google Play 免安装体验,让用户无需安装就能够立即体验应用的特定功能。
| 假设有一款游戏,游戏的前几个关卡包含在轻量级功能模块中。您可以启用该模块的免安装体验,这样用户就可以通过网址或“立即体验”按钮体验游戏,而无需安装应用。 | 创建功能模块并配置免安装分发。然后,应用就可以使用 Google Play Core 库请求按需下载该模块。
请注意,使用功能模块以模块化处理应用功能只是第一步。如需支持 Google Play 免安装体验,应用基本模块的下载大小和给定的启用免安装体验的功能必须满足严格的大小限制。如需了解详情,请阅读通过减少应用或游戏大小启用免安装体验。
|
应用模块化
对应用进行模块化处理就是将应用项目的逻辑组件拆分成独立模块的过程。
如需将应用功能妥善地重新组织到不同的独立组件中,您需要花时间仔细构思。不过,模块化能给您的项目带来以下好处:
-
并行开发:通过将应用的逻辑组件拆分成不同的模块,组织中的不同团队或个人可以认领并负责不同的模块,从而减少合并冲突以及对其他团队的干扰。此外,如果有应用的各个部分共用的逻辑,可以使用库模块来促进代码重用和封装。
-
缩短构建时间:构建系统(例如使用 Gradle 的 Android Studio 构建系统)针对划分成模块的项目进行了优化。例如,如果您在配备多核处理器的工作站上启用 Gradle 的并行项目执行优化,构建系统就能够并行地构建多个模块,从而显著缩短构建时间。项目的模块化程度越高,构建性能的改进就越明显。
-
自定义 Feature Delivery:将应用的功能模块化处理为功能模块,是利用 Play Feature Delivery 的自定义分发选项(如按需分发、按条件分发和免安装分发)的前提条件。创建按需功能所需的工作量更大,并可能需要重构应用。因此,请仔细考虑“模块化处理为功能模块”和“从自定义分发选项中获益”这两者对应用的哪些功能益处最大。
如需按应用功能恰当地对项目进行模块化处理,您需要花费一定的时间认真考虑。当您决定开始对应用进行模块化处理时,首先应该用支持模块化功能所必需的属性配置基本模块。然后,您可以将功能模块配置为安装时分发,从而逐步对应用功能进行模块化处理,而不更改应用的当前行为。
功能模块清单
当使用 Android Studio 创建新功能模块时,IDE 中包含了模块作为功能模块正常运行所需的大多数清单属性。此外,有些属性是在编译时由构建系统注入的,因此您不需要自己指定或修改它们。
注意:在将 android:exported
设置为 true
的情况下,功能模块不得在其清单中指定 Activity。这是因为,当其他应用尝试启动相应 Activity 时,无法保证设备已下载相应的功能模块。此外,应用在尝试访问功能的代码和资源之前,应该先确认该功能已下载。如需了解详情,请参阅管理已安装的模块。
测试 Play Feature Delivery
测试 Play Feature Delivery 的最佳方法是通过 Google Play 商店进行测试。这是因为 Play Feature Delivery 许多优势的实现都有赖于通过 Google Play 商店生成、签署和提供优化的 APK。因此,无论您是上传 App Bundle 还是配置更高级的分发选项,都应该使用以下方法测试应用。
-
通过网址分享应用。通过这种方式,您能够以最快的速度上传 App Bundle 并通过 Google Play 商店中的链接将应用分享给受信任的测试人员。此外,这也是测试自定义分发选项(如按需下载功能)的最快方法。
-
设置开放式、封闭式或内部测试。该方法提供结构化的测试通道,可以在面向外部用户发布应用之前,充分地测试应用的最终发布版本。
为资源构建 URI
如需使用 URI 访问存储在功能模块中的资源,请按以下方法使用 Uri.Builder()
生成功能模块资源 URI:
String uri = Uri.Builder()
.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
.authority(context.getPackageName()) // Look up the resources in the application with its splits loaded
.appendPath(resources.getResourceTypeName(resId))
.appendPath(String.format(“%s:%s”,
resources.getResourcePackageName(resId), // Look up the dynamic resource in the split namespace.
resources.getResourceEntryName(resId)
))
.build().toString();
系统会在运行时构建资源路径的每个部分,以便确保在加载拆分 APK 后生成正确的命名空间。
请参阅以下示例了解如何生成 URI。假设您有一个应用和功能模块,它们的名称如下:
-
应用软件包名称:
com.example.my_app_package
-
功能的资源软件包名称:
com.example.my_app_package.my_dynamic_feature
如果以上代码段中的 resId
是指功能模块中名为“my_video”的原始文件资源,以上 Uri.Builder()
代码会输出以下内容:
android.resource://com.example.my_app_package/raw/com.example.my_app_package.my_dynamic_feature:my_video
然后,您的应用可以使用此 URI 访问功能模块的资源。
有关功能模块的注意事项
如果您想发布包含功能模块的正式版应用,请记住以下几点:
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
愿你有一天,真爱自己,善待自己。
本文在开源项目:Android开发不会这些?如何面试拿高薪 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…
l-1711287998585)]
最后
愿你有一天,真爱自己,善待自己。
本文在开源项目:Android开发不会这些?如何面试拿高薪 中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…