手把手教你快速搭建一个基于ARoute组件化+MVVM开发模式项目

先看一下效果

首先我们先使用Arouter框架来实现组件化

  • 模块划分

    APP有四个模块分别为module_home(首页)、module_market(行情)、module_option(自选)、module_user(我的)
     lib_base 用来存放公共的资源文件【防止文件名冲突引起的问题】和基础网络、图片框架,这里我们引用MVVMHabit框架作为我们公共库,
    MVVMHabit框架基于谷歌最新AAC架构,MVVM设计模式的一套快速开发库,整合Okhttp+RxJava+Retrofit+Glide等主流模块,满足日常开发需求。使用该框架可以快速开发一个高质量、易维护的Android应用。

 

手把手教你快速搭建一个基于ARoute组件化+MVVM开发模式项目_第1张图片

ARouter各个模块的gradle配置

  • 因为路由跳转是子模块都需要用到的,所以我们在lib_base 模块中引入

api rootProject.ext.dependencies["arouter-api"]
    annotationProcessor rootProject.ext.dependencies["arouter-compiler"]
    api rootProject.ext.dependencies["androideventbus"]
    api rootProject.ext.dependencies["fastjson"]
    api rootProject.ext.support["design"]

    统一再根目录config.gradle文件中

    //version配置
       versions = [
            "support-version": "27.0.2",
            "junit-version"  : "4.12",
    ]
       //support配置
    support = [
    'design'                  : "com.android.support:design:${versions["support-version"]}",
    ]
    //依赖第三方配置
     dependencies = [
              "arouter-api"                          : "com.alibaba:arouter-api:1.2.4",
            "arouter-compiler"                     : "com.alibaba:arouter-compiler:1.1.4",
            "androideventbus"                      : "org.simple:androideventbus:1.0.5.1",
            "fastjson"                             : "com.alibaba:fastjson:1.2.9",
    ]

  • 因为我把拦截器等公用类在base注册,在编译期间生成路径映射。同时也需要在lib_base/build.gradle中加入

defaultConfig {
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [moduleName: project.getName()]
                }
            }
        }

  • 然后在各子模块的build.gradle文件中导入(也就是module_home,module_market,module_option,module_user):

/**
     * 即使在lib_base已经引入了com.alibaba:arouter-compiler:1.1.4
     * 这里也需要引入,不然报错
     */
      annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
    
      api project(':lib_base')

  •     在编译期间生成路径映射。同时也需要在各子模块的build.gradle中加入:

defaultConfig {
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [moduleName: project.getName()]
                }
            }
        }

为了实现模块可插拔单独编译运行

模块化的好处之一就是单一模块可以独立的开发编译运行安装到用户的手机上,这样就方便了对某一模块的单独开发调试,单一模块生成的apk体积也小,编译时间也快,开发效率会高很多。

  • 项目根目录gradle.properties配置

    systemProp.http.proxyHost=127.0.0.1
    org.gradle.jvmargs=-Xmx512m       ---避免引起内存问题设置
    systemProp.http.proxyPort=1080
    isNeedHomeModule=true
    #isNeedHomeModule=false
    isNeedMarketModule=true
    #isNeedChatModule=false
    isNeedOptionModule=true
    #isNeedRecomModule=false
    isNeedUserModule=true
    #isNeedMeModule=false

  • 在各个子模块build.gradle中配置(例如module_home)

if (!isNeedHomeModule.toBoolean()) {
        apply plugin: 'com.android.application'
    } else {
        apply plugin: 'com.android.library'
    }
    
    
    android {
        defaultConfig {
            if (!isNeedHomeModule.toBoolean()) {
                applicationId "tsou.cn.module_home"
            }
        }
    }

  • 在app主模块中:

if (isNeedHomeModule.toBoolean()) {
        api project(':module_home')
          }
         if (isNeedMarketModule.toBoolean()) {
        api project(':module_market')
          }
         if (isNeedOptionModule.toBoolean()) {
        api project(':module_option')
          }
        if (isNeedUserModule.toBoolean()) {
        api project(':module_user')
         }

如果需要单独运行某个模块时

修改gradle.properties配置,例如单独运行module_home模块时,开启isNeedHomeModule=false,
    直接在AndroidManifest.xml的MainActivity添加
        
            

            
        

    然后运行module_home即可

  • 这里给出module_home的AndroidManifest.xml配置文件

    package="com.yn.module_home" >
             android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        
            
        

    
    
    

ARouter初始化

  • 在lib_base中创建MyApplication

public class MyApplication extends Application {
        /**
         * 上下文
         */
        private static MyApplication instance;
        @Override
        public void onCreate() {
            super.onCreate();
            instance = this;
            initRouter(this);
      
    
        }
        public static Context getInstance() {
            return instance;
        }
    
    
        private void initRouter(MyApplication mApplication) {
            // 这两行必须写在init之前,否则这些配置在init过程中将无效
            if (UIUtils.isApkInDebug(instance)) {
                //打印日志
                ARouter.openLog();
                //开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!
                //线上版本需要关闭,否则有安全风险)
                ARouter.openDebug();
            }
            // 尽可能早,推荐在Application中初始化
            ARouter.init(mApplication);
    
        }
    }

      /**
     * 判断当前应用是否是debug状态
     */

    public static boolean isApkInDebug(Context context) {
        try {
            ApplicationInfo info = context.getApplicationInfo();
            return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
        } catch (Exception e) {
            return false;
        }
    }

注意事项:

  1. 如果你在debug模式下进行调试代码,ARouter.openDebug();一定要调用,否则ARouter会出现无效情况。
  2. 尽量使用config.gradle来统一配置信息,以免出现版本号冲突问题。
  3. .新版api和compile是一样的功能,如果使用implementation在base模块中引入的第三方包文件,即使子模块引用的base模块也无法使用其引进的第三方包文件,建议在base引入第三方包文件都用api,除非子模块都不需要该第三方包文件可以使用implementation,避免子模块找不到第三方包文件问题。
  4. 编译报错可以通过gradlew compileDebug --stacktrace -debug查找具体原因。

ARouter和MVVM具体的用法,可以参考Demo,后续会推出相关文章,这里提供本Demo下载地址https://github.com/riggionLin/MVVMHappy/tree/master,如果本文章对你有所帮助,麻烦点一下star,你的认可是我前进的动力。

你可能感兴趣的:(Android框架)