我及得之前有写过这个文章的, 还记录了一些组件化实现初期遇到的问题
但是不知道为什么全没了。。。
好吧重写!!!
先说说为什么去实现组件化
组件化demo地址 : https://github.com/plzyxy/kotlindemo
首要原因肯定是解耦啦,不是所有的项目都是你自己手把手从零写出来,更多的是接手以前的老项目。由于每个人的经验水平和编码风格都不一样,对这个耦合程度的理解和标准也不一样,随着时间推移模块间的代码会越写相互依赖程度越大。毕竟有时候明明能直接拿过来用的,却发现需要实现各种模式什么的,真是很忧伤啊。还有在开发时发现a项目的某些功能可以直接在B上使用的,在使用时发现需要排除很多的不必要的东西以及代码迁移,那真的是很苦恼。其他原因省略吧。。。毕竟我想表达式是组件化遇到的问题。
-------先看看组件化的大概结构
(上面的图来自 文章 https://www.jianshu.com/p/94e46c5d276b 如有争议 可联系本人删除)
我实在是懒得画图了啊 能把我要表达的东西展示出来就行了。
首先呢是把业务拆分, 所有的业务都依赖基础库 commonmodule 最后you由app 壳工程来 统一打包就好。
commonmodule ->组件化统一配置 一些必要的基础库啊包版本号啊,mvp基础类啊,网络框架,路由通信什么的统一在这封装管理。
moduleA 业务组件 例如登录 所有关于用户登录的 都放在这
。。。
这样的好处就是每个业务都解偶了
每个组件可以单独调试
配置如下
/**
* 全局统一配置文件
*/
ext {
//true 每个业务Module可以单独开发
//false 每个业务Module以lib的方式运行
//修改之后需要Sync方可生效
isModule = false
//版本号
versions = [
applicationId : "com.teayork.word", //应用ID
versionCode : 1, //版本号
versionName : "1.0.0", //版本名称
compileSdkVersion : 28,
buildToolsVersion : "28.0.3",
minSdkVersion : 15,
targetSdkVersion : 28,
androidSupportSdkVersion: "28.0.0",
constraintLayoutVersion : "1.1.1",
runnerVersion : "1.0.1",
espressoVersion : "3.0.1",
junitVersion : "4.12",
annotationsVersion : "24.0.0",
//....省略
]
dependencies = ["appcompat_v7" : "com.android.support:appcompat-v7:${versions["androidSupportSdkVersion"]}",
"constraint_layout" : "com.android.support.constraint:constraint-layout:${versions["constraintLayoutVersion"]}",
"runner" : "com.android.support.test:runner:${versions["runnerVersion"]}",
"espresso_core" : "com.android.support.test.espresso:espresso-core:${versions["espressoVersion"]}",
// ...省略
//方法数超过65535解决方法64K MultiDex分包方法
"multidex" : "com.android.support:multidex:${versions["multidexVersion"]}",
//路由
"arouter_api" : "com.alibaba:arouter-api:${versions["arouterApiVersion"]}",
"arouter_compiler" : "com.alibaba:arouter-compiler:${versions["arouterCompilerVersion"]}",
"arouter_annotation" : "com.alibaba:arouter-annotation:${versions["arouterannotationVersion"]}",
// ...省略
]}
ModuleA 配置如下
if (Boolean.valueOf(rootProject.ext.isModule)) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'org.greenrobot.greendao' // apply plugin
android {
compileSdkVersion rootProject.ext.versions.compileSdkVersion
buildToolsVersion rootProject.ext.versions.buildToolsVersion
//指定jdk版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kapt {
arguments {
arg("AROUTER_MODULE_NAME", project.getName())
}
}
defaultConfig {
minSdkVersion rootProject.ext.versions.minSdkVersion
targetSdkVersion rootProject.ext.versions.targetSdkVersion
versionCode rootProject.ext.versions.versionCode
versionName rootProject.ext.versions.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//MultiDex分包方法
multiDexEnabled true
//Arouter路由配置
// kapt {
// arguments {
// arg("AROUTER_MODULE_NAME", project.getName())
// }
// generateStubs = true
// }
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
includeCompileClasspath = true
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//java插件引入了一个概念叫做SourceSets,通过修改SourceSets中的属性,可以指定哪些源文件
//( 或文件夹下的源文件 ) 要被编译 , 哪些源文件要被排除 。
sourceSets {
main {
if (Boolean.valueOf(rootProject.ext.isModule)) {
manifest.srcFile 'src/main/module/AndroidManifest.xml'
} else {
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//排除java/debug文件夹下的所有文件
exclude '*module'
}
}
}
}
}
//add
greendao {
schemaVersion 3
daoPackage 'com.teayork.module_main.dao'
targetGenDir 'src/main/java'
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//公用依赖包
implementation project(':common_base')
//Arouter路由
kapt rootProject.ext.dependencies["arouter_compiler"]
// api rootProject.ext.dependencies["arouter_annotation"]
implementation rootProject.ext.dependencies["arouter_api"]
//黄油刀
annotationProcessor rootProject.ext.dependencies["butterknife_compiler"]
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
//google流式布局
implementation 'com.google.android:flexbox:1.0.0'
}
repositories {
mavenCentral()
}
if (Boolean.valueOf(rootProject.ext.isModule)) {
apply plugin: ‘com.android.application’
} else {
apply plugin: ‘com.android.library’
}
这个是用于 配置组件是否单独调试的
在跟模具及得添加应用自己的 config.gradle
apply from: “config.gradle”
基本上大概项目就搭好了
demo地址 : https://github.com/plzyxy/kotlindemo