admin管理员组

文章数量:1636810

1 引言

1.1 背景与需求

背景:应用是具有多个模块的模块化应用,其中一个模块的功能,是能进行端到端的视频通话(视频通话模块)。

需求:视频通话模块接入多个具有相同功能的 SDK,支持动态切换不同 SDK。

需求细化:在视频通话模块已接入一个 SDK 的情况下,需要支持动态切换不同 SDK,且不增加应用安装包的大小。

1.2 术语和缩略语

术语/缩略语

全称

说明

应用Application文章中的应用,都是指海外应用,能够访问 Google Play 下载的应用。
模块化Modular Programming模块化就是将一个程序按照其功能做拆分,分成相互独立的模块,以便于每个模块只包含与其功能相关的内容。

SDK

Software Development Kit

文章中提到的 SDK,是指具有相同功能的 SDK,它们都支持相同的业务,可以做到相互无缝切换,属于视频通话模块不可或缺的一部分。

AGPAndroid Gradle PluginAndroid 提供的 Gradle 插件。

AAB

Android App Bundle

是一种全新的 Android 应用上传格式( .aab ),它包含所有编译代码和资源。

Qigsaw

爱奇艺动态化框架爱奇艺自主研发的基于 Android App Bundle 动态化框架。

1.3 参考资料

【1】Google 官方文档- AAB 介绍:https://developer.android/guide/app-bundle

【2】Google 官方文档- AAB 打包和安装介绍:https://developer.android/studio/command-line/bundletool

【3】爱奇艺动态化框架介绍:爱奇艺开源 Qigsaw,基于 Android App Bundle 的动态化框架 - OSCHINA - 中文开源技术交流社区

【4】TCL 插件化接入流程介绍:插件化组件接入流程

【5】海外应用接入 TCL 插件后输出的风险评估:ChatNow Android 端采用插件化方案导入 THome 的风险评估

2 方案汇总

针对需求,有如下三个方案:

  • 方案一、使用 TCL 插件化方案,视频通话模块作为一个 Module,SDK 都作为插件,视频通话模块动态加载不同的 SDK 插件;
  • 方案二、使用 AAB 方案,视频通话作为一个插件,动态加载不同的 SDK 插件;
  • 方案三、使用 AAB 方案,视频通话作为一个模块,动态加载不同的 SDK 插件;

针对细化后的需求,有如下第四个方案:

  • 方案四、使用 AAB 方案,视频通话作为一个模块,在视频通话模块中集成其中一个 SDK,将其他 SDK 做成插件,再动态加载不同的 SDK 插件。

笔者注:此处罗列的方案可作为参考方向,具体实操还需要结合插件化方案和 AAB 方案的相关接入文档。

3 方案探讨

3.1 方案一

方案一会改变应用的工程配置以及 AGP 和 Gradle 配置等,具体调研方案参考此文章:ChatNow Android 端采用插件化方案导入 THome 的风险评估

小结:方案一可行,开始搬砖前需要评估对工程配置等的修改,是否会对其他模块造成影响。

3.2 方案二

需求现状:视频通话作为一个插件,默认已带有一个 SDK,需要切换为另一个 SDK。

步骤描述:应用想用视频通话功能,于是加载视频通话插件,而打开视频通话插件时想切换为另一个 SDK,调用这个 SDK 以完成视频通话功能。

问1:因为视频通话和 SDK 都是插件,想在视频通话插件里面调用 SDK 插件,据我目前所知,插件调用插件应该是不可以的,那么依赖于宿主可以去做到吗?

答1:

  • 两个插件加载成功后,就都在同一个进程的内存里了,这个时候任何一个插件都可以调用了,只要定义好协议;
  • 如果设计一个插件调用另一个插件,就把所有的插件加载成功,然后调用视频通话插件让它去加载 SDK 插件的类实现功能调用,这样也就不用视频通话插件调用宿主再调用 SDK 插件了,如果有这种需求,最好就是相关联的插件都加载好后再去做。

问2:视频通话插件大概率被下载,SDK 插件有可能就不需要下载,不太好提前定义好协议,而且看官方文档,说的是插件可以调用宿主的类,宿主不可以调用插件,是这样吗?

答2:宿主注册 SDK 插件的接口,然后由视频通话插件调用宿主,由宿主去分发。

小结:方案二待深研,对于问答1说到的定义协议,个人觉得是会复杂化问题,暂时不采取;对于问答2,也是较复杂,对于不同插件的下载和加载如果时序乱了,会导致严重的功能性bug,得不偿失,暂不深研。

3.3 方案三

直接参考文章:插件化组件接入流程 。

小结:方案三应该可行,但在验证过程中遇到了各种坑(见第四节问题解决),然后想到了方案四。 

3.4 方案四

对比方案三,此方案的视频通话模块直接默认依赖 SDK 实现功能,当需要切换 SDK 时,再加载其他 SDK 插件。减少了插件管理工作,以及简化默认 SDK 的解耦工作。

3.4.1 AAB 方案操作要点

(1)打包 .aab 文件

会在 app\build\outputs\bundle 下生成 .aab 文件。

(2)生成 .apks 文件

下载 Google 提供的 buudletool 工具,并将 .aab 文件放在同一个目录下。因为还需要打包,所以也同样将 .jks 签名文件放在同一个目录下。如下图所示:

然后进入 cmd 切换到目录下并执行如下命令即可在同目录下生成 .apks 文件(注:把命令中的3处***替换成自己 jks 签名的内容):java -jar bundletool.jar build-apks --local-testing --bundle app-Pro-release.aab --output app-Pro-release.apks --ks=tlife.jks --ks-pass=pass:*** --ks-key-alias=*** --key-pass=pass:***

命令含义参考:https://developer.android/studio/command-line/bundletool

(3)安装 .apks 文件

java -jar bundletool.jar install-apks --apks app-Pro-release.apks

(4)运行应用触发插件加载

小结:方案四可行。 

4 问题解决

4.1 华为手机 release 版本不显示进程列表

解决方式:android:debuggable="true"

为了调试方便看代码,我还关掉了混淆相关

找了很多资料才解决的,参考这篇文章:android 真机调试 DDMS 看不到进程_ddms看不到程序的包名-CSDN博客

4.2 本地打 AAB 验证,生成 AAB 没问题,安装出现如下问题

问题:signatures do not match the previously installed version; ignoring

原因:未使用相同签名

打包:java -jar bundletool.jar build-apks --local-testing --bundle app-Pro-release.aab --output app-Pro-release.apks

未指定签名,默认使用debug签名:运行提示——INFO: The APKs will be signed with the debug keystore found at 'C:\Users\binbin2.tian\.android\debug.keystore'.

修改如下:

打包:java -jar bundletool.jar build-apks --local-testing --bundle app-Pro-release.aab --output app-Pro-release.apks --ks=tlife.jks --ks-pass=pass:*** --ks-key-alias=*** --key-pass=pass:***

安装:java -jar bundletool.jar install-apks --apks app-Pro-release.apks

5 注意事项

Google Play 国内暂时用不了,所以动态 AAB 方案目前只适用于海外应用。

6 结论

从工程改动角度,方案成熟度等方面进行综合评估,最终采取方案四。

本文标签: 之路插件模块海外动态