// 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;
case AssetPackStatus.TRANSFERRING:
// 100% downloaded and assets are being transferred.
// Notify user to wait until transfer is complete.
break;
case AssetPackStatus.COMPLETED:
// Asset pack is ready to use. Start the game.
break;
case AssetPackStatus.FAILED:
// Request failed. Notify user.
Log.e(TAG, assetPackState.errorCode());
break;
case AssetPackStatus.CANCELED:
// Request canceled. Notify user.
break;
case AssetPackStatus.WAITING_FOR_WIFI:
if (!waitForWifiConfirmationShown) {
assetPackManager.showCellularDataConfirmation(MainActivity.this)
.addOnSuccessListener(new OnSuccessListener () {
@Override
public void onSuccess(Integer resultCode) {
if (resultCode == RESULT_OK) {
Log.d(TAG, “Confirmation dialog has been accepted.”);
} else if (resultCode == RESULT_CANCELED) {
Log.d(TAG, “Confirmation dialog has been denied by the user.”);
}
}
});
waitForWifiConfirmationShown = true;
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/da072a170cc722df515210044c9ee1ff.jpeg)
最后
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
- 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
最后
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
[外链图片转存中…(img-JxYDVDY1-1713145764357)]
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
- 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!