Android App Bundle:动态功能模块
目录
Android App Bundle
创建动态功能模块
动态功能模块
与主模块建立关联
部署应用
按需分发On-Demand
免安装分发
自 2021 年 8 月起,Google Play 将开始要求新应用使用 Android App Bundle 进行发布。该格式将取代 APK 作为标准发布格式。虽然这个政策目前还无法影响到国内应用,但是作为Android开发者,对于新的动态还是要有一定的认识。本文并不是介绍Android App Bundle,因为它不是新的事物,相关的文章也有很多了,本文重点介绍的是Android App Bundle中“动态功能模块”的实际应用。
Android App Bundle
Android App Bundle是基于google play的分发技术,可以有效的减少apk的大小。
Android App Bundle可以自动将不同的分辨率、语言、平台(CPU)的资源分别打包,这样当安装时只根据当前设备安装对应的资源,这样大大的节省了内存空间。
除了这些资源,Android App Bundle还支持动态功能模块(Dynamic Feature Module),这样如果用户不需要这部分功能,则不安装这个模块,这样就更加高度优化了下载和安装。
创建动态功能模块
下面就来看看如何创建动态功能模块:
1、从菜单栏中依次选择 File > New > New Module。这一步与创建普通模块一样。
2、在 Create New Module 对话框中,选择 Dynamic Feature Module,然后点击 Next。
3、在 Configure your new module 部分中,完成以下操作:
从下拉菜单中选择应用项目的 Base application module。(一般就是main主模块)
指定 Module name。IDE 会使用此名称在 Gradle 设置文件中将该模块标识为 Gradle 子项目。当您构建 app bundle 时,Gradle 会使用子项目名称的最后一个元素在功能模块的清单中注入 <manifest split> 属性。
指定该模块的 package name。默认情况下,Android Studio 会建议一个软件包名称,该名称由基本模块的根目录软件包名称和您在上一步中指定的模块名称组合而成。
选择您希望该模块支持的 Minimum API level。此值应与基本模块的值一致。
点击 Next。
4、在 Module Download Options 部分中,完成以下操作:
1)指定最多包含 50 个字符的 Module title。(这个会展示给用户)
2)在 Install-time inclusion 下的下拉菜单中,选择分发时机,有下面三种:
Include module at install-time 安装时分发(与普通模块类似)
Do not include module at install-time 按需分发(安装时不分发,后面单独说)
Only include module at app install for devices with specified features 按条件分发
按条件分发还需要配置条件,如下图
点击“+ device-feature”可以添加一个条件(可以添加多个条件)。在 每个device-feature 旁边,从下拉菜单中选择以下选项之一,然后为其指定值:
Name:用于指定设备为在安装应用时下载模块所需具备的硬件或软件功能。按条件分发所支持的功能与被 PackageManager 列为 FEATURE_* 常量的功能相同。如果您选择此选项,请先在下拉菜单旁边的字段中输入相应功能的常量值的任意部分(例如“bluetooth”),然后在所显示的建议中选择一个。
OpenGL ES Version:用于指定设备为在安装应用时下载模块所需的 OpenGL ES 版本。如果您选择此选项,请先在下拉菜单旁边的字段中输入相应版本(例如“0x00030001”),然后在所显示的建议中选择一个。
3)如果您希望此模块可提供给搭载 Android 4.4(API 级别 20)及更低版本的设备并包含在多 APK 中,请选中 Fusing 旁边的复选框。这意味着,您可以从不支持下载和安装拆分 APK 的设备上将其省略。
(这部分的配置最终会在模块下的Manifest中体现,下面会提到)
5、点击 Finish即可创建模块
动态功能模块
创建出的模块目录如下:
可以看到与正常模块一样,但是这里的Manifest内容有差异,如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:dist="http://schemas.android.com/apk/distribution"package="com.huichongzi.dynamicfeature"><dist:moduledist:instant="false"dist:title="@string/title_dynamicfeature"><dist:delivery><dist:on-demand /></dist:delivery><dist:fusing dist:include="true" /></dist:module>
</manifest>
可以看到这里出现了一个dist标签,这个标签下就是动态功能模块的一些配置。比如dist:instant="false"就是不支持免安装(免安装后面会细说),而title就是上面4步中设置的module title。而
<dist:delivery><dist:on-demand />
</dist:delivery>
就是分发时机,on-demand就是Do not include module at install-time即按需分发(后面单独说),如果改成install-time就是Include module at install-time即安装时分发,按条件分发则不太一样,如下:
<dist:delivery><dist:install-time><dist:conditions><dist:device-feature dist:name="android.hardware.camera.ar"/>...</dist:conditions></dist:install-time></dist:delivery>
模块创建后可以在这里添加新的分发条件。
这里也可以根据国家/地区指定条件
<dist:conditions><!-- Set to "true" to specify countries to exclude from downloadingthis module at app install-time. By default, modules are availablefor download to all user countries. --><dist:user-countries dist:exclude="true"><!-- Specifies the two-letter CLDR country code for regions that shouldnot download the module at app install-time. --><dist:country dist:code="CN"/><dist:country dist:code="HK"/></dist:user-countries>
</dist:conditions>
根据 API 级别指定条件
<dist:conditions><!-- Specifies the minimum API level that the device must satisfyin order to download your module at app install-time. The API level youspecify must be greater or equal to the module's own minSdkVersion. --><dist:min-sdk dist:value="21"/><!-- Specifies the maximum API level that the device cannot exceedin order to download your module at app install-time. The API level youspecify must be less than or equal to the module's own maxSdkVersion. --><dist:max-sdk dist:value="24"/>
</dist:conditions>
与主模块建立关联
当 Android Studio 创建功能模块时,它会自动在基本模块的 build.gradle 文件添加 android.dynamicFeatures 属性,以使该功能模块对基本模块可见,如下所示:
// In the base module’s build.gradle file.
android {defaultConfig {...}...// Specifies feature modules that have a dependency on// this base module.dynamicFeatures = [":dynamic_feature", ":dynamic_feature2"]
}
此外,Android Studio 还会将基本模块添加为功能模块的依赖项,如下所示:
// In the feature module’s build.gradle file:
...
dependencies {...// Declares a dependency on the base module, ':app'.implementation project(':app')
}
部署应用
在开发支持功能模块的应用时,您可以像往常一样,从菜单栏中依次选择 Run > Run(或点击工具栏中的 Run 图标 ),将该应用部署到连接的设备。
如果您的应用项目包含一个或多个功能模块,您可以通过修改现有的运行/调试配置以选择需要在部署应用时包含的功能,具体操作步骤如下:
从菜单栏中依次选择 Run > Edit Configurations。
在 Run/Debug Configurations 对话框的左侧面板中,选择所需的 Android App 配置。
在 General 标签页中的 Dynamic features to deploy 下,选中需要在部署应用时包含的每个功能模块旁边的复选框。
点击 OK。
默认情况下,Android Studio 不会使用 app bundle 部署您的应用,而是由 IDE 构建针对部署速度(而非 APK 大小)进行了优化的 APK,并将其安装到设备中。如需将 Android Studio 配置为通过 app bundle 构建和部署 APK 以及免安装体验,请修改运行/调试配置。
按需分发On-Demand
上面我们提到了三种分法模式:安装时分发,按需分发和按条件分发。
安装时分发比较好理解,即在google play下载安装应用的时候就会下载该模块;按条件分发也比较好理解,下载安装应用时,如果当前设备满足条件才会下载该模块;只有按需分发,并不是很容易理解。
按需分发与国内很多应用的插件化类似,就是在功能被使用的时候才会去下载那部分代码和资源。官方描述是这样的:
如果在使用购物平台应用的用户中,只有 20% 的人发布待售商品,有一个不错的策略可以减少大多数用户的初始下载大小,那就是将拍照、输入商品描述及上架商品的功能配置为按需下载。也就是说,您可以为应用的销售功能配置功能模块,使该功能仅在用户希望在购物平台上销售商品时才下载。此外,如果用户在一段时间后不再出售商品,应用可以通过请求卸载该功能减小其安装大小。
但是通过上面创建部署动态模块的流程,我们发现没有关于按需下载的这部分逻辑。这是因为如果要使用动态模块,还需要配合google的play core library才可以:
implementation "com.google.android.play:core:${versions.playcore}"
通过这个library中的SplitInstallManager这个类来实现判断模块是否安装,如果没有安装则下载安装等逻辑。
这部分内容很多,受本文篇幅所限就不展开了,官方有一篇很详细的教程:https://developer.android.com/codelabs/on-demand-dynamic-delivery#0,有兴趣的同学可以自行阅读(需要梯子)。以后有时间我会单独出一篇中文教程,请大家留意我的公众号更新。
免安装分发
还有一种动态功能模块,即免安装分发。Google Play 免安装体验让用户无需在设备上安装 APK 即可与您的应用互动。用户可以通过 Google Play 商店中的“立即体验”按钮或您创建的网址体验您的应用。这种内容分发形式可让您更轻松地提高用户与应用的互动度。
仅当应用的基本模块也支持免安装体验时,您才能使功能支持免安装体验。这是因为,如果用户想要体验您的应用中某个支持免安装体验的功能模块,他们的设备还必须下载应用的基本模块以获取通用代码和资源。请注意,为了支持 Google Play 免安装体验,基本模块和功能的下载必须满足几个条件:
最大大小:支持免安装体验的基本模块和支持免安装体验的功能模块的总大小不得超过 10 MB。如需了解详情,请阅读通过缩减应用或游戏大小支持免安装体验。
后台活动:支持免安装体验的模块无法使用后台服务。此外,此类模块在后台运行时无法发送通知。
如果您使用 Android Studio 3.5 或更高版本创建支持免安装体验的功能模块(如本部分所述),IDE 会在每个模块的清单中添加以下内容,从而自动使基本模块和功能模块支持免安装体验:
<manifest xmlns:dist="http://schemas.android.com/apk/distribution"... ><dist:module dist:instant="true" />...
此外,在下载并安装您的应用时,系统会随该应用的基本 APK 自动下载并安装支持免安装体验的功能模块。因此,IDE 还会在支持免安装体验的功能模块中添加以下内容。
Android App Bundle:动态功能模块相关推荐
- Android App Bundle 和Unity AAB BundleTools
1.为什么要用Android App Bundle 从 2021年8月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布.现在,Play Feature ...
- android app bundle Split APKs
android app bundle Split APKs BaseApk:该APK包含所有其他拆分APK都可以访问的代码和资源,并为您应用程序提供基本功能.当用户请求下载您的应用程序时,首先下载并安 ...
- 分享篇 - 58同城基于Android APP Bundle开发的全新编译模式(编译速度提升70%)
目录 1. Wafers 项目背景 2. 效果展示 3. 实现方案 4. 改造期间遇到的问题 5. 如何接入使用 6. 对比 Instant Run 和 Apply Changes 7. 总结 1. ...
- Android App Bundle基础入门
一.前言 重要提示:从 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布.现在,Play Feature Delivery 或 Pl ...
- 探索 Android App Bundle
原文链接 Exploring the Android App Bundle,作者 Joe Birch. 目录 App bundle 格式 拆分 APKs 构建和分发 Android App Bundl ...
- 怎么从Android App Bundle (.aab)提取和转换apks文件(从AAB到APKs的转换和提取)
在Google的I/O 2018上引入了一个新的APP的发布格式,就是 Android App Bundle. 在 2019年之后,Google开始推荐开发者上传APP或者更新APP使用 .aab 格 ...
- Android 程序自动更新功能模块实现
2019独角兽企业重金招聘Python工程师标准>>> Android 程序自动更新功能模块实现 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程 ...
- android自动更新demo,Android程序自动更新功能模块的实现方法【附完整demo源码下载】...
本文实例讲述了Android程序自动更新功能模块的实现方法.分享给大家供大家参考,具体如下: 在程序启动的时候检测服务器上有没有对应版本更新,如果有更新,提示用户是否更新. 在程序启动的时候首先调用更 ...
- Android——Android app bundle插件化部署
其实google发布app bundle已经是18年的事情了,只是一直在业务上接触不到.最近刚好打算用到爱奇艺的Qigsaw框架来做国内的模块化加载,所以打算一起学习一下. 说到模块化加载.其实本质就 ...
最新文章
- SDN/NFV:现状,挑战和未来
- 基于SSH实现教务管理系统
- java注释 param_java注释文档(下)
- 【最详细】数据结构(C语言版 第2版)第七章课后习题答案 严蔚敏 等 编著
- dynamodb分页查询_使用DynamoDBMapper查询DynamoDB项目
- Python_Proxy代理
- ID Tech 5 中 Megatexturequot;针对地形的D3D9 基本实现原理
- android 热门开源库,GitHub安卓热门开源资源在项目中的使用及项目总结
- 增城seo搜索引擎优化_搜索引擎seo优化主要从哪里入手?
- vue+node多条件查询 分页_SpringBoot+JPA框架分页、带条件查询等操作
- STM32烧写程序:Keil5使用ST-link下载程序
- 圆柱体积怎么算立方公式_圆柱体积公式是什么,怎么算,
- C/C++——set的基本操作总结
- 使用代理ccproxy设置outlook2013 收QQ邮箱(IMAP-SMTP方式)
- python捕捉warning_Pytest官方教程-10-捕获警告信息
- NFS笔记(二)NFS服务器配置实例
- php批量导入多个excel,php的excel数据批量导入
- 样本标准差与自由度 n-1 卡方分布关系的证明
- yxc_第二章 数据结构(一)_链表
- oracle当查询没有输出返回0,[数据库] Oracle单表查询总数及百分比和数据横向纵向连接...