Android 打包AAB+PAD(java篇)(上)

简介: AABPlay Asset Delivery分发模式资源更新纹理压缩格式定位应用版本更新下载大小上限针对Java 代码构建

AAB


       Android App Bundle 是 Android 新推出的一种官方发布格式,可让你以更高效的方式开发和发布应用。借助 Android App Bundle,你可以更轻松地以更小的应用提供优质的使用体验,从而提升安装成功率并减少卸载量。转换过程轻松便捷。你无需重构代码即可开始获享较小应用的优势。改用这种格式后,你可以体验模块化应用开发和可自定义功能交付,并从中受益。


Play Asset Delivery


       Play Asset Delivery (PAD) 将 app bundle 的优势带到游戏中。它允许超过 150 MB 的游戏替换旧版扩展文件 (OBB),方法是将包含游戏所需的所有资源的单个工件发布到 Play。PAD 提供了灵活的分发模式、自动更新、压缩和增量修补功能,并且可免费使用。使用 PAD,所有资源包均在 Google Play 上托管和提供,因此你无需使用内容分发网络 (CDN) 向玩家提供游戏资源。


       Play Asset Delivery 使用资源包,资源包由资源(如纹理、着色器和声音)组成,但不包含可执行代码。通过 Dynamic Delivery,你可以按照以下三种分发模式自定义如何以及何时将各个资源包下载到设备上:安装时分发、快速跟进式分发和按需分发。


微信图片_20220521110114.png


分发模式


      install-time 资源包在用户安装应用时分发。这些资源包以拆分 APK(APK 集的一部分)的形式提供。它们也称为“预先”资源包;你可以在应用启动时立即使用这些资源包。这些资源包会增加 Google Play 商店上列出的应用大小。用户无法修改或删除这些资源包。


      fast-follow 资源包会在用户安装应用后立即自动下载;用户无需打开应用即可开始 fast-follow 下载。此类下载不会阻止用户访问应用。这些资源包会增加 Google Play 商店上列出的应用大小。


      on-demand 资源包会在应用运行时下载。


       Google Play 商店会以归档文件(而非拆分 APK)的形式提供配置为 fast-follow 和 on-demand 的资源包。这些资源包随后会在应用的内部存储空间中展开。你可以使用 Play Core API 查询以这种方式提供的资源包的位置。应用无法假设这些文件的存在或其位置,因为它们可能会被用户删除,或由 Play Core SDK 在游戏会话之间移动。尽管这些文件可由应用写入,你也应将其视为只读文件,因为资源包补丁程序依赖于这些文件的完整性。


资源更新


       更新应用时,install-time Asset Pack 会作为基础应用更新的一部分进行更新(开发者无需执行任何操作)。


对于 fast-followon-demand Asset Pack 的应用更新,则遵循以下步骤:


  • 1、系统将应用的补丁程序(包括所有资产)下载到设备上的安全位置。


  • 2、更新应用二进制文件;这包括所有 install-time Asset Pack。


  • 3、之前下载的所有 Asset Pack 变为无效。


  • 4、将资产的补丁程序复制并应用到存储在应用内部存储空间中的资产。


       在大多数情况下,当用户打开游戏时,整体更新已完成,用户可以立即开始玩更新后的版本。在极少数情况下,当用户打开应用时,应用二进制文件可能已完成更新,但资产的补丁程序应用过程尚未完成,因此用户尚无法访问这些资产。为了应对此类情形,你需要针对这些资产提供相应的“正在更新”界面元素,或构建逻辑来处理尚无法访问的无效资源。由于只有在所有 Asset Pack 类型均已下载后,应用二进制文件才会更新,因此补丁程序的应用操作会在本地以离线方式进行,且应快速完成。


纹理压缩格式定位


       纹理压缩是一种有损图像压缩,可让 GPU 使用专用硬件直接从压缩纹理进行渲染,从而减少所需的纹理内存和内存带宽用量。借助纹理压缩格式定位功能,你可以在 Android App Bundle 中添加使用多种纹理压缩格式压缩的纹理,并且依靠 Google Play 自动为每种设备提供采用最佳纹理压缩格式的资源。


应用版本更新


       新版本的应用上传到 Google Play 后,如果用户未在设备上更新该应用,他们可以打开之前的应用版本。在这种情况下,如有必要,应用可以通过调用 In-App Updates API 选择强制更新或建议更新。借助此 API,你可以从应用内触发更新,而不是让用户从 Google Play 商店触发更新。


下载大小上限


Asset Pack 因具有较高的大小上限而成为大型游戏的理想之选:


  • 1、每个 fast-follow 和 on-demand Asset Pack 的下载大小上限为 512 MB。


  • 2、所有 install-time Asset Pack 的总下载大小上限为 1 GB。


  • 3、一个 Android App Bundle 中的所有 Asset Pack 的总下载大小上限为 2 GB。


  • 4、一个 Android App Bundle 中最多可以使用 50 个资源包。


如果你使用的是纹理压缩格式定位,那么这些下载限制会分别应用于每个独一无二的纹理格式。


针对Java 代码构建


       你可以按照以下步骤将 Play Asset Delivery 内置到项目的 Android App Bundle 中。你无需使用 Android Studio 即可执行这些步骤。


1、将 Play Core 库导入项目。


// In your app’s build.gradle file:
...
dependencies {
    // This dependency is downloaded from the Google’s Maven repository.
    // So, make sure you also include that repository in your project's build.gradle file.
    implementation 'com.google.android.play:core:1.10.0'
    // For Kotlin users also add the Kotlin extensions library for Play Core:
    implementation 'com.google.android.play:core-ktx:1.8.1'
    ...
}


Play Core KTX 库是可选的,为常规 Play Core 库中的异步方法调用提供了 Kotlin 协程版本,并且提供了其他有用的扩展,使得从 Kotlin 使用 API 更为得心应手。


  • 2、在项目的 build.gradle 文件中将 Android Gradle 插件的版本更新为4.0.0 或更高版本。


  • 3、在项目的顶级目录中,为 Asset Pack 创建一个目录。此目录名称将用作 Asset Pack 名称。Asset Pack 名称必须以字母开头,并且只能包含字母、数字和下划线


  • 4、在 Asset Pack 目录中,创建一个 build.gradle 文件并添加以下代码。请务必指定 Asset Pack 的名称,并且仅指定一种分发类型:


// In the asset pack’s build.gradle file:
apply plugin: 'com.android.asset-pack'
assetPack {
    packName = "asset-pack-name" // Directory name for the asset pack
    dynamicDelivery {
        deliveryType = "[ install-time | fast-follow | on-demand ]"
    }
}


  • 5、在项目的应用 build.gradle文件中,添加项目中每个 Asset Pack 的名称,如下所示:


// In the app build.gradle file:
android {
    ...
    assetPacks = [":asset-pack-name", ":asset-pack2-name"]
}


  • 6、在项目的 settings.gradle 文件中,添加项目中的所有 Asset Pack,如下所示:


// In the settings.gradle file:
include ':app'
include ':asset-pack-name'
include ':asset-pack2-name'


  • 7、在 Asset Pack 目录中,创建以下子目录:src/main/assets。


  • 8、将资产放置在 src/main/assets 目录中。你也可以在此处创建子目录。应用的目录结构现在应如下所示:


  • 1)build.gradle


  • 2)settings.gradle


  • 3)app/


  • 4)asset-pack-name/build.gradle


  • 5)asset-pack-name/src/main/assets/your-asset-directories


  • 9、使用 Gradle 构建 Android App Bundle。在生成的 app bundle 中,根级目录现在包含以下内容:


  • 1)asset-pack-name/manifest/AndroidManifest.xml:配置 Asset Pack 的标识符和分发模式


  • 2)asset-pack-name/assets/your-asset-directories:此目录包含作为 Asset Pack 的一部分分发的所有资产


Gradle 会为每个 Asset Pack 生成清单,并为你输出 assets/ 目录。


  • 10、(可选)配置 App Bundle 以支持不同的纹理压缩格式。


常见的纹理压缩格式:


  • DDS 或 S3TC:有时称为 DXTC 或 DXTn。OpenGL 支持此格式的三种形式。


  • ETC1:大多数设备都支持此格式。这种格式不支持透明度,但游戏可将第二个纹理文件用于 Alpha 通道组件。


  • ETC2:支持 GLES3 的所有设备均支持此格式。


  • PVRTC:iOS 游戏常用的格式,在某些 Android 设备上也受支持。


  • ASTC:专为取代之前的格式而设计的新格式。比先前的格式更加灵活,因为它支持各种块大小。使用这种格式可以帮助你优化游戏大小。


支持的格式及支持相应格式设备所占的百分比:


微信图片_20220521110801.png

相关文章
|
1月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
45 4
|
2月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
36 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
1月前
|
Java Maven Android开发
【Azure Developer】VS Code打包Java maven Project 遇见 BUILD FAILURE
Unknown lifecycle phase "lean". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>
|
2月前
|
Java Maven 数据安全/隐私保护
如何实现Java打包程序的加密代码混淆,避免被反编译?
【10月更文挑战第15天】如何实现Java打包程序的加密代码混淆,避免被反编译?
114 2
|
2月前
|
Java C++
做了个Java打包工具,可以双击启动了!
本文介绍了作者日常使用Java和Swing进行开发的经验,以及Java程序分发时遇到的问题,如需要JRE环境。文中列举了几种常见的Java程序打包方法,并对比了各自的优缺点,最后作者结合这些方案,利用Winform开发了一款工具,将Java程序打包成二进制可执行文件,简化了分发流程。
做了个Java打包工具,可以双击启动了!
|
2月前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
128 4
|
4月前
|
安全 Java Android开发
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
如何解压OTA升级包、编辑升级包内容(例如移除不需要更新的分区)、重新打包、签名以及验证OTA文件的过程。
355 2
【Android P】OTA升级包定制,移除不需要更新的分区,重新打包签名
|
3月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
163 1
|
4月前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
4月前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
85 1