热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

卓盟科技:动态资源加载技术的兼容性优化与升级|Android开发者案例分享

随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。

在游戏变得日益复杂的今天,一根加载进度条不再仅仅只是开启冒险的倒计时,更是连接玩家与开发者的信使。

玩家们总是希望游戏能马上加载完毕,这意味着 "加载" 这件事情本身也有轻重缓急: 游戏开始几分钟内会被用到的资源需要打包进 APK,其他的内容则等玩家启动游戏后在后台下载。

运营总是希望游戏里有数不清的新花样,这意味着 "变化" 这件事情本身成为了 "常态": 不同的节日需要不同的开屏和主题风格,甚至连游戏的观感都要让玩家觉得 "啊,原来今天也是重要的一天呢"。

卓盟科技的乐变游戏分包服务,通过在游戏加载及运行时动态下载并插入新资源,来帮助游戏开发者满足玩家的需求。

网易的《流星群侠传》、龙渊的《多多自走棋》、紫龙的《梦幻模拟战》、游族的《少年三国志2》……等诸多厂商的游戏,带给玩家们的体验也各不相同。但它们有一个共同点: 都使用卓盟科技的乐变游戏分包服务来动态加载资源。

甚至就连卓盟科技自己,也需要借助动态加载资源来为自家 SDK 的用户们——也就是游戏厂商——提供更好的开发体验。比如让 SDK 的集成尽量简单,以及在需要调整 SDK 内部资源的时候提供快捷修复,无需开发者们更新 SDK。

在 Android 11 提供 ResourcesLoader 接口之前,卓盟科技打造动态资源加载的过程并不轻松。

  • ResourcesLoader

    https://developer.android.google.cn/reference/android/content/res/loader/ResourcesLoader

旧版解决方案

当卓盟科技开始构建其产品时,Android 并没有公开接口支持动态资源加载的用例。团队尽了最大的努力,最终使用了非公开接口添加外部资源。虽然这个实现满足了技术需求,但其实非常脆弱——它依赖于非公开接口,这些接口的兼容性保证远远低于官方公开 SDK,并且随时可能在没有提前通知的情况下被更改或删除。

卓盟科技发现,随着每次 Android 新版本的发布,兼容性问题会意外出现。这些都需要进行额外的测试和开发,以确保产品的稳定性。经过多次迭代团队一共花费了 6 个工程师*月和大量的代码将其解决方案稳定下来,同时理解它可能还会在下一个 Android 版本中再出问题。随着 Android 严格限制非公开接口以提升应用的稳定性和兼容性,卓盟科技需要移除对那些非公开接口的依赖。

  • 限制非公开接口

    https://developer.android.google.cn/distribute/best-practices/develop/restrictions-non-sdk-interfaces

可持续的解决方案

随着 Android 系统团队越来越专注于帮助应用迁移到公开接口的工作,卓盟科技看到了彻底解决兼容性问题的曙光。他们联系了 Android 团队来提供反馈,说明他们的具体用例和对公开接口的详细需求。

在双方的多次沟通和持续协作下,Android 11 中首次发布了支持动态资源加载的公开接口。卓盟科技已经迁移至新的 ResourcesLoader 接口,并获得了生产率和产品质量的大幅提升。卓盟科技认为 ResourcesLoader 接口具有以下优势:

  • 使用简单。开发团队两天内便完成了从现有方案至新方案的切换及测试。

  • 性能无损。和直接将资源内置在包内相比并无降低 (某些场景下甚至有提高,因为包内的部分资源是压缩的,而通过 ResourcesLoader 添加进去的资源是非压缩的)。

  • 开发高效。以前的方案需要高级工程师先去了解 AssetManager 的原理,找到对应的私有接口及其在各个系统版本上的实现细节;同时需要掌握 zip 文件结构等和 Android 开发无关的技术细节。而使用新的公开接口后,一个能看懂文档的初级工程师即可轻松应对。

  • 维护简单。之前的方案为了兼容各种情况,累计代码行数超过 1,000 行,而新的方案代码仅几行即可!

  • 向前兼容。通过使用 Android 官方支持的公开接口,开发者的解决方案将在未来的 Android 平台上具有更好的兼容性。

String sdkroot = getApplicationInfo().dataDir + "/lebian";
ResourcesLoader rl = new ResourcesLoader();
rl.addProvider(ResourcesProvider.loadFromDirectory(sdkroot, null));
Resources res = getResources();
res.addLoaders(rl);
final AssetManager assetManager = res.getAssets();

△ 使用 ResourcesLoader API 之后,核心代码只需几行

性能提升

卓盟科技以 16,028 个文件 (总大小 1.47GB,压缩后为 1.36GB) 为例,使用四种加载方案进行测试:

  • 直接从 APK 中读取

  • 使用某些私有接口加载目录后读取

  • 使用 ResourcesLoader 接口加载 APK 后读取

  • 使用 ResourcesLoader 接口加载目录后读取

前三种方案都对资源文件进行了压缩,平均加载时间都在 19 秒左右;而方案四通过 ResourcesLoader 加载目录后直接读取未压缩的资源,平均加载时间仅为 3 秒左右,性能提高了 6 倍!

卓盟科技首席执行官兼产品负责人黄杲总结了这套新接口的作用: "新的 ResourcesLoader 接口大大降低了开发和维护成本,使我们能够更加专注于产品和业务创新。"

共执画笔,共绘良图

△ 卓盟科技团队

"依靠 Android 平台,我们开发了一些有价值的产品和服务,这些产品也支撑着我们持续在 Android 平台投入更多的资源去开发更多创新的产品。" 卓盟科技表示,"希望能有更多的机会参与到 Android 生态的建设中,贡献我们的绵薄之力,让 Android 对消费者更易用,对开发者更轻松。"

卓盟科技致力于提升其解决方案的长期兼容性。迁移至 ResourcesLoader 公开接口提升了稳定性和运行性能、简化了代码复杂性、降低了未来 Android 系统上的兼容性风险。更为重要的是,由于 ResourcesLoader 是 Android 11 中的公开接口,整个 Android 开发者社区都可以利用它来获得收益。

Android 团队一如既往地重视开发者的反馈和创造力。动态资源加载接口的诞生,与开发者的支持与合作密不可分。我们也期待更多的开发者和卓盟科技一样,在 Android 生态中挥洒创意、创造价值、收获成功,同时也帮助 Android 成为开发者和用户们的绝佳平台!


推荐阅读




 点击屏末  | 查看更多开发者精彩故事



推荐阅读
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 深入解析Serverless架构模式
    本文将详细介绍Serverless架构模式的核心概念、工作原理及其优势。通过对比传统架构,探讨Serverless如何简化应用开发与运维流程,并介绍当前主流的Serverless平台。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文将详细介绍多个流行的 Android 视频处理开源框架,包括 ijkplayer、FFmpeg、Vitamio、ExoPlayer 等。每个框架都有其独特的优势和应用场景,帮助开发者更高效地进行视频处理和播放。 ... [详细]
  • 离线安装Grafana Cloudera Manager插件并监控CDH集群
    本文详细介绍如何离线安装Cloudera Manager (CM) 插件,并通过Grafana监控CDH集群的健康状况和资源使用情况。该插件利用CM提供的API接口进行数据获取和展示。 ... [详细]
  • 为了解决不同服务器间共享图片的需求,我们最初考虑建立一个FTP图片服务器。然而,考虑到项目是一个简单的CMS系统,为了简化流程,团队决定探索七牛云存储的解决方案。本文将详细介绍使用七牛云存储的过程和心得。 ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 主调|大侠_重温C++ ... [详细]
  • 本文详细介绍了如何在Python3环境中配置Appium1.4.6,并指导如何连接模拟器进行自动化测试。通过本文,您将了解从环境搭建到模拟器连接的完整流程。 ... [详细]
  • 本文详细介绍了JSP(Java Server Pages)的九大内置对象及其功能,探讨了JSP与Servlet之间的关系及差异,并提供了实际编码示例。此外,还讨论了网页开发中常见的编码转换问题以及JSP的两种页面跳转方式。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • Android Studio 中 Gradle 使用的常见问题与解决方案
    本文探讨了在使用 Android Studio 进行开发时,遇到的与 Gradle 相关的问题,包括每次打开项目都需要下载 Gradle 和 Gradle 插件依赖包下载失败或卡顿等问题,并提供了详细的解决方法。 ... [详细]
  • 随着技术社区的发展,越来越多的技术爱好者选择通过撰写博客来分享自己的学习经验和项目进展。本文将介绍一个具体案例,即将一套原本运行于Windows平台的代码成功移植到Linux(Redhat)环境下的过程与挑战。 ... [详细]
  • 本文详细介绍了如何正确安装Java EE SDK,并解决在安装过程中可能遇到的问题,特别是关于servlet代码在Apache Tomcat 10中无法运行的情况。 ... [详细]
author-avatar
一个字-刘斌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有