对 Android 未来的发展十分重要的技术 | App Bundles

作者:Dotry

链接:

https://www.jianshu.com/p/57cccc680bb6

哈,标题是我根据官方推送取得,之前刚看到文章,没想到就有同学已经实践并分享出来了,如果你对标题表示困惑,强烈建议先阅读下官方的这篇文章:



1前言


在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),AAB是借助Split Apk完成动态加载,使用AAB动态下发方式,可以大幅度减少应用体积。


现在只须在 Android Studio 中构建一个应用 (app bundle),就可以将应用所需的全部内容 (适用于所有设备) 都涵盖在内:所有语言、所有设备屏幕大小、所有硬件架构。它本身并不支持动态化,只是动态化的一个载体文件,真正实现逻辑并不是它。


1.Split APKs:


多apk 支持以下类型屏幕密度ABI,使用新的拆分机制,构建同一个应用程序的hdpi版本和mdpi版本,能够共享很多的任务 (如 javac,dx,proguard)。此外,它会被认为是一个单一的variant,并且同一个测试程序将会被用来测试每个多APK。


2.Dynamic Feature Module:


这个概念感觉像是游戏里面到某个新地图才开始下载那样,不是一来就把所有资源都下载下来。这样显得apk更小了,而且就像游戏逻辑一样,高级副本的地图新手没机会进入,就不必要下载这部分内容,有的用户可能很久都不会用到部分功能,就可以放在dynamic feature module,等要用的时候再下载。


下面是Dynamic Delivery示意效果图:

640?wx_fmt=gif

(左) 旧版 APK 交付样例 – 将全部资源都交付至设备;
(右) 动态交付样例 – 只向设备交付必要资源


具体一下说明和视频演示可以查看网站


  • https://developer.android.com/guide/app-bundle/

好处:


Size更小【个人理解是相对用户来感知来说更小】


Google has claimed that it can reduce app sizes up to 50 percent
Its own apps like YouTube and other apps like LinkedIn which saw a 23% file reduction


安装更快【base.apk被优化相对来说安装会更快】


支持动态发布


限制


  1. 仅限于通过 Google Play 发布的应用,(Google进一步巩固自身生态)

  2. 需要加入到 Google 的 beta program

  3. 最低支持版本Android 5.0 (API level 21)

  4. 低于Android 5.0 (API level 21) 的版本GooglePlay会优化Size,但不支持动态交付。

成本


  1. 需要升级到Android Studio 3.2修改工程以便支持App Bundle格式

  2. 集成Play Core Library


2原理

结合Google Play Dynamic Delivery (动态交付) , 实现动态功能


Android App Bundle 支持模块化,通过Dynamic Delivery with split APKs,将一个apk拆分成多个apk,按需加载(包括加载C/C++ libraries),这样开发者可以随时按需交付功能,而不是仅限在安装过程中。


  • Base Apk
    首次安装的apk,公共代码和资源,所以其他的模块都基于Base Apk

  • Configuration APKs
    native libraries 和适配当前手机屏幕分辨率的资源

  • Dynamic feature APKs
    不需要在首次安装就加载的模块


具体的结构如下:

640?wx_fmt=png

3使用方式

具体使用时,在Android Studio新增一项module——Dynamic Feature Module。

640?wx_fmt=png

选中Dynamic Feature Module直接next到以下页面


640?wx_fmt=png

  • Enable on-demand: 是否支持按需下载模式。如果不支持,那么该feature则在安装app时被安装。

  • Fusing: 如果app运行在Android 5.0(不包括5.0)以下,勾选Fusing则表示该feature会被一起打包至完整apk中。

  • Module Title当确认用户是否想要下载模块时,平台使用该标题来向用户标识模块。

新建项目生成的项目结构图如下:

640?wx_fmt=png

如图feature生成的目录结构和我们常用的module结构相差无几。


例如谷歌官方提供的demo项目结构如下:

640?wx_fmt=png

在demo中有四个feature,通过module名很清楚这些feature是举例介绍如何访问代码、资源、so等。


我们可以看到源码里面主要是通过一个SplitInstallManager类来进行管理不同的模块的。


640?wx_fmt=png

以下是加载对应模块的简单使用:


640?wx_fmt=png

dynamic feature module编译所使用的插件com.android.dynamic-feature通过编译产物分析,运行示例后,发现在所有dynamic feature模块build目录下均会生成apk文件。


直接运行后我们在feature 下打开目录查看如下:


640?wx_fmt=png

可以发现会生成一个apk 文件,这个apk文件就是用来被base.apk 调用的。


接着反编译base.apk,会发现两个的现象:


  • 所有dynamic feature module的代码、资源、so并未打包至主apk中。

  • 主apk manifest信息包括所有dynamic feature module的manifest,即feature manifest会

    被合并至主apk manifest中。

以上两个现象需要我们在模块划分的时候做好规划,随着需求不断迭代,结构规划可能需要做对应的调整。


  • Build Bundle(s)
    Android App Bundle:提供一种全新编译产物格式文件aab,使用Android Studio提供的App Bundle即可。


生成方式如下:


1.通过命令行生成,在命令行里输入以下命令即可:


./gradlew :base:bundleDebug


2.通过Android Studio 生成

640?wx_fmt=png

点击“Build Bundle(s)”之后我们会在主工程build目录下回生成bundle.aab文件,该文件是压缩格式文件,解压该aab文件内容如下:

640?wx_fmt=png

由此可以看到其结构同项目结构分包相似。

打开其中具体某一目录可以发现其和正常apk解压后的结构相差无几:

640?wx_fmt=other

从aab文件内容,可知其包含base和feature的代码、资源、so等,同时还有BundleConfig.pb这一配置文件,该配置文件是google play用于拆分apk。如果我们需要在google play上支持动态发布,只需要上传aab文件即可,后续工作交给google play完成。


4使用bundletool测试Android应用程序包

在本地使用 bundletool命令行工具:


从GitHub下载bundletool 工具


  • https://github.com/google/bundletool/releases

执行java –jar bundletool.jar 可以将”.aad”文件转换成”apks”文件。


例如上述生成一个bundle.aab 文件,采用命令生成bundle.apks文件


java -jar bundletool.jar build-apks –bundle=bundle.aab –output=bundle.apks –ks=features.jks –ks-pass=pass:tcl123 –ks-key-alias=key0 –key-pass=pass:tcl123


执行安装命令:


java -jar bundletool.jar install-apks –apks=bundle.apks

【目前windows 10 好像是有bug】


有关于命令参数的配置可以见下表:

640?wx_fmt=other

获取链接设备信息,命令如下:


java -jar bundletool.jar get-device-spec –output=tcl.json –adb=D:/Android/SDK/platform-tools/adb.exe

640?wx_fmt=other

我们分割出该apks文件之后就会生成以下apk。


命令如下:


java -jar bundletool.jar  extract-apks –apks=bundle.apks –output-dir=D:\bundle\apks –device-spec=tcl.json


640?wx_fmt=png

由此也可以证明我们的生成.aad 文件是正确的。

                        喜欢 就关注吧,欢迎投稿!

640?wx_fmt=jpeg

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/对-android-未来的发展十分重要的技术-app-bundles/

此条目发表在Android分类目录。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。