submodule + gradle配置实现动态打包

2023年6月28日10:07:16

项目背景

最近的项目是一个通用的播放框架。内部集成了目前市面上主流的视频网站的播放sdk,比如爱奇艺、腾讯、华数等。另外,还需要支持明流的url播放。这个通用的播放框架需要在多个项目中使用,各个项目需要支持的播放方式也是不一样的。有的项目只需要支持url播放,有的项目需要支持所有的播放方式。如果统一的只提供一个jar或者aar,将导致只需要url播放的应用也需要集成一个巨大无比的库。而且,这个库里,so和资源文件体积都很大,无法通过proguard的方式减小体积。所以,有必要实现一种简单的方式,让项目能够自己配置需要集成的第三方库,以支持多个项目不同的播放需求。


如何集成?

普通的maven方式集成第三方库简单方便,但是无法实现上述需求。当然,你可以自己设计一个专门的打包脚本,针对多个不同的需求,打包不同的第三方sdk,然后上传到maven仓库给其它项目使用。但是随着需求的复杂化和集成第三方sdk的增多,你需要维护的库文件将指数级增长。submodule集成第三方库提供了一种相当灵活的集成方式。但是并没有解决上一节中提到的问题。


如何动态配置依赖?

下面以第一节提到的播放框架来做示例。在这个示例中,播放框架支持url、wasu、qiyi和tencent共四种视频资源的播放,demo中只配置了其中的3种url、wasu和qiyi,tencent的sdk并未被打包到demo中。

  • 项目结构如下图:
    submodule + gradle配置实现动态打包

    BaseLibs是一个被很多项目依赖的项目,内部包含了一个测试demo、一个logger模块和一个widget模块。widget就是我们在第一节中提到的统一播放框架。

  • widget模块的目录结构如下图:
    submodule + gradle配置实现动态打包

    src目录存放播放框架的代码,sdk目录存放第三方sdk的so、jar和assets,libs里存放框架代码必须依赖的jar和aar文件。

  • widget模块的gradle配置如下图:
    submodule + gradle配置实现动态打包

    图中的配置,省略了通用配置,只列出了3个关键部分。

    1、从gradle.ext中获取外部定义的video_licenses数据。如果外部没有定义,则取默认的licenses。
    2、sourceSets中,遍历licenses数组,并针对每一个license,将其对应的so库和assets文件加入编译。
    3、dependencies中,遍历所有的licenses,针对每一个license对应的jar文件,根据配置采用provided或者compile方式编译打包。

  • demo模块的gradle配置如下图:
    submodule + gradle配置实现动态打包


总结

结合submodule集成第三方库和gradle的配置脚本,轻松实现了按需打包。

  • 作者:47045039
  • 原文链接:https://blog.csdn.net/mountains2001/article/details/72639987
    更新时间:2023年6月28日10:07:16 ,共 1080 字。