加入收藏 | 设为首页 | 会员中心 | 我要投稿 好传媒网 (https://www.haochuanmei.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 评论 > 正文

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

发布时间:2019-07-06 15:26:11 所属栏目:评论 来源:佚名
导读:近日爱奇艺宣布开源基于Android App Bundle的动态化框架Qigsaw。以下是其官方在演讲中对项目的介绍。 我们于2019年6月26号正式开源Qigsaw。 Qigsaw是爱奇艺自主研发的动态化框架,其核心优势如下: 利用Android App Bundle开发套件,极速开发体验。 支持An

针对splits代码加载,Qigsaw采用单类加载器方式,即base APK和split APKs采用同一ClassLoader加载。

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

在DexPathList中,为每个split创建对应的ElementNativeLibraryElement实例即可。关于单类加载器更多细节,本文不再赘述,相关原理已非常成熟。

Split APKs资源加载。

Splits资源加载相较于代码加载会复杂,因为不同系统版本或不同手机厂商都会存在一些兼容性问题。

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

Android Gradle Plugin在资源打包时,会对res目录下资源文件分配一个唯一Id。

Id前两位PP为Package Id,代表应用类型。是系统应用、第三方应用、Instant App或Dynamic Feature等。

Id中间两位TT为Type,代表资源类型。是drawable、layout或string等。

Id后四位EE为Entry,代表该资源顺序。

所有第三方应用base APK资源Package Id均为7F,Android App Bundle对splits资源打包时会基于7F依次递减分配Package Id。因此,即使我们将split APKs资源添加到当前应用Resources实例中,也不会出现资源冲突问题,splits访问base资源也更加方便。

Instant Apps资源打包是基于7F依次递增。

通过Android App Bundle解决splits资源打包问题,那么splits资源如何加载呢?我们来看一段代码。

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

Qigsaw提供loadResources方法加载split APKs资源。为避免开发者写大量模板代码,Qigsaw打包插件采用字节码操作方式自动写入该方法。

Split APKs四大组件加载

Android App Bundle在Manifest文件合并过程中,会将split APKs manifest文件内容合并至base APK中。因此,所有split APKs四大组件信息都是已经声明在base APK中。

Android App Bundle这种处理方式不支持Manifest更新,例如新增四大组件,所以Qigsaw也不支持新增四大组件。在正常开发迭代过程中,动态新增splits四大组件需求极少,所以Qigsaw与Android App Bundle特性保持一致。

Split APKs安装过程

前文我们介绍了Play Core Library是如何安装、加载split APKs,Qigsaw安装、加载split APKs与Play Core Library类似。首先,通过一张图来了解。

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

在爱奇艺App运行过程中,当X进程发起安装游戏APK请求时,会经历以下步骤。

  1. X进程通过Qigsaw Core Library发起游戏APK安装请求。

  2. 当主进程收到请求后,开始下载并安装游戏APK。

  3. 在下载、安装整个过程中,Qigsaw Core Library会将整个过程所有状态返回给爱奇艺App,包括下载进度、安装结果等。

  4. 当安装完成以后,爱奇艺App就可以使用游戏APK。

Qigsaw下载、安装split APKs均在主进程处理,split APKs的加载则发生在X进程。Qigsaw安装、加载split APKs原则是,哪个进程发起split APKs安装请求,就在哪个进程加载split APKs。

Qigsaw拓展功能

在实际开发过程中,Android App Bundle所支持的功能特性并不满足我们需求。因此,Qigsaw在Android App Bundle基础上拓展了几个功能。

  1. Split APKs的Application初始化。
  2. Split APKs的Content Provider动态加载。
  3. 多进程支持。
  4. 通过Tinker patch完成split APKs热更新。

在此,我们首先介绍Qigsaw多进程功能。以下图场景为例。

爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架

依据Qigsaw安装、加载split APKs原则,当游戏APK安装完成后,就会在主进程完成加载。在游戏APK中有两个Activity,他们所处进程不同。当启动GameActivity01时,页面正常启动。但当启动GameActivity02,您的App会出现崩溃。原因是GameActivity02运行在:game进程,游戏APK仅在主进程加载,并未在:game进程加载,因此系统会抛出ClassNotFoundException异常。

为解决这类问题,Qigsaw提供了如下解决方案。

  1. 在进程启动之初即Applicatin#attachBaseContext调用时,加载所有已安装splits。
  2. Hook PathClassLoader。

第一种方案解决的场景是:game进程首次启动,即启动GameActivity02之前:game进程从未启动过。

第二种方案解决的场景是:game进程已经启动并正在运行。

(编辑:好传媒网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读