Android App Bundle

Android App Bundle是一种改进的应用程序打包方式,能大幅度减少应用体积。简而言之,可以理解Google 官方的动态发布方案。

好处

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
  • 安装更快
  • 支持动态发布

限制

  • 仅限于通过 Google Play 发布的应用,(Google进一步巩固自身生态)
  • 需要加入到 Google 的 beta program enroll your app in app signing by Google Play in the Play Console
  • 最低支持版本Android 5.0 (API level 21)
  • 低于Android 5.0 (API level 21) 的版本GooglePlay会优化Size,但不支持动态交付。

成本

  • 需要升级到Android Studio 3.2修改工程以便支持App Bundle格式
  • 集成Play Core Library

原理

只须在 Android Studio 中构建一个应用束 (app bundle),就可以将应用所需的全部内容 (适用于所有设备) 都涵盖在内:所有语言、所有设备屏幕大小、所有硬件架构。接着,在用户下载您的应用时,Google Play 的新动态交付只会传输适用于用户设备的代码和资源。人们在 Play Store 上看到的安装包体积更小,下载速度也越快,同时也节省了设备存储空间。


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

结合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
    不需要在首次安装就加载的模块


使用方法


app模块为Base Apk,features目录下的模块为Dynamic feature APKs。Base Apk和正常的Android应用项目一样,它决定了最终程序的版本号、应用签名、代码缩小、splits、包名等信息。

默认情况下,在构建应用程序包时,它支持为每组语言资源,屏幕密度资源和ABI库生成配置APK。使用android.bundle基本模块build.gradle文件中的块 ,如下所示,您可以禁用对一种或多种配置APK的支持:

android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

Dynamic feature APKs是需要动态加载的模块,如果手机不支持动态加载,其内容会合并到最终的apk内。

创建动态功能模块

创建新动态功能模块的最简单方法是使用Android Studio 3.2或更高版本。由于动态要素模块对基础应用程序模块具有内在依赖性,因此您只能将它们添加到现有应用程序项目中。

要使用Android Studio向您的应用项目添加动态功能模块,请执行以下操作:

  1. 如果您还没有这样做,请在IDE中打开您的应用程序项目。
  2. 从菜单栏中选择File> New> New Module。
  3. 在Create New Module对话框中,选择 Dynamic Feature Module,然后单击Next。
  4. 在“ 配置新模块”部分中,完成以下操作:
    a. 从下拉菜单中选择应用程序项目的Base应用程序模块。
    b. 指定模块名称。IDE使用此名称将模块标识为Gradle设置文件中的Gradle子项目 。构建应用程序包时,Gradle使用子项目名称的最后一个元素将<manifest split>属性 注入AndroidManifest清单中。
    c. 指定模块的包名称。默认情况下,Android Studio会建议一个包名称,该名称包含基本模块的根包名称和您在上一步中指定的模块名称。
    d. 选择希望模块支持的最低API级别。该值应与基本模块的值匹配。
  5. 单击下一步。
  6. 在“ 配置按需选项”部分中,执行如下操作:
    a. 使用最多50个字符指定模块标题。例如,当确认用户是否想要下载模块时,平台使用该标题来向用户标识模块。因此,您的应用程序的基本模块必须包含模块标题作为字符串资源,您可以将其翻译。使用Android Studio创建模块时,IDE会为您将字符串资源添加到基本模块,并在动态要素模块的清单中注入以下条目:
<dist:module
    ...
    dist:title="@string/title_dynamic_feature">
</dist:module>

b. 如果希望模块可用于按需下载,请选中“ 按需启用 ”旁边的框。如果您未启用此选项,则当用户首次下载并安装您的应用时,可以使用动态功能。Android Studio会在模块的清单中注入以下内容以反映您的选择。

<dist:module
    ...
    dist:onDemand="true">
</dist:module>

c. 如果您希望此模块可供运行Android 4.4(API级别20)及更低版本的设备使用,请选中“ 融合 ”旁边的框,并将其包含在多个APK中。仅当您选中上一步中按需启用旁边的框时,此选项才可用。这意味着您可以为此模块启用按需行为,并禁用融合以从不支持下载和安装拆分APK的设备中省略它。Android Studio会在模块的清单中注入以下内容以反映您的选择。

<dist:module
    ...
    <dist:fusing dist:include="true" />
</dist:module>
  1. 单击完成。
    在Android Studio完成模块创建后,请从“ 项目”窗格中自行检查其内容( 从菜单栏中选择“ 视图”>“工具窗口”>“项目 ”)。您应该快速注意到默认代码,资源和组织与标准应用程序模块的默认代码,资源和组织类似。

动态功能模块构建配置

使用Android Studio创建新的动态要素模块时,IDE会将以下Gradle插件应用于模块的build.gradle文件。

// The following applies the dynamic-feature plugin to your dynamic feature module.// The plugin includes the Gradle tasks and properties required to configure and build// an app bundle that includes your dynamic feature module.apply plugin: 'com.android.dynamic-feature'

什么不包括在动态功能模块构建配置中

由于每个动态功能模块都依赖于基本模块,因此它还会继承某些配置。因此,您应该在动态要素模块的build.gradle文件中省略以下内容:

  • 签名配置:使用您在基本模块中指定的签名配置对应用程序包进行签名。
  • minifyEnabled属性:您可以 使代码萎缩 仅从基本模块的构建配置为您的整个应用项目。因此,您应该从动态功能模块中省略此属性。但是,您可以 为每个动态要素模块指定其他ProGuard规则
  • versionCodeversionName:构建应用程序包时,Gradle使用基本模块提供的应用程序版本信息。您应该从动态模块的build.gradle文件中省略这些属性 。

建立与基础模块的关系

当Android Studio创建动态要素模块时,通过将android.dynamicFeatures属性添加到基础模块的build.gradle文件,它使基本模块可见,如下所示:

// In the base module’s build.gradle file.android {    ...    // Specifies dynamic feature modules that have a dependency on    // this base module.    dynamicFeatures = [":dynamic-feature", ":dynamic-feature2"]}
此外,Android Studio将基本模块作为动态功能模块的依赖项,如下所示:
// In the dynamic feature module’s build.gradle file:...dependencies {    ...    // Declares a dependency on the base module, ':app'.    implementation project(':app')}

指定其他ProGuard规则

虽然只有基本模块的构建配置可以为您的应用项目启用代码缩减,但可以使用proguardFiles属性为每个动态功能模块提供自定义ProGuard规则 ,如下所示。

android.buildTypes {
     release {
         // You must use the following property to specify additional ProGuard
         // rules for dynamic feature modules.
         proguardFiles 'proguard-rules-dynamic-features.pro'
     }
}

部署您的应用

在开发支持动态交付的应用程序时,可以像往常一样通过从菜单栏选择“运行”>“运行”(或单击工具栏中的“运行 ),将应用程序部署到连接的设备 。

附:谷歌官方示例 https://github.com/googlesamples/android-dynamic-features

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容