android 组件化工具 安卓组件化_android

所谓组件化 可以理解我Android项目是一个机器人,那么胳膊,腿,头就是组件。项目App加是一个个组件组成的。当然给个组件也是具有生命力的也是可以单独运行的。

这里我们直接进去主题。

 

实践之前你需要了解的基本知识

  • 组件化项目,通过gradle脚本,实现module在编译期隔离,运行期按需加载,实现组件间解耦,高效单独调试。

为什么要用组件化以及使用组件化的优势:

  • APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,维护成本高。
  • 业务耦合度高,代码越来越臃肿,团队内部多人协作开发困难。
  • Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时。
  • 方便单元测试,改动单独一个业务模块,不需要着重于关注其他模块被影响。

这里我用了一个Demo的截图。

android 组件化工具 安卓组件化_android_02

 

那我们实现组价化之前需要搞清楚自己App中的一些业务逻辑和框架,然后区分相应的模块,一些基本的公共类和基础库,一些共用的资源文件。等

android 组件化工具 安卓组件化_android 组件化工具_03

那么搞清楚这个 我们就很容易上手了。

所谓的五个步骤:

  1. 全局设置Gradle ,每一个业务Module需要的版本都定义在这里方便后期维护多个Module版本
gradle.properties 中定义isModuleRun=fasle
  1. 模式切换 组件化后的每一个业务的module都可以是一个单独的APP(isModuleRun=false), release 包的时候各个业务module作为lib依赖,这里完全由一个变量控制,在根项目 gradle.properties里面的 isModuleRun=true
    isModuleRun状态不同,加载application和AndroidManifest都不一样,以此来区分是独立的APK还是lib,
    实现方式如下 在build.grade里面配置      
  2. android 组件化工具 安卓组件化_android_04

  3. 新建一个baseres模块 添加一些XML布局文件和相应的string字符串。新建一个baselib存放一些共用的BaseApplication和共用的util类等。接着根据自己需要新建相应的模块。如果模块中应用到baseres模块 baselib模块中的资源或者是类,吸引依赖一下 eg:
implementation project(':basiclib')

implementation project(':imagemodule')
  1. 组件通讯                 

        各业务Module之前不需要任何依赖可以通过路由跳转,完美解决业务之间耦合
        使用方式如下。

android 组件化工具 安卓组件化_android 组件化工具_05

compile "com.alibaba:arouter-api:$rootProject.aRouter"
每个业务Module都需要添加注解
annotationProcessor 'com.alibaba:arouter-compiler:1.1.3'

跳转方法
在目标Activity上添加path

android 组件化工具 安卓组件化_App_06

android 组件化工具 安卓组件化_android_07

上述只使用了ARouter的简单用法,更多进阶用法请参考ARouter文档,
ARouter

5.Application

当组件单独运行的时候,每个Module自成一个APK,那么就意味着会有多个Application,很显然我们不愿意重复写这么多代码,所以我们只需要定义一个BaseApplication即可,其它的Application直接继承此BaseApplication就OK了,BaseApplication里面还可定义公用的参数。

 

下面说一下我在组件化的时候遇到的问题:

一:

描述:

Error:Unable to resolve dependency for ':app@dev/compileClasspath': Could not resolve project :common

解决方法:

android {
    compileSdkVersion rootProject.ext.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        .......

        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false //开启代码混淆
            zipAlignEnabled false
            shrinkResources false // 移除无用资源
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }
}

很可能是build.gradle中这部分代码没有配置的原因。

二:

描述:Error:Execution failed for task ':homemodule:compileReleaseJavaWithJavac'.
> java.lang.RuntimeException: ARouter::Compiler >>> No module name, for more information, look at gradle log.

解决方法:

检查下子module里面有没配置

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

三:

描述:Demo mFragmentTab01 = (Fragment) ARouter.getInstance().build(ARouterManager.AFragment).navigation();这个地方 跨模块获取Frament却为null呢?

解决办法:

检出一下ARouterManag里定义的路径是不是有问题。