Android 打包AAB+PAD(java篇)

总结

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **

下面有部分截图希望能对大家有所帮助。

在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

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

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

Play Core API 集成


请务必先将 Play Core 库添加到你的项目中。

Play Core Java API 提供了用于请求资源包、管理下载内容和获取资源的 AssetPackManager 类。请务必先将 Play Core 库添加到你的项目中。 你可以根据希望获取的资源包的分发类型来实现此 API。这些步骤如以下流程图所示。

注意: 用于获取 install-time Asset Pack 的 API 与用于获取 fast-follow 和 on-demand Asset Pack 的 API 不同

安装时分发

配置为 install-time 的资源包可以在应用启动后立即使用。使用 Java AssetManager API 获取在此模式下提供的资产:

import android.content.res.AssetManager;

Context context = createPackageContext(“com.example.app”, 0);

AssetManager assetManager = context.getAssets();

InputStream is = assetManager.open(“asset-name”);

快速跟进式分发和按需分发

以下几部分介绍了如何在下载 Asset Pack 前获取其相关信息、如何调用 API 以开始下载,以及之后如何获取已下载的 Asset Pack。这几部分适用于 fast-follow 和 on-demand Asset Pack。

查看状态

每个资源包都存储于应用的内部存储空间内单独的文件夹中。使用 getPackLocation() 方法确定 Asset Pack 的根文件夹。此方法会返回以下值:

  • 有效的AssetPackLocation对象:资源包根文件夹位于 assetsPath(),现已可立即获取

  • null:未知 Asset Pack 或资产无法使用

**注意:**请勿依赖在两次应用启动之间的间隔时间内缓存的 Asset Pack 位置。应用应在每次启动时始终检查是否存在 Asset Pack。Asset Pack 可能会因应用更新或用户清除应用数据而变为无效。

获取有关资源包的下载信息

在提取资源包之前,应用必须披露下载内容的大小。使用getPackStates() 方法确定下载内容的大小,以及资源包是否已在下载。

Task getPackStates(List packNames)

getPackStates() 是用于返回任务的异步方法。该任务的结果包含一个 AssetPackStates 对象。AssetPackStates 对象的 packStates() 方法会返回一个 Map<String, AssetPackState>。此映射包含所请求的每个 Asset Pack 的状态,按其名称进行键控:

Map<String, AssetPackState> AssetPackStates#packStates()

最终请求如下所示:

final String assetPackName = “myasset”;

assetPackManager

.getPackStates(Collections.singletonList(assetPackName))

.addOnCompleteListener(new OnCompleteListener() {

@Override

public void onComplete(Task task) {

AssetPackStates assetPackStates;

try {

assetPackStates = task.getResult();

AssetPackState assetPackState =

assetPackStates.packStates().get(assetPackName);

} catch (RuntimeExecutionException e) {

Log.d(“MainActivity”, e.getMessage());

return;

})

以下 AssetPackState 方法提供了资源包的大小、截至目前已下载的数据量(如已请求),以及已传输到应用的数据量:

  • totalBytesToDownload()

  • bytesDownloaded()

  • transferProgressPercentage()

如需获取资源包的状态,请使用 status() 方法,该方法以整数形式返回与 AssetPackStatus 类中某个常量字段相对应的状态。尚未安装的资源包状态为 AssetPackStatus.NOT_INSTALLED

如果请求失败,请使用 errorCode() 方法,该方法的返回值与 AssetPackErrorCode 类中的某个常量字段相对应。

安装

使用 fetch() 方法首次下载资源包,或要求进行资源包更新以完成操作:

Task fetch(List packNames)

此方法会返回一个 AssetPackStates 对象,其中包含资源包列表及其初始下载状态和大小。如果通过 fetch() 请求的 Asset Pack 已经在下载,就会返回下载状态,并且不会启动其他下载。

**注意:**在大多数情况下,你需要实现 listener 以跟踪下载和安装过程,如下一部分所述。

监控下载状态

你应实现 listener 以跟踪 Asset Pack 的安装进度。状态更新按 Asset Pack 细分,以支持跟踪各 Asset Pack 的状态。在请求的所有其他下载完成之前,你就可以开始使用已可供使用的资源包。

  • void registerListener(AssetPackStateUpdatedListener listener)

  • void unregisterListener(AssetPackStateUpdatedListener listener)

注意: 在用户安装或更新应用后,Play 商店会自动触发下载任何 fast-follow 资源包。不过,这些资源包可能无法立即供用户使用。你必须在每次应用启动时检查 fast-follow Asset Pack 的状态。如果下载正在进行,请使用监听器对其进行监控。如果下载已取消或暂停,你可以使用 fetch() 方法恢复下载,如安装部分所述。

下载内容较大

如果下载内容超过150MB并且用户未连接到 WLAN,那么在用户明确同意使用移动网络连接继续下载前,下载不会开始。同样,如果下载内容较大并且用户与 WLAN 的连接断开,下载会暂停,需要用户明确同意才能使用移动网络连接继续下载。已暂停的 Asset Pack 状态为 WAITING_FOR_WIFI。如需触发界面流程以提示用户同意,请使用 showCellularDataConfirmation() 方法。

请注意,如果应用不调用此方法,下载会暂停,并且只有当用户重新连接到 WLAN 时才会自动恢复下载。

以下是监听器的一个实现示例:

assetPackStateUpdateListener = new AssetPackStateUpdateListener() {

@Override

public void onStateUpdate(AssetPackState assetPackState) {

switch (assetPackState.status()) {

case AssetPackStatus.PENDING:

Log.i(TAG, “Pending”);

break;

case AssetPackStatus.DOWNLOADING:

long downloaded = assetPackState.bytesDownloaded();

long totalSize = assetPackState.totalBytesToDownload();

double percent = 100.0 * downloaded / totalSize;

Log.i(TAG, “PercentDone=” + String.format(“%.2f”, percent));

break;

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

d();

double percent = 100.0 * downloaded / totalSize;

Log.i(TAG, “PercentDone=” + String.format(“%.2f”, percent));

break;

面试资料整理汇总

[外链图片转存中…(img-Yh1gFVml-1715807776789)]

[外链图片转存中…(img-69XUuhGD-1715807776789)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 17
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值