0%

一文搞懂AndroidAppBundle

资源地址


demo:https://github.com/android/app-bundle-samples
bundletool工具:https://developer.android.com/studio/command-line/bundletool
优势:https://developer.android.com/guide/app-bundle/dynamic-delivery#modularizehttps://developer.android.com/platform/technology/app-bundle
引导:https://developer.android.com/guide/app-bundle
免安装:https://developer.android.com/topic/google-play-instant/getting-started/instant-enabled-app-bundle

aab优势


  • 更高效的管理版本
  • 收益于更小的应用 Dynamic Delivery
  • 自定义功能分发
  • 提升工程速度
  • 缩短编译时长
  • GP提供了免安装体验

项目结构


image.png
app:base模块(属于免安装)
instant:免安装模块
features:动态模块

模块配置


app模块

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apply plugin: 'com.android.application'

android {
dynamicFeatures = [':features:kotlin',
':features:initialInstall',
':features:java',
':features:native',
':features:maxSdk',
':features:assets',
':instant:split',
':instant:url'
]
}


dependencies {
api "com.google.android.play:core:${versions.playcore}" //提供了下载bundle功能
}
1
2
3
<manifest xmlns:dist="http://schemas.android.com/apk/distribution">
<dist:module dist:instant="true" /> //免安装模块
</manifest>

feature模块和instant模块

1
2
3
4
5
apply plugin: 'com.android.dynamic-feature'
dependencies {

implementation project(':app') //依赖base模块
}
1
2
3
4
5
6
7
8
9
10
11
<dist:module
dist:instant="true" //是否免安装
dist:title="@string/module_instant_feature_split_install">
<dist:fusing dist:include="true" /> //如果手机api在19或者以下,将不按分发条件下发
<dist:removable dist:value="true | false" /> //是否可以卸载
<dist:delivery> //分发策略
<dist:install-time /> // 安装时下载,可以指定条件
<dist:on-demand/> //按需下载

</dist:delivery>
</dist:module>

分发

  • 安装时分发
  • 按需分发
  • 按条件分发
  • 免安装分发

分发配置都可以在AndroidManifest.xml中进行配置,上述dist:module中配置

运行

1.android studio

image.png

2.命令行

2.1 下载bundletool

2.2 编译aab

1
./gradlew :app:bundleDebug

2.3 转为 apks
–mode=universal 为将所有模块全部转化,不指定时将根据交付策略指定,即dist:delivery分发策略

1
bundletool build-apks --mode=universal --bundle app/build/outputs/bundle/debug/app-debug.aab --output app/build/outputs/bundle/debug/app-debug.apks

只包含免安装instant和base

1
bundletool build-apks --bundle app/build/outputs/bundle/debug/app-debug.aab --output app/build/outputs/bundle/debug/app-debug.apks

app-debug.apks截图
image.png

2.4 安装

1
bundletool install-apks --apks app/build/outputs/bundle/debug/app-debug.apks

2.5 获取设备规范

1
bundletool get-device-spec --output=/tmp/device-spec.json

2.6 提取apk

1
bundletool extract-apks --apks=app/build/outputs/bundle/debug/app-debug.apks --output-dir=app/build/outputs/bundle/debug/apks --device-spec=/tmp/device-spec.json
  • universal模式

image.png

  • 非universal模式,只有base和instant

image.png

bundletool是模拟了GP的分发流程

2.7 本地测试模拟

build-apks

1
bundletool build-apks --local-testing --bundle app/build/outputs/bundle/debug/app-debug.aab --output app/build/outputs/bundle/debug/app-debug.apks

install-apks
image.png

模拟下载
a.mp4

3.GP分发

参考bundletool和分发流程

其他

  • aab包中有什么?

aab中包含了base,feature模块的所有资源,我们将aab传到gp市场后,用户下载时,将按分发策略进行下载
image.png

  • aab构建流程和apk的差异

参考:https://yuque.antfin.com/xiaobao.spf/ad2gcp/fob18b