1.组件化项目的意义
不相互依赖 ,可以相互交互,高度解耦 ,分模块打包,测试,便于统一管理....
这里简单说说 详细的可以网上找找资料 这里就不说过多废话了
2.PhoneModule和android library的区别,切换
PhoneModule可以独立运行
ndroid library 只能作为项目的lib
New Module时候有如下两个选项
PhoneModule
可以独立运行的模块 可以看出app
配置为:apply plugin: 'com.android.application'
有 applicationId
切换: com.android.library
修改: applicationId
android library
新建出android库,不能独立运行
配置为:apply plugin: 'com.android.library'
无 applicationId
切换: com.android.application'
修改: applicationId
3.gradle搭建组件化项目环境
详情可以克隆项目查看https://github.com/wangcaiwen5/GradleDemo/tree/master
//
ext {
//生产 /开发 环境 用来切换组件化 集成化
isRelease = false
androidId = [
compileSdkVersion: 29,
buildToolsVersion: "29.0.3",
applicationId : "com.cw.myapplication",
minSdkVersion : 19,
targetSdkVersion : 29,
versionCode : 1,
versionName : "1.0"
]
appId = [
applicationId: "com.cw.myapplication",
app : "com.cw.myapplication",
order : "com.cw.ordermodule",
personal : "com.cw.personal",
]
//生产 测试环境
url = [
debug : "http://101.2.2.2:debug",
release: "http://101.2.2.20:release",
]
appcompatLibVersion = "1.1.0"
coreKtxLibVersion = "1.2.0"
constraintlayoutLibVersion = "1.1.3"
junitLibVersion = "4.12"
extJunitLibVersion = "1.1.1"
espressoCoreLibVersion = "3.2.0"
dependenciesLib = [
"appcompat" : "androidx.appcompat:appcompat:${appcompatLibVersion}",
"coreKtx" : "androidx.core:core-ktx:${coreKtxLibVersion}",
"constraintlayout": "androidx.constraintlayout:constraintlayout:${constraintlayoutLibVersion}",
"junit" : "junit:junit:${junitLibVersion}",
"extJunit" : "androidx.test.ext:junit:${extJunitLibVersion}",
"espressoCore" : "androidx.test.espresso:espresso-core:${espressoCoreLibVersion}"
]
}
定义config.gradle文件 //www.greatytc.com/p/ae6b78c78531以上代码可以看到我们定义了isRelease 通过布尔值来控制 是否生产 /开发 环境 用来切换组件化 集成化
上图是大概目录结构
我们可以看下 ordermodule的build.gradle是如何配置的
//注意:这里加了判断 通过改变isRelease值来控制是集成化还是组件化
if (isRelease) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
//这里是读取config.gradle中的变量
def androidId = rootProject.ext.androidId
def appId = rootProject.ext.appId
def dependenciesLib = rootProject.ext.dependenciesLib
def url = rootProject.ext.url
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
//只有是组件化的时候 才有applicationId 独立运行
if (!isRelease) {
applicationId appId.order
}
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//配置资源路径 方便测试环境 ,打包不集成到正式环境
sourceSets {
main {
if (!isRelease) {
// 如果是组件化模式,需要单独运行时
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
/*java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
resources.srcDirs = ['src/main/resources']
aidl.srcDirs = ['src/main/aidl']
assets.srcDirs = ['src/main/assets']*/
} else {
// 集成化模式,整个项目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//release 时 debug目录下的文件不合并到主工程目录
exclude '**/debug/**'
}
}
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation dependenciesLib.junit
androidTestImplementation dependenciesLib.extJunit
androidTestImplementation dependenciesLib.espressoCore
implementation project(":library")
dependenciesLib.each { k, v -> implementation v }
}
图中的personal_module也是同理配置
这些配置好 我们再看app下的build.gradle的主要配置
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
testImplementation dependenciesLib.junit
androidTestImplementation dependenciesLib.extJunit
androidTestImplementation dependenciesLib.espressoCore
/*implementation dependenciesLib.appcompat
implementation dependenciesLib.coreKtx
implementation dependenciesLib.constraintlayout*/
//最简洁的方式
dependenciesLib.each { k, v -> implementation v }
implementation project(":library")
//这一部分 也是通过isRelease来切换是集成化/组件化
//isRelease为true的时候ordermodule就相当于一个library 所以是集成化
//isRelease为false的时候ordermodule并不会依赖到app中 他相当于一个能独立运行的项目 所以是组件化
if (isRelease) {
implementation project(":ordermodule")
implementation project(":personal_module")
}
}
4.集成化模式开发&组件化模式开发
组件化:可以独立运行,每个模块都可以独立运行
集成化:不可独立运行,将整个项目打包成apk
5.组件化开发的临时代码,集成化开发打包时的动态隔离
组件化的好处就是每个模块可以单独运行 但是肯定会有开发时存在的临时调试用的文件,但是我们又不能正式打包得时候,打包进项目里
下图我们可以看到有debug目录 这些就需要我们动态的去隔离 代码在最下面
android {
......... 省略
//配置资源路径 方便测试环境 ,打包不集成到正式环境
sourceSets {
main {
if (!isRelease) {
// 如果是组件化模式,需要单独运行时
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
/*java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
resources.srcDirs = ['src/main/resources']
aidl.srcDirs = ['src/main/aidl']
assets.srcDirs = ['src/main/assets']*/
} else {
// 集成化模式,整个项目打包
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
//release 时 debug目录下的文件不合并到主工程目录
exclude '**/debug/**'
}
}
}
}
}