Android模块化管理

项目架构,从来都是按照实际需求情况演进的

<壹> app模块

在组件化/模块化架构中,app 模块作为宿主(主壳)是非常关键的设计。它的作用远远不止是一个简单的启动入口,而是一个精心设计的架构核心。让我详细解释它的作用和用意:

一、核心作用

1. 应用的统一入口

kotlin 复制代码
// app/build.gradle
apply plugin: 'com.android.application'
  • 这是唯一拥有 application 插件的模块
  • 包含应用的 Application 类和启动 Activity
  • 定义了应用的包名、版本号、签名等元信息

2. 组件/模块的装配中心

kotlin 复制代码
// app/build.gradle
dependencies {
    implementation project(':core')
    implementation project(':feature-ui')
    implementation project(':feature-arch')
    implementation project(':feature-performance')
    // ... 按需集成其他模块
}
  • 像一个"主板",把所有功能模块像"插卡"一样集成在一起
  • 决定哪些模块被包含在最终APK中

3. 全局配置和管理

kotlin 复制代码
// app/src/main/java/com/example/MyApplication.kt
class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 全局初始化
        initRouter()      // 路由框架初始化
        initCrashHandler() // 全局异常处理
        initPerformance()  // 性能监控初始化
        initLogging()      // 日志系统初始化
        
        // 按需延迟初始化某些模块
        initModulesLazily()
    }
}

4. 路由和导航中枢

ARouter在单activity多compose的场景,不适用。

TheRouter未确定。

kotlin 复制代码
// app模块负责配置全局导航,或者
object AppRouter {
    fun setup() {
        ARouter.init(application)
        ARouter.openDebug()
        // 添加全局拦截器(如登录检查)
        ARouter.getInstance().addInterceptor(LoginInterceptor())
    }
}

// 壳中的MainActivity通常作为容器
class MainActivity : BaseActivity() {
    // 可能只是一个简单的容器,实际内容由各模块提供
}

二、架构用意

1. 单一职责原则

  • 各业务模块:专注于自己的功能实现,不关心如何被集成
  • 宿主模块:专注于组装和调度,不包含具体业务逻辑

2. 解耦的关键设计

text 复制代码
传统单体应用:
app(包含所有代码和逻辑)
|
├── ui包
├── network包  
├── database包
└── ...

组件化架构:
app(空壳,仅集成和调度)
|
├── core(基础库)
├── feature-A(独立业务组件,可单独运行)
├── feature-B(独立业务组件,可单独运行)
└── ...
  • 业务模块之间没有直接依赖,都只依赖 core 模块
  • 模块间通信通过接口/路由,而不是直接引用

3. 灵活的动态配置

groovy 复制代码
// 可以灵活控制哪些模块被包含
dependencies {
    // 基础模块,始终包含
    implementation project(':core')
    
    // 按需引入的特性模块
    if (isFeatureEnabled('performance')) {
        implementation project(':feature-performance')
    }
    
    if (isFeatureEnabled('custom_ui')) {
        implementation project(':feature-ui')
    }
    
    // 调试专用模块,只包含在debug版本
    debugImplementation project(':debug-tools')
}

4. 独立调试与集成发布的切换

groovy 复制代码
// 在业务模块中,可以这样配置
// feature-ui/build.gradle
if (isRunAlone()) {
    apply plugin: 'com.android.application'
} else {
    apply plugin: 'com.android.library'
}

android {
    defaultConfig {
        if (isRunAlone()) {
            // 独立运行时需要自己的ApplicationId
            applicationId "com.example.feature.ui"
        }
    }
    
    sourceSets {
        main {
            // 独立运行时使用自己的AndroidManifest
            if (isRunAlone()) {
                manifest.srcFile 'src/main/runAlone/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
            }
        }
    }
}
相关推荐
程序员爱钓鱼15 小时前
Node.js 编程实战:错误处理与安全防护
前端·后端·node.js
Geoffwo15 小时前
Electron 打包后 exe 对应的 asar 解压 / 打包完整流程
前端·javascript·electron
柒@宝儿姐15 小时前
vue3中使用element-plus的el-scrollbar实现自动滚动(横向/纵横滚动)
前端·javascript·vue.js
程序员爱钓鱼15 小时前
Node.js 编程实战:模板引擎与静态资源
前端·后端·node.js
Geoffwo15 小时前
Electron打包的软件如何使用浏览器插件
前端·javascript·electron
Sui_Network15 小时前
Sui 2025→2026 直播回顾中文版
大数据·前端·人工智能·深度学习·区块链
打小就很皮...15 小时前
网页包装为桌面应用(electron版)
前端·electron
用户917439653915 小时前
基于SqlSugar开发框架的基础上快速开发H5端的移动应用
前端·负载均衡
Yesterday不想说话15 小时前
Promise的总结
前端
C_心欲无痕16 小时前
nodejs - npm和package.json文件解析
前端·npm·json