Skip to content

JailedBird/ModuleExpose

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9d012e1 · Jan 31, 2024
Nov 15, 2023
Dec 5, 2023
Dec 7, 2023
Nov 24, 2023
Dec 7, 2023
Dec 5, 2023
Jan 5, 2024
Dec 4, 2023
Nov 28, 2023
Dec 9, 2022
Jan 31, 2024
Dec 2, 2023
Nov 13, 2023
Dec 9, 2022
Dec 9, 2022
Nov 28, 2023
Dec 7, 2023

Repository files navigation

ModuleExpose

GitHub stars GitHub forks GitHub issues GitHub license

安卓模块化最重要点就是:如何优雅的实现模块间通信;而模块之间通信往往需要获取相同的实体类或接口,导致部分涉及模块通信的实体类和接口被迫下沉到基础模块,造成 基础模块膨胀、模块代码分散、不便维护 等问题;

快速接入

以kts版本为例展示,gradle版本、详细用法请参考对应维基文档;

方式1:克隆本项目,将本项目 gradle/expose目录文件拷贝到工程的gradle/expose即可;

方式2:考虑到克隆项目比较麻烦,提供命令行操作方式如下:

  • 在项目gradle目录下创建expose目录,将命令行工作目录切换到gradle/expose

  • 在gradle/expose下执行curl命令,分别下载 核心脚本expose.gradle.kts、Android Library配置模板、Java Library配置模板

    curl -O https://raw.githubusercontent.com/JailedBird/ModuleExpose/main/gradle/expose/expose.gradle.kts
    curl -O https://raw.githubusercontent.com/JailedBird/ModuleExpose/main/gradle/expose/build_gradle_template_android
    curl -O https://raw.githubusercontent.com/JailedBird/ModuleExpose/main/gradle/expose/build_gradle_template_java
    

    PS:两个模板文件需要根据项目实际情况进行定制;

简单介绍

ModuleExpose方案(简称模块暴露),是将模块(module)内部的这部分代码暴露出来并自动生成新的暴露模块(module_expose);

不同于手动形式的代码下沉,本方案是直接将module中需要暴露的代码完整拷贝到module_expose模块,而module_expose模块的生成和配置是由脚本自动完成,并保证编译时两者代码的完全同步;

最终,工程中包含如下几类核心模块:

  • 基础模块:基础代码封装,可供任何业务模块使用;

  • 业务模块:包含业务功能,业务模块可以依赖基础模块,但无法依赖其他业务模块;

  • 暴露模块:由脚本基于业务模块或基础模块自动拷贝生成,业务模块可(compileOnly)依赖其他暴露模块;

示例如图:

image-20231206141629690

注意这种方案并非原创,原创出处如下:

思路原创:微信Android模块化架构重构实践

项目原创: github/tyhjh/module_api

工程架构

示例工程简介:

  • 基于nio重写脚本,并同时支持kts脚本和groovy脚本,详见维基文档;
  • 基于性能的考量,对暴露规则和生成方式进行改进,详见维基文档;
  • 综合优秀技术栈,优雅实现 模块化示例工程:
    • 结合 now in android 项目编译脚本系统,实现快速生成和配置统一的模块
    • 结合最新ksp版本Hilt依赖注入框架,实现基于暴露接口的模块化解耦方案
    • 完整实现支持拼音的安卓App搜索启动器,包含Room等 Jetpack主流组件

工程文档

详细维基文档:JailedBird/ModuleExpose/wiki

如果本方案对大家有帮助,欢迎点亮项目star支持作者😘