Skip to content

Tanglonglong/androidCimponentProject

Repository files navigation

androidCimponentProject

android 组件化+componentization

组件架构图如下

Android组件化架构

效果图 数据都是来自聚合数据的免费接口,一天只能访问50次

4a086d9c1f519322be97ab8fac3e1abf.mp4

目录结构如下

57cb214b-9fc8-4ab7-804a-0e3ba62a785e

模块代码说明:

library-base 公共模块

主要是定义全局application接口,子业务模块集成,最后在主壳里面通过反射初始化子模块的application,这边还可以通过依赖注入,和自己写一个gradle插件,配置,后期有时间会实现一下

library-network 基础模块

此模块主要是通过Rxjava + refit +okhttp实现的网络请求api,对外提供baseUrl改变需要新的接口api,通过工厂模式对外提供

module-news 业务模块 --可独立运行调试

module-jokes 业务模块 --可独立运行调试

module-football 业务模块 --可独立运行调试

gradle 配置说明:

用的Groovy‌ 本来用的DSL ,在用DSL时,他的插件配置价值时序严格了导致,plugins里面无法访问变量了,所以用Groovy

gradle主要就 三个,一个是全局配置版本,依赖的config.gradle,一个是library的一个是module 这些都是提出公共的达到复用,和解决版本冲突

总结: 组件化架构的几个基本需要解决的问题 首先对于组件化,要理解一个qpp的打包,合并方式:一个app只有一个application所以要解决模块application和主的合并,manifest的合并规则, 资源不能重名因为打包资源是不会通过包名区分的都打在一起;

  1. 公共、基础、业务的划分要尽量解耦,高内聚 低耦合
  2. gradle的配置,达到每个业务模块能快速动态切换moudle、和单独app调试开发
  3. 在每个业务要做成组件的基本要素,模板化,新增模块就很快
  4. 组件之间跳转传值,目前用的就是阿里的ARout,封装的挺好,也很全,就没自己写,其实原理就是注解,动态注入、自己有时间其实可以写个gradle插件更加自动化一点

代码基本说明:

233c4460-054d-4890-90cf-d2c83515e066

isModuleLibrary=true 全局变量来动态切换 当前是业务模块单独运行调试,还是整体 module gradle 里面如下判断 if (isModuleLibrary.toBoolean()){apply plugin: 'com.android.library' } else{apply plugin: 'com.android.application' }

122af9d0-6039-428f-b29b-1fc729189c05

每个业务模块要添加资源前缀检测,尽量以模块名为前缀

通过反射初始化每个模块的application public static String[] sInitApplicationPackage ={"com.example.basenetwork.NetWorkInit", "com.example.newsmodule.ApplicationInit", "com.example.modulejokes.ApplicationInit", "com.example.module_football.ApplicationInit"};

主application里的处理,这边可以将MyApplication所有方法映射初始化子模块的 public class MyApplication extends BaseApplication{

@Override public void onCreate(){super.onCreate(); /** * * 这边需要调用每个模块的application的一些初始化等操作 * 这边通过反射、和依赖注入等方式 自己写个gradle插件 * * 1.反射实现,就需要知道每个模块的初始化类的路径,所以这边需要维护一个每个组件的初始化路径 * 2.通过依赖注入实现 * 3.通过自定义注解来实现 * 4.自己写个gradle插件来自动维护 * * * * **/ System.out.println("主模块"); ReflectionInitApplication.getInstance(this).initOnCreate()} @Override public void onConfigurationChanged(@NonNull Configuration newConfig){super.onConfigurationChanged(newConfig); ReflectionInitApplication.getInstance(this).initOnConfigurationChanged(newConfig)} 

}

application onCreate

public void initOnCreate(){for (String item : sInitApplicationPackage){if (classMap.containsKey(item)) classMap.get(item).onCreate(mApplication); else{IModuleApplicationInit init = getInitClass(item); if (!classMap.containsKey(item)){classMap.put(item, init)} init.onCreate(mApplication)} } } 反射拿到模块的初始化application接口 private IModuleApplicationInit getInitClass(String item){Class<?> clazz = null; try{clazz = Class.forName(item)} catch (ClassNotFoundException e){throw new RuntimeException(e)} IModuleApplicationInit init = null; try{init = (IModuleApplicationInit) clazz.newInstance()} catch (IllegalAccessException | InstantiationException e){throw new RuntimeException(e)} return init} 

其他的各位自己可以摸索了

About

android 组件化+componentization

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages