介绍一种适合多人共同开发的模式
小记:写这篇博客的原因,是由于自己公司的电脑有点渣,每次编译都要花上好多分钟,而且编译时又不能动电脑。当项目开始的时候代码量还比较少,编译一次也用不了多长时间,但随着开发的推进,代码量上来了,编译一次所花的时间就越来越多,开发到后期编译一次要四五分钟,真的等得人心烦。为了能够加快编译速度,自己便走上了寻找圣剑的道路。
本博客主要借鉴单元开发的想法和组件开发模式。把整个项目的业务分成多个模块,比如商城、论坛、个人中心。把这些模块分离出来,单独开发。
如图,每个功能模式是相互独立的,每个功能都是单独的Module,这样当我在开发商城的功能时就不用去管论坛和个人中心是怎么写的了。也不用把其他模块也打包进apk,减少了apk的代码量,从而缩短编译时间。如果是多人同时开发,每个人只要管自己的功能,耕自己的田就好了。不用担心别人改了你的代码,因为除了公共的部分,你们之间就没有交集。
那你会问,大家同一个工程,如何做到相互独立的呢?
既然你诚心诚意地问,那我就大发慈悲地告诉你。在根目录的build.gradle里添加模块的开关,如下图。
ext{ models = [ center : true, mall : true, bbs : true ] }
在app的builde.gradle里设置,你要编译进apk的模块。
if (rootProject.ext.models.center) { compile project(':center') } if (rootProject.ext.models.bbs) { compile project(':bbs') } if (rootProject.ext.models.mall) { compile project(':mall') }
就这样选择要编译的功能,与你无关的代码就可以过滤掉。
这时会产生一个疑问,如果我想从商城模块调用个人中心的选择收货地址的界面,要怎么做呢?因为商城和个人中心的模块是互不包含的,所以不能显式启动该界面。所以开始时想到隐式启动另一个模块的activity,怎么操作就不在这里赘述。这种方法可以解决activity的问题,但还有一个问题,就是如果是要调用的是fragment,就用不了这种方法了。
经过一段时间的学习研究,终于找到了一种方法能够同时实现跨模块启动activity或调用fragment。用Class.fromName(),就能根据类名生成所要的class,这样就能用startActivity启动activity了。如果要调用fragment,可以调用Class.newInstance()方法来生成该类的Object,然后就能转换成所要的fragment。
这种方法也实现我想要的功能,但这样做并不cool,然后又走上了如何寻找让这种跨模块调用变得更cool的方法。先是看了阿里巴巴的框架(https://github.com/alibaba/ARouter)和另外一位的框架(https://github.com/chenenyu/Router)。这两个工程的功能都比较完善,代码量比较多,故编译时间会比较长,而我想要的是功能简单些,只想要启动activity和得到fragment。因此接下来做的工作是提取出想要的功能。经过七七四十九天的努力,终于把这部分代码提取出来了。
这个路由框架支持java和kotlin语言。使用路由框架前要在根gradle里加入
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.1.3-2"
如果module中只有java代码请用下面java的方法,如果有kotlin代码的用kotlin的方法。
java:
apply plugin: 'com.neenbedankt.android-apt'
javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } }
compile project(':processlib') apt project(':processlib')
kotlin:
在build.gradle中加入以下代码
apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' apply plugin: 'kotlin-android-extensions'
kapt { arguments { arg("moduleName", project.getName()) } }
compile project(':processlib') kapt project(':processlib')
这样就配置好gradle了。
使用这个路由框架,其实也很简单,首先要对路由框架初始化,建议放到application里
YkoHut.init(this);只要在每个activity或fragment前加了注解就可以了
@YkoRoute(path = "/BBS/BBSJava")
/BBS/BBSJava是该activity或fragment的路径
要获取activity的class,只要使用以下代码就得获取,不过需要对cls进行等于null的判断,因为当BBSJava的activity所在的module没有被打包进apk,cls就为null了。
Class cls = YkoHut.getActivityClass("/BBS/BBSJava");
要获取fragment的方法也差不多
Fragment fragment = YkoHut.getFragment("/mall/mallkotlin")或
Fragment fragment = YkoHut.getFragmentV4("/mall/mallkotlin")
两者不同之处在于下面的方法返回的是support包里的fragment。
最后放出项目代码 https://github.com/lynyko/YkoRoute
代码还需要优化,先写到这