Skip to content

Latest commit

 

History

History
237 lines (149 loc) · 6.29 KB

组件化的使用.md

File metadata and controls

237 lines (149 loc) · 6.29 KB

目录

组件化:Gradle脚本的使用

SetUp.1 : 主项目引用编译脚本

在根目录的gradle.properties文件中,增加属性:

mainmodulename=app    

其中mainmodulename是项目中的host工程,一般为app

SetUp.2 : 在根目录的gradle文件中配置

    repositories {
    
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.0.1'
            .....
            classpath 'com.dhc.component:component-plugin:1.0.5'//添加组件化插件
            .....
        }
    }
    
    allprojects {
        repositories {
                .....
        }
    }
    .....

SetUp.3 : 拆分组件为module工程

在每个组件的工程目录下新建文件gradle.properties文件,增加以下配置:

isRunAlone=true
debugComponent=sharecomponent,other(其他模块)
compileComponent=sharecomponent,other(其他模块)

上面三个属性分别对应

  • isRunAlone : 否单独调试
  • debugComponent :debug模式下依赖的组件
  • compileComponent :release模式下依赖的组件

SetUp.4 : 在组件和host的build.gradle都增加配置

apply plugin: 'com.dhc.comgradle'
//注意:不需要在引用com.android.application或者com.android.library

组件化:模块边界,代码隔离

在项目中我使用的是阿里的Arouter方案,对模块之间Activity的和Fragment的跳转,以及接口应用

Arouter的简单使用:

SetUp .1 添加依赖和配置

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

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}

SetUp .2 Arouter简单使用

1,Fragment与Activity的跳转

// 1. 应用内简单的跳转(通过URL跳转在'进阶用法'中)
ARouter.getInstance().build("/home/MainActivity").navigation();


// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
		.withLong("key1", 666L)
		.withString("key3", "888")
		.withObject("key4", new Test("Jack", "Rose"))
		.navigation();
		
		
//3. 获取对应的Fragment的对象
(SupportFragment) ARouter.getInstance().build("/home/HomeFragment").navigation();

SetUp .3

这里我有学到在SpringCloud中RPC,模块之间的依赖关系的设计方案,在这里就有了,Client ,Server,Api 这三个概念,把所有的Api接口单独提供出来,供Client和Server使用.

如下图:

每个模块都有可能是Client(服务调用者)或者Server(服务提供者) 然后通过Arouter的反向实例将Client与Server之间的关系弱化,达到模块边界划分目的.

具体代码 :

1,定义接口Api

/**
 * Created by 邓浩宸 on 17/2/27.
 * 作为接口,方便主工程调度子模块的声明周期
 */

public interface ApplicationLike extends IProvider {

  public void onTerminate(Application application);
  public void onCreateAsLibrary(Application application);
  public void onLowMemoryAsLibrary(Application application);
  public void onTrimMemoryAsLibrary(Application application, int level);
  public void onConfigurationChanged(Application application, Configuration configuration);

2,Server实现Api

/**
 * 创建者:邓浩宸
 * 时间 :2017/3/23 18:04
 * 描述 :该Application只能放在子moudle中使用,用于moudle隔离
 */

public class BaseChildApplication extends BaseApplication implements ApplicationLike {


    @Override
    public void onCreate() {
        super.onCreate();
        onCreateAsLibrary(this);
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        onLowMemoryAsLibrary(this);
    }

    ......生命方法

    /**
     * arouter定义的启动之前的初始化(可以忽略)
     */
    @Override
    public void init(Context context) {

    }


}

2, Client调用Api

/**
 * 创建者:邓浩宸
 * 时间 :2017/3/21 10:51
 * 描述 :app 初始化
 */
public class App extends Application  {

    @Autowired(name = "/home/application1") //这里注入Arouter反向创建的对象
    ApplicationLike mApplicationLikeMoudle1;
    @Autowired(name = "/my/application2")
    ApplicationLike mApplicationLikeMoudle2;
    @Autowired(name = "/girls/application3")
    ApplicationLike mApplicationLikeMoudle3;
    public void onCreate() {
        super.onCreate();
        ARouter.getInstance().inject(this);
        if (mApplicationLikeMoudle1!=null)
        AsLibUtil.addAsLIbChild(mApplicationLikeMoudle1);
        if (mApplicationLikeMoudle2!=null)
        AsLibUtil.addAsLIbChild(mApplicationLikeMoudle2);
        if (mApplicationLikeMoudle3!=null)
        AsLibUtil.addAsLIbChild(mApplicationLikeMoudle3);
        AsLibUtil.doCreateAsLibrary(this);
    }


    @Override
    public void onLowMemory() {
        super.onLowMemory();
        AsLibUtil.onLowMemoryAsLibrary(this);
    }

    ...其他生命方法调用
}



这里是解决的是每个模块都有可能在Application中初始化操作,单独运行时又可以作为单独的Application入口.

接下来的事情就交给Arouter, 这一样就达到了,模块边界,代码隔离的目的.

最后

这里只是对Arouter的简单的使用,以及对Gradle脚本的简单介绍,这里我对@DDComponentForAndroid脚本进行了删减和修改避免了0.jar无法删除的问题,后面可能对Gradle脚本进行进一步的深入

最后感谢上面大佬对开源社区的贡献.