背景

随着应用不断演化,功能越来越复杂,且应用针对不同屏幕设备、不同国家语言资源都打包在同一个App,导致应用包不断增大,据统计自2012年以来应用包大小增长5倍。虽然现在手机的存储空间越来越大,但用户照片、视频等媒体文件品质在逐渐提升,导致设备可用空间逐渐紧缩。

为此Google在去年Google I/O大会讲述Android引入新的App动态化框架(即Android App Bundle,缩写为AAB)。利用Split Apk完成动态加载,使用AAB动态下发方式,可显著缩小应用体积,减少对存储空间的占用。

什么是Android APP Bundles

一个Android应用程序包,包括所有程序的编译代码和资源,但推迟APK的生成。该程序包在安装时可以根据用户设备的屏幕分辨率、cpu架构以及语言为其生成特定的apk,而不用将所有的资源文件包含在apk中,有效减少apk的大小。

Android App Bundle是扩展名为.abb的文件

base/:应用程序的基本模块始终包含在base应用程序包的目录中res/,lib/和assets/:这些目录与典型APK中的目录相同。dex/:与APK不同,app bundle 将每个模块的DEX文件存储在这个单独的目录中。root/:应用程序包的目录可能包含应用程序加载的基于Java的资源 Class.getResource(),这些文件稍后会重新定位到应用基础APK的根目录以及Google Play生成的每个多APK。resources.pb:描述每个模块中的代码和资源,这在针对不同设备配置优化APK时非常有用。BundleConfig.pb:提供有关包本身的信息,例如用于构建应用程序包的构建工具的版本。

如何使用Android APP Bundles

环境要求:Android Studio 3.2+
代码配置:
在app中的build.gradle文件中的android闭包中添加如下代码:

android {    ......    bundle {        density {            // Different APKs are generated for devices with different screen densities; true by default.            enableSplit true        }        abi {            // Different APKs are generated for devices with different CPU architectures; true by default.            enableSplit true        }        language {            // This is disabled so that the App Bundle does NOT split the APK for each language.            // We're gonna use the same APK for all languages.            enableSplit true        }    }}

将density、abi、language中的enableSplit设置为true,这样在生成apk时就可以通过屏幕分辨率、cpu架构、语言进行拆分。

修改完毕之后,进行同步,现在,您可以构建App Bundle。转到Build> Build Bundle(s)/ APK(s)并选择Build Bundle(s)

构建之后会在app> build> outputs> bundle> debug中生成.abb文件。

使用bundletool生成apk

得到Android应用程序包后,有两种方法可以生成特定设备的apk:在本地使用 bundletool命令行工具或者上传到Google Play,由于无法使用Google Play,所以使用bundletool进行apk生成。

bundletool,下载地址,下载bundletool-all-0.9.0.jar文件。

常用命令:

  1. 通过应用包生成apk集
    java -jar bundletool-all-0.9.0.jar build-apks     --bundle=app.aab     --output=app.apks
  1. 通过应用包生成一组带签名的apk集
    java -jar bundletool-all-0.9.0.jar build-apks     --bundle=app.aab     --output=app.apks     --ks=5658.keystore     --ks-pass=pass:android     --ks-key-alias=androiddebugkey     --key-pass=pass:android
  1. 将apk部署到设备上(需要连接设备,根据设备信息自动提取对应资源并安装)
    java -jar bundletool-all-0.9.0.jar install-apks     --apks=app.apks
  1. 为已连接的设备生成apk
    java -jar bundletool-all-0.9.0.jar build-apks    --connected-device     --bundle=app.aab     --output=my_app.apks
  1. 通过json文件生成对应的apk
  java -jar bundletool-all-0.9.0.jar build-apks     --device-spec=config.json     --bundle=app.aab     --output=my_app.apks
  1. 获取已连接设备的json配置文件
java -jar bundletool-all-0.9.0.jar get-device-spec     --output=config.json
  1. 从apk集中提取对应设备apk到app文件夹
    java -jar bundletool-all-0.9.0.jar extract-apks     --apks=keyhelp.apks      --output-dir=app     --device-spec=temp.json

json文件格式:

{    "supportedAbis": ["arm64-v8a", "armeabi-v7a"],    "supportedLocales": ["en", "fr"],    "screenDensity": 640,    "sdkVersion": 27}

如果应用支持多种语言需要将支持的语言添加到supportedLocales中去。

由程序包生成的apk集内容:

特定设备的apk集内容:

优缺点分析

优点: 有效减小apk大小

缺点:因其生成的apk集的后缀为apks,只能通过bundletool进行apk安装,无法通过adb install 进行安装。

小结

本文主要介绍了bundletool的使用方法,由于未能连接到Google Play,所以没有介绍Android App Bundle中的动态功能apk的发布。

参考资料

https://developer.android.com/guide/app-bundle/#beta_considerations
https://developer.android.com/studio/command-line/bundletool
https://codelabs.developers.google.com/codelabs/your-first-dynamic-app/index.html#0

更多相关文章

  1. 如何把React Native嵌入到原生android应用中
  2. Android(安卓)添加按电源键结束通话
  3. Android(安卓)程序反编译
  4. Android项目总结之社会化分享
  5. MacOS 10.15 下 Android(安卓)Q 源码 下载 编译 详解
  6. 关于android真机访问本地电脑服务器以及访问数据库的那点事
  7. Android屏幕适配 px,dp,dpi及density的关系与深入理解
  8. Android中使用javah生成jni头文件的正确方法
  9. android 7.0 兼容多语言切换总结

随机推荐

  1. android nfc 开发
  2. Wakelock API详解
  3. Android单击屏幕获得坐标,屏幕多点触摸测
  4. Android(安卓)EditText 不可编辑到可编辑
  5. Android(安卓)上传文件[转]
  6. android 如何去掉状态栏和标题栏
  7. android如何用代码实现界面ui
  8. Android页面跳转是如何传递参数的
  9. Android(安卓)点击空白区域 软键盘消失
  10. android 操作路由表