卓盟科技: 动态资源加载技术背后的兼容性升级 | Android 开发者故事

稜镜组合
• 阅读 1654

卓盟科技: 动态资源加载技术背后的兼容性升级 | Android 开发者故事

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

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

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

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

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

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

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

旧版解决方案

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

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

可持续的解决方案

随着 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 生态的建设中,贡献我们的绵薄之力,让 Android 对消费者更易用,对开发者更轻松。"

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

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

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
一篇文章教会你使用JS+CSS实现一个简单加载进度条的效果
大家好,我是前端进阶者,今天给大家来做个小项目,一起来看看吧一、前言我们经常在网页上,游戏界面加载时会看到加载进度条的效果,我们往往会以为这些加载进度条的效果,很难实现。今天教大家JSCSS结合做简单一个加载进度条的效果。二、项目准备软件:HBuilderX。三、项目实现1\.body创建2个div,外部div添加id"progress"属
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
浩浩 浩浩
4年前
Android平台的崩溃捕获
1、简述在日常开发中,崩溃日志的捕获,至关重要。有一个好的日志,有利于开发者快速定位问题并解决。对于Android平台,我们可以使用现成的产品来捕获崩溃日志,这些产品包括Bugly、Firebase、友盟等,这些产品经过多年的迭代,对于日志捕获得比较全,也有很好的兼容性。但是作为开发者,我们不能仅仅满足于使用,最好还是知道其中背后的原理。要知道原
Stella981 Stella981
3年前
Android 插件化原理解析——Activity生命周期管理
在Java平台要做到动态运行模块、热插拔可以使用ClassLoader技术进行动态类加载,比如广泛使用的OSGi技术。在Android上当然也可以使用动态加载技术,但是仅仅把类加载进来就足够了吗?Activity,Service等组件是有生命周期的,它们统一由系统服务AMS管理;使用ClassLoader可以从插件中创建Activit
Wesley13 Wesley13
3年前
vivo Y71的USB调试模式在哪里,开启vivo Y71USB调试模式的流程
就在我们使用安卓手机通过数据线连接到电脑的时候,如果手机没有开启usb开发者调试模式,电脑则没能成功识别我们的手机,部分工具也没能正常使用,此情况我们需要找解决方法将手机的usb开发者调试模式打开,以下内容我们讲解vivoY71如何开启usb开发者调试模式的方法。首先,在vivoY71应用程序界面点中“设置”ICON,进入vivoY71系统“设置”
Stella981 Stella981
3年前
Cocos Creator 资源加载流程剖析【三】——Load部分
Load流程是整个资源加载管线的最后一棒,由Loader这个pipe负责(loader.js)。通过Download流程拿到内容之后,需要对内容做一些“加载”处理。使得这些内容可以在游戏中使用。这里并不是所有的资源都需要进行一个加载处理,目前只有图片、Json、Plist、Uuid(Prefab、场景)等资源才会执行加载的流程,其他的资源在Downloa
流浪剑客 流浪剑客
1年前
Mac海洋冒险游戏:潜水员戴夫Dave The Diver中文版
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情
流浪剑客 流浪剑客
1年前
海洋冒险游戏:潜水员戴夫Dave The Diver中文激活版
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情
燕青 燕青
1年前
Mac街机赛车游戏:Agent Intercept 疾速特工 for mac破解下载
是一款充满动作和冒险的游戏,玩家扮演一名特工,驾驶着高科技的战车,在各种任务中执行特工任务。游戏注重快节奏的驾驶和射击,玩家需要在游戏中穿越各种场景,与敌人展开激烈的战斗,同时还要完成特工们的秘密任务。这款游戏拥有华丽的画面和刺激的游戏玩法,还提供了丰富的
铁扇公主 铁扇公主
1年前
海洋冒险游戏:潜水员戴夫Dave The Diver中文安装包最新
DaveTheDiver是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩
绣鸾 绣鸾
1年前
潜水员戴夫Dave The Diver for mac(海洋冒险游戏)
是一款基于物理和冒险的休闲游戏。在游戏中,玩家扮演主角Dave,一个勇敢的潜水员,探索深海中的奇妙世界。游戏的主要特点和玩法包括:冒险故事线:游戏设定在一个神秘的海洋世界中,玩家需要操纵Dave完成各种任务和挑战。随着游戏的进行,玩家将解锁新的关卡和故事情