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脚本进行进一步的深入
最后感谢上面大佬对开源社区的贡献.