在游戏变得日益复杂的今天,一根加载进度条不再仅仅只是开启冒险的倒计时,更是连接玩家与开发者的信使。
玩家们总是希望游戏能马上加载完毕,这意味着 "加载" 这件事情本身也有轻重缓急: 游戏开始几分钟内会被用到的资源需要打包进 APK,其他的内容则等玩家启动游戏后在后台下载。
运营总是希望游戏里有数不清的新花样,这意味着 "变化" 这件事情本身成为了 "常态": 不同的节日需要不同的开屏和主题风格,甚至连游戏的观感都要让玩家觉得 "啊,原来今天也是重要的一天呢"。
卓盟科技的乐变游戏分包服务,通过在游戏加载及运行时动态下载并插入新资源,来帮助游戏开发者满足玩家的需求。
网易的《流星群侠传》、龙渊的《多多自走棋》、紫龙的《梦幻模拟战》、游族的《少年三国志2》……等诸多厂商的游戏,带给玩家们的体验也各不相同。但它们有一个共同点: 都使用卓盟科技的乐变游戏分包服务来动态加载资源。
甚至就连卓盟科技自己,也需要借助动态加载资源来为自家 SDK 的用户们——也就是游戏厂商——提供更好的开发体验。比如让 SDK 的集成尽量简单,以及在需要调整 SDK 内部资源的时候提供快捷修复,无需开发者们更新 SDK。
在 Android 11 提供 ResourcesLoader 接口之前,卓盟科技打造动态资源加载的过程并不轻松。
旧版解决方案
当卓盟科技开始构建其产品时,Android 并没有公开接口支持动态资源加载的用例。团队尽了最大的努力,最终使用了非公开接口添加外部资源。虽然这个实现满足了技术需求,但其实非常脆弱——它依赖于非公开接口,这些接口的兼容性保证远远低于官方公开 SDK,并且随时可能在没有提前通知的情况下被更改或删除。
卓盟科技发现,随着每次 Android 新版本的发布,兼容性问题会意外出现。这些都需要进行额外的测试和开发,以确保产品的稳定性。经过多次迭代团队一共花费了 6 个工程师*月和大量的代码将其解决方案稳定下来,同时理解它可能还会在下一个 Android 版本中再出问题。随着 Android 严格限制非公开接口以提升应用的稳定性和兼容性,卓盟科技需要移除对那些非公开接口的依赖。
限制非公开接口
https://developer.android.google.cn/distribute/best-practices/develop/restrictions-non-sdk-interfaces
可持续的解决方案
在双方的多次沟通和持续协作下,Android 11 中首次发布了支持动态资源加载的公开接口。卓盟科技已经迁移至新的 ResourcesLoader 接口,并获得了生产率和产品质量的大幅提升。卓盟科技认为 ResourcesLoader 接口具有以下优势:
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 之后,核心代码只需几行
性能提升
共执画笔,共绘良图
"依靠 Android 平台,我们开发了一些有价值的产品和服务,这些产品也支撑着我们持续在 Android 平台投入更多的资源去开发更多创新的产品。" 卓盟科技表示,"希望能有更多的机会参与到 Android 生态的建设中,贡献我们的绵薄之力,让 Android 对消费者更易用,对开发者更轻松。"
卓盟科技致力于提升其解决方案的长期兼容性。迁移至 ResourcesLoader 公开接口提升了稳定性和运行性能、简化了代码复杂性、降低了未来 Android 系统上的兼容性风险。更为重要的是,由于 ResourcesLoader 是 Android 11 中的公开接口,整个 Android 开发者社区都可以利用它来获得收益。
Android 团队一如既往地重视开发者的反馈和创造力。动态资源加载接口的诞生,与开发者的支持与合作密不可分。我们也期待更多的开发者和卓盟科技一样,在 Android 生态中挥洒创意、创造价值、收获成功,同时也帮助 Android 成为开发者和用户们的绝佳平台!
推荐阅读