组件化
一、什么是组件和模块
1.1组件:把重复的代码提取出来合并成为一个个组件,组件最重要的就是重用(复用),位于框架最底层,其他功能都依赖于组件,可供不同功能使用,独立性强。
1.2模块:分属同一功能/业务的代码进行隔离(分装)成独立的模块,可以独立运行,以页面、功能或其他不同粒度划分程度不同的模块,位于业务框架层,模块间通过接口调用,目的是降低模块间的耦合,由之前的主应用与模块耦合,变为主应用与接口耦合,接口与模块耦合。
模块就像有多个USB插口的充电宝,可以和多部手机充电,接口可以随意插拔。复用性很强,可以独立管理。
二、组件和模块的区别
2.1组件:就像一个个小的单位,多个组件可以组合成组件库,方便调用和复用,组件间也可以嵌套,小组件组合成大组件。
2.2模块:就像是独立的功能和项目(如淘宝:注册、登录、购物、直播...),可以调用组件来组成模块,多个模块可以组合成业务框架。
1 统一gradle
1:在gradle .properties 中定义 各种配置 (尽量大写) 然后在 build.gradle 中使用
因为 gradle .properties 默认是 string 类型 所以在 使用的时候 转成所需要的的 格式
===============
gradle .properties
CompileSdkVersion = 29
build.gradle
compileSdkVersion CompileSdkVersion.toInteger()
===============
2 在项目的build.grdle 中定义
===============
ext{
android = [
compileSdkVersion :29
]
}
在app的build.grdle 中使用
rootProject.ext.android.compileSdkVersion
================
3: 在项目的更目录 创建 config.gradle
==================================
ext{
android = [
compileSdkVersion:29,
buildToolsVersion:'30.0.2',
minSdkVersion :16,
targetSdkVersion :29,
versionCode :1,
versionName :'1.0',
compileSdkVersion:29
]
dependencies =[
publicimplementation :[
'androidx.appcompat:appcompat:1.2.0',
'androidx.constraintlayout:constraintlayout:2.0.1'
],
publictestImplementation :[
'junit:junit:4.12'
],
publicandroidTestImplementation :[
'androidx.test.ext:junit:1.1.2',
'androidx.test.espresso:espresso-core:3.3.0'
],
publicfileTree :fileTree(dir:"libs",include: ["*.jar"])
]
}
在模块的 build.gradle 中使用
======================================
applyplugin:'com.android.application'
android{
compileSdkVersionrootProject.ext.android.compileSdkVersion
buildToolsVersionrootProject.ext.android.buildToolsVersion
defaultConfig{
applicationId"com.example.login"
minSdkVersionrootProject.ext.android.minSdkVersion
targetSdkVersionrootProject.ext.android.targetSdkVersion
versionCoderootProject.ext.android.versionCode
versionNamerootProject.ext.android.versionName
testInstrumentationRunner"androidx.test.runner.AndroidJUnitRunner"
}
buildTypes{
release{
minifyEnabledfalse
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
}
}
dependencies{
implementation rootProject.ext.dependencies.publicfileTree
implementationrootProject.ext.dependencies.publicimplementation
testImplementationrootProject.ext.dependencies.publictestImplementation
androidTestImplementationrootProject.ext.dependencies.publicandroidTestImplementation
}
======================================
=====================================
2:解决 每个 组件 判断 自己是 不是独立的 application
1: 在basic模块的 的build.gradle 中配置
=======================
buildTypes{
release{
buildConfigField("boolean","is_applicaion",rootProject.ext.android.is_applicaion.toString() )
minifyEnabledfalse
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard-rules.pro'
}
debug{
buildConfigField("boolean","is_applicaion",rootProject.ext.android.is_applicaion.toString() )
}
}
2: 在asic模块 定义一个BaseActivity 提供一个获取 is_application的
final boolean is_application = BuildConfig.is_applicaion;
public boolean getIsApplicayion() {
return is_application;
}
3: 每个组件的 activity 继承BaseActivity
=======================
建立每个组件的application 类
1:在组件的src/mian 牡目录下建立 一个文件夹
2:在 组件的 build.gradle 中 定义 java.srcDir 'src/main/新建的文件夹'
3: 在新建的文件夹下 创建自己 所需要的java 文件
======================上面基础配置 基本完成 下面的重点是组件通讯
注解是 标记能标记我们程序中的某些东西
注解处理器 相当于大脑 去找 注解 然后识别 然后执行对应指令
编译时技术用来做什么?
:第一步 创建注解 让注解把所有需要加入到路由中的类 标记起来
:第二 步 创建注解处理器 取代吗中找到 专门标记 acttyivity的 注解 得到标记的类
第三部 生成Activityutils类
怎么玩编译时技术?
1 创建 javalibrary annotation (因为编译时技术是java 技术 不是安卓的)
创建一个注解类 =
=======================
@Target(ElementType.TYPE)// 声明注解的作用域 ElementType.TYPE 在类上
@Retention(RetentionPolicy.CLASS)//// 声明注解的生命周期 存在时间
// RetentionPolicy.SOURCE 源码时 (最短期) RetentionPolicy.CLASS 编译时 RetentionPolicy.RUNTIME 运行行(生命时间最长)
public @interface BindPath {
Stringvalue();
}
2: 在connfgi.gradle 中依赖这个库
3: 在 组件中的activity 类上 加 注解
@BindPath("main/main")
=========================
2 创建 javalibrary annotation_compiler 注解 处理器的lbrary
具体 使用看demo :https://github.com/liuwenwen-123/zujianHuademo