Android 牛B新技术 :App Bundles

640?wx_fmt=gif

热文导读 | 点击标题阅读

金九银十跳槽季如何进阶找到合适满意的工作?

要么干,要么辞职,千万别混

“我在公司待了 6 年,清退我却只花了 6 分钟”

作者:Dotry

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


对Android未来发展十分重要的新技术:官方动态化解决方案,具有颠覆性~

强烈建议先阅读下官方的这篇文章:


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=png

640?wx_fmt=gif

你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可


最后,国庆福利来了,我们的知识星球已达到1000人了,之前说过到达1000人时将大大幅涨价到169元,为了反馈大家对我们的关注和厚爱,特此维持现价99元最后一天,今天后(今晚 00:00)后将涨到169元,欢迎大家加入我们的知识星球,更多星球信息参见:

如何进阶成为Java和Android架构师?

金九银十跳槽季如何进阶找到合适满意的工作?

说两件事

640?wx_fmt=jpeg

微信扫描或者点击上方二维码领取Android\Python\AI\Java等高级进阶资源

更多学习资料点击下面的“阅读原文”获取

640?wx_fmt=gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值