Android: A Comprehensive Compilation of Knowledge about AAB

访客 196 0

2018年,谷歌推出了Android App Bundle(AAB)技术。随后,谷歌发布通知称,从2021年8月开始,在Google Play上发布新应用时必须使用Android App Bundle。

这意味着在以GP为主要平台的海外版本中,使用aab成为必要。那么aab和apk有何区别呢?

aab官方介绍:https://developer.android.com/guide/app-bundle

aab是一个包含多个分包数据的压缩文件,它将apk拆分成多个小包,例如按照CPU架构和语言等进行拆分。这样,在移动设备安装时只需下载所需的分包即可。

APK可以直接安装到用户设备上,而AAB只是一种发布格式,因此无法直接安装。不过,我们可以通过使用bundletool命令行来连接设备并进行模拟安装。

技术细节

aab的数据格式

如前所述,aab实际上是一个压缩包,其中包含了一系列的文件。下方图示展示了aab文件内部的构成:

aab │ BundleConfig.pb ├─base │ │ assets.pb │ │ native.pb │ │ resources.pb ├─assets ├─dex │ classes.dex ├─lib │ └─armeabi-v7a │ libmain.so │ libmonobdwgc-2.0.so │ libMonoPosixHelper.so │ libunity.so ├─manifest AndroidManifest.xml └─res BUNDLE-METADATA └─com.android.tools.build.libraries dependencies.pb META-INF ANDROIDD.RSA ANDROIDD.SF MANIFEST.MF

抱歉,由于您没有提供具体的段落内容,我无法为您进行改写。如果您能提供相关的文本或问题,我将非常乐意帮助您进行编辑和修改。

aab的存在目的是为了将一系列apk文件拆分开来。为了成功进行拆分,首先需要收集数据文件,并对其进行整理,明确每个文件的作用。此外,还需要配置拆分规则。

以下地址包含了所有pb文件的数据结构: 其中所有的pb文件,其数据结构都可以在以下地址找到:

请访问以下链接以获取有关Google Bundletool的更多信息:https://github.com/google/bundletool/blob/master/src/main/proto

base目录

在base目录下,我们会发现许多文件和apk大部分相同,然而它们的用途稍有不同。

数据文件

  • manifest.xml:它和apk中的一样,都是一些配置项。但不同的是,apk中这个文件是二进制的格式,而aab中用的是pb格式。
  • res目录/assets目录/libs目录/dex目录:和apk是相同的组织形式,唯一的区别是res目录下的配置文件,全部也是用的pb格式

标记数据

  • assets.pb
  • native.pb
  • resources.pb

在base目录中,assets.pb、native.pb和resources.pb是非常重要的内容。它们详细列出了base目录下所有文件的组成信息,例如某个文件适用于特定的屏幕密度(如HDPI、XHDPI、XXHDPI等),或者某个so文件适用于特定的CPU架构等等。有了这些数据,在进行apk拆分时,可以将不同类型的文件分别放入不同的apk中。

BundleConfig.pb

buildconfig用于配置拆分的规则,见请访问以下链接以获取有关Google Bundletool的更多信息:https://github.com/google/bundletool/blob/master/src/main/proto/config.protoh

这段话中还包含许多优化项目,其中一些在使用gradle打包aab时会影响到buildconfig的数据,例如UncompressNativeLibraries。

请参阅以下链接以了解有关Gradle插件4.0.0的问题:https://developer.android.com/studio/releases/gradle-plugin#4-0-0-issues

当构建 Android App Bundle 时,生成的 APK 现在默认包含未压缩版本的原生库。这项优化无需设备创建库的副本,从而减少了应用占用的存储空间。如果您想要停用此优化,请在 gradle.properties 文件中添加以下代码:

android.bundle.enableUncompressedNativeLibs = false可以改写为:将android.bundle.enableUncompressedNativeLibs设置为false。

在gradle工程中,另一个影响拆分配置的因素是build.gradle文件中的bundle模块(例如unity2018默认生成)。

合并 {

language {

 设置 enableSplit 为 false

    }

密度 {

设置 enableSplit 为 false

    }

abi {改写为: Abi {

将“enableSplit = true”改写为“启用拆分功能 = true”。

    }

}                                                                                                                                                                                               

这将影响最终的拆包,不会进行语言和密度的拆分。如果在Unity中使用多国语言或多个屏幕密度,可以在PlayerSetting的Publishing Setting中勾选Custom Gradle Template,并修改该值。

请注意:如果您使用bundletool打包aab文件,由于缺少gradle相关的文件,您需要修改buildconfig.json并添加配置项UncompressNativeLibraries=false。更多详情请参考使用bundletool打包aab文件的方法。

2、拆分apk:aab到apks

在Android Lollipop及以上版本中,引入了Split APKs功能。这个功能允许一个应用程序可以分散在多个APK文件中,但在运行时仍然表现为一个完整的程序。因此,使用aab格式的应用捆绑包可以利用这一机制,将aab文件拆分成多个APK文件,并根据用户设备的需求来按需安装必要的APK文件。

通常,aab文件会根据屏幕密度、CPU架构和本地化语言进行拆分。这样一来,用户就不会下载无用的资源,从而大大减少下载内容的大小,并提高下载效率。

Android: A Comprehensive Compilation of Knowledge about AAB-第1张图片-谷歌商店上架

当您在GP平台上进行下载安装,或者使用BundleTool安装APKs时,整个过程如下所示。

平台或bundletool将首先检测系统是否支持SplitApk功能,即设备的Android版本是否高于或等于Android Lolipop。

如果具备该功能,将根据设备的屏幕密度、CPU架构和本地化语言下载相应的分包。

Android: A Comprehensive Compilation of Knowledge about AAB-第2张图片-谷歌商店上架

使用bundletool工具,可以将aab文件转换为一个名为apks的压缩包。

在这个包中,文件结构如下(为了简洁起见,删除了一些本地化语言的apk)。你可以在splits文件夹下找到许多分包apk。

在Android lolipop之前,我们将使用standlones中的apk。

以下是改写后的文本:

apks
│  toc.pb
├─splits
│      base-af.apk
│      base-am.apk
|      base-ar.apk
|      base-arm64_v8a.apkpre|      base-armeabi_v7a.apk
pre|      base-as.apk
pre|      base-az.apk
pre|     	base-hdpi.apk
pre|     	base-ldpi. apk 
|	     	base-lo. apk 
|	     	base-lt. apk 
|	     	base-lv. apk 
|	     	base-master. apk 
|	     	base-mdpi. apk 
|	     	b ase-m k .apk /p   
p re  | 	     	b ase-tr .apk / p re   
p re  | 	     	b ase-tvdpi .apk / p re   
p re  | 	     	b ase-uk .apk / p re 
p r e   s t y l e =  w h i t e - s p a c e : n o w r a p ;    c l as s =  m i n d o c u b u f f - l i n k    d at ac h - m d u b b u f f - j s o n = ' { _l: true, _n: false } '   h r ef =  # / g v / %2 Fm%2 F%40julianbetz %2 Fminidocubuff %2 F%40master %2 Fm i n i d o c u b u f f . p r o t o    | 	base-ur.apk
|	     	base-uz.apk
|	     	base-vi.apk
|	     	base-xhdpi.apk
|	     	base-xxhdpi.apk
|	     	base-xxxhdpi. apk 
│      base-zh. apk 
│      base-zu. apk |

标签: 谷歌商店上架 文件 谷歌推出了

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~