组件化框架设计流程图
Gradle语法
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。
Gradle 基于Goolvy脚本语言,而Goolvy又基于java扩展了java语法,可以用java的API实现Gradle的构建实现。
Goolvy是一种弱类型语言。
组件化配置步骤
工程根目录下创建config.gradle文件
(不一定是要在这里做全局配置,也可以在根目录下的build.gradle和gradle.properties下配置)
config.gradle配置清单
ext{
//生产环境|开发环境 用这个变量识别生产环境还是开发环境
isRelease = false;
//所有模块通用版本号。0
versionNumbers = [
compileSdkVersion : 30,
buildToolsVersion : "30.0.3",
minSdkVersion : 21,
targetSdkVersion : 30,
versionCode : 1,
versionName : "1.0",
]
//模块的包名数组
appPackageNames =[
app : "com.laiweifeng.zujianhua",
library : "com.laiweifeng.library",
module : "com.laiweifeng.module",
commonlibrary: "com.example.commonlibrary"
]
//生产|开发环境的地址
url = [
"debugUrl" : "https://10.10.11.153",
"Url" : "https://www.laiweieng.com"
]
//统一配置版本号
androidXLibraryVersion = "1.1.0"
}
公共基础库配置
这里面放置公共的基础框架,utils、http、base等,给所有的组件Module使用
//用isRelease判断环境(集成化环境用“library'”,module独立运行用“application'”)
if(isRelease){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
//统一版本号定义变量,用于给下面版本号调用(调用“config.gradle”)
def version = rootProject.ext.versionNumbers;
android {
compileSdkVersion version.compileSdkVersion
buildToolsVersion version.buildToolsVersion
defaultConfig {
//用isRelease判断环境(集成化环境不需要“applicationId”)
if(isRelease){
applicationId "com.laiweifeng.common"
}
minSdkVersion version.minSdkVersion
targetSdkVersion version.targetSdkVersion
versionCode version.versionCode
versionName version.versionName
//Arouter 路由配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [moduleName: project.getName()]
}
}
}
...省略...
//各种各样的框架
dependencies {
api "androidx.appcompat:appcompat:${rootProject.ext.androidXLibraryVersion}"
api "com.google.android.material:material:${rootProject.ext.androidXLibraryVersion}"
api "androidx.constraintlayout:constraintlayout:${rootProject.ext.androidXConstraintlayout}"
.....省略.....
//Arouter 路由用于各个模块间的跳转
api 'com.alibaba:arouter-api:1.2.4'
}
Module 组件配置
//用isRelease判断环境(集成化环境用“library'”,module独立运行用“application'”)
if(isRelease){
apply plugin: 'com.android.application'
}else{
apply plugin: 'com.android.library'
}
def version = rootProject.ext.versionNumbers;
android {
compileSdkVersion version.compileSdkVersion
buildToolsVersion version.buildToolsVersion
defaultConfig {
//用isRelease判断环境(集成化环境不需要“applicationId”)
if(isRelease){
applicationId "com.laiweifeng.personal"
}
minSdkVersion version.minSdkVersion
targetSdkVersion version.targetSdkVersion
versionCode version.versionCode
versionName version.versionName
}
// 配置资源路径,方便测试环境,打包不集成到正式环境
sourceSets {
main {
if (isRelease) {
// 如果是组件化模式,需要单独运行时
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
} else {
// 集成化模式,整个项目打包apk
manifest.srcFile 'src/main/AndroidManifest.xml'
java {
// 集成化 时 debug 目录下文件不需要合并到主工程
exclude '**/debug/**'
}
}
}
}
}
//模块统一引用common公共基础库
dependencies {
implementation project(path: ':common')
//动态注解器ARouter路由
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
}
APP壳工程配置
Appcation
public class MainAppcation extends Application {
@Override
public void onCreate() {
super.onCreate();
//路由框架用阿里的ARouter
if (isDebug()) {
ARouter.openLog();
ARouter.openDebug();
}
ARouter.init(this);
}
private boolean isDebug() {
return true;
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.laiweifeng.zujianhua">
<application
android:name=".MainAppcation"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
>
</application>
</manifest>
builde.gradle配置
plugins {
id 'com.android.application'
}
def version = rootProject.ext.versionNumbers;
android {
compileSdkVersion version.compileSdkVersion
buildToolsVersion version.buildToolsVersion
defaultConfig {
applicationId appPackage.app
minSdkVersion version.minSdkVersion
targetSdkVersion version.targetSdkVersion
versionCode version.versionCode
versionName version.versionName
/**
* src下java调用方式 : BuildConfig.isRelease
* 这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值(必须是String)
* 为什么需要定义这个?为了给java代码使用
* 切记:不能在build.gradle 根节点,只能在build.gradle defaultConfig或buildTypes节点下
*/
buildConfigField("boolean", "isRelease", String.valueOf(isRelease))
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
if(!isRelease){
implementation project(path: ':module)
}
implementation project(path: ':common')
}
路由框架
因为组件化开发下模块与模块之间完全解耦,所以跳转Activity 和Fragment 变得比较比较难搞了,这时候路由框架诞生了。