afkT / DevComponent

:lemon:【100% Kotlin 实现 Android 项目组件化示例代码】基于 Android JetPack + Kotlin + Coroutines + MVVM 架构(DataBinding、ViewModel、Lifecycle)等最新技术栈进行组件化基础搭建,使用 ARouter 方案实现组件化。
Apache License 2.0
73 stars 17 forks source link
appstartup arouter component coroutines databinding devutils engine jetpack kotlin-android lifecycle modular module viewmodel
    该分支基于 TheRouter 框架实现组件化路由导航,多 core lib 实现基础核心开发库

DevComponent

Profile License Version API

🍋 这是一个 Android 组件化模板项目,通过在此基础上开发项目,使其拥有组件化能力。

Android 规范 Java 规范 Git 规范

使用说明 多渠道打包

运行说明

About

Android 组件化就是利用多个 Module 来表示应用的多个模块实现代码和资源的隔离,并且每个 Module 都有单独运行和组合的能力。

该 Android 项目组件化示例代码 100% Kotlin 实现,使用 ARouter 方案实现组件化, 整个项目基于 Android JetPack 组件库 + Kotlin 等最新技术栈进行开发, 使用 MVVM 架构 ( DataBinding + ViewModel + Lifecycle )

组件化架构

名词 含义
集成模式 所有的业务组件被 APP 壳工程依赖,组成一个完整的 APP
APP 壳工程 基本上是一个空壳,用于集成所有的功能组件,统一编译,用于输出组中的 APK
lib_XXX 抽离的一个库模块,功能具有通用性,属于公共基础组件
module_XXX 根据业务分出来的能独立运行的业务组件,即可以单独运行,又可以库的形式集成到 APP 壳中,比如 Main 组件、购物车组件、聊天组件、订单组件等。
core core 是项目的基础,提供最基础的、与具体业务无关的功能,比如网络请求、通用 UI 组件、core 还负责集成功能的 Library 库 ( 当中也有一些业务相关的、各模块共享的功能,这是不可避免的 )

组件目录展示

目录

- component          | 根目录
   - core            | 核心基础整合库
   - libs            | 通用 Library、第三方库 clone 差异化修改

core

该目录属于核心基础库代码,整个组件化项目基于该基础上进行开发

Core Module 基于 Dev 系列开发库 搭建, ( 全部开发基于该 module ) 用于统一维护基础核心开发库、第三方库依赖,对外只需要依赖该 module 便可使用整个核心模块 ( core 文件以及内部所有 libs )

- core                                 | 根目录
   - core                              | 核心基础整合库 ( 内部集成 core libs, 对外依赖该 module 即可 )
   - core_base_lib                     | 基础核心开发库依赖 ( libs 便捷依赖统一维护 )
   - libs                              | 具体功能拆分, 封装 lib
      - lib_base                       | 基类相关 ( Activity、Application 等 )
      - lib_base_split                 | 基础 ( 基类等 ) lib 拆包
      - lib_bean                       | 通用实体类 ( module 实体类下沉 )
      - lib_channel_flavors            | App 多渠道
      - lib_config                     | 通用配置、常量信息
      - lib_debug_assist               | Debug 编译辅助开发库 ( 提供切换环境、抓包数据可视化、调试按钮开关等辅助功能 )
      - lib_engine                     | 通用 Engine ( 图片加载、日志、JSON、权限、资源选择、缓存 ) lib
      - lib_environment                | 通用环境配置切换库
      - lib_language                   | 通用多语言 lib
      - lib_mvvm                       | MVVM 通用代码封装 ( 使用 MVVM module 必须 api 依赖如果使用 compileOnly 将会找不到 BindingAdapter 等 )
      - lib_network                    | 网络相关 lib ( 网络请求、上传下载 )
      - lib_property                   | 性能优化、检测 lib
      - lib_receiver                   | 广播监听 ( 如网络状态、电量、屏幕解锁 ) 相关
      - lib_router                     | 路由相关
      - lib_ui                         | 统一 style、widget、ui 相关组件
      - lib_ui_skin                    | APP 主题、换肤相关控制
      - lib_upload                     | 通用上传库
      - lib_utils                      | 通用工具库
      - lib_web                        | WebView 相关

libs

该目录属于 项目模块快捷工具封装复用、第三方库 clone 对源码进行差异化修改使用等存储目录

- libs                         | 根目录
   - lib_splash_ads            | 启动页广告 lib
   - lib_tmdb_ui               | TheMovieDB 通用 UI lib

应用程序目录展示

目录

- application       | 根目录
   - app            | 主体应用 ( APP 壳工程 )
   - module         | 具体功能模块 ( 可单独运行 ),被主体应用 ( 壳 ) 所依赖使用

module

该目录下的 Module 在 isModular=true 的情况下,都属于独立的应用可单独运行,为 false 则都属于功能模块,被主体应用 ( 壳 ) 所依赖使用

- module                    | 根目录
   - module_main            | 首页 Module
   - module_movie           | 电影 Module
   - module_person          | 人物 Module
   - module_splash          | 启动页 ( 广告页、首次启动引导页 ) Module
   - module_template        | 模板 Module ( 便于 copy )
   - module_tv              | 剧集 Module

基础架构组件

基础组件中的 core 模块是基础架构库,提供可扩展性强低侵入性的通用功能:

其中 lib_engine 组件支持通用 Engine ( 图片加载、日志、JSON、权限、资源选择、缓存等 ) 进行自行实现,无缝全局替换第三方库实现方案

客户端模块化组件化架构

整体上,架构设计采用的是模块化组件化架构。

模块化架构实施

组件化架构实施

在 Android 中如何实施组件化?

  1. 构建一个封装完善的基础库,各个组件都依赖于它,它应该为组件化提供强大的支持,比如路由架构、各种基础功能的集成、一些共享数据模型等。
  2. 在模块化的基础上,进一步将项目划分为各个独立的组件。
  3. 消除各个组件之间的直接依赖。

Android Studio 使用 gradle 进行项目构建,gradle 使得我们可以像编程一样控制构建过程,当一个模块应用 application 插件时,它将被构建为 apk,当一个模块应用 library 插件时, 它将被构建为 aar,这正是我们进行组件化的利器,通过各种配置达到一键切换整体编译集成还是各个组件独立编译允许的目的。从而大大的提高开发效率。当然既然是可以编程的, 我们可以自定义一个 Gradle 插件,实现灵活的项目构建配置。

开关配置

主要技术点为在 modular.gradle 中定义标识

// 模块化编译开关 ( true = 每个模块都是独立应用, false = 整合运行 )
isModular = false

根据标识,应用不同的构建文件

def isModular = isModular.toBoolean()

if (isModular) { // 每个模块都是独立应用
    apply from: rootProject.file(files.build_application_gradle)
} else { // 整合运行, 每个 module 都是 library
    apply from: rootProject.file(files.build_library_module_gradle)
}
组件间通信

经过组件化后,组件之间在物理上被隔离,组件间彼此不感知对方的存在,但是在业务上组件间又有通信的需求, 业界主流采用的方案是采用路由通信。项目将会采用阿里巴巴开源的 ARouter 通信通信方案。

配置文件

关于 core 库依赖可以参考 MavenCentral Links - 搭建自己的 Maven 库 搭建自己的 Maven 库,通过 aar 直接进行依赖

项目依赖库

调试工具:

问题及解决方案

  1. 使用 Jetpack App Startup 实现多 Module 初始化
  2. 使用 ARouter IProvider ( 且也可以使用 IProvider 进行组件间通讯 )
  1. 使用 LiveEventBus / EventBus
  2. 使用 ARouter IProvider、自定义接口实现、BroadcastReceive 等

Link

参考项目

License

Copyright 2022 afkT

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.