组件化
概况:
提高编译速度、提升协作效率、功能重用
代码重用和解耦
组件模式和集成模式切换
if (iMisModule.toBoolean()) {
apply plugin: 'com.android.application'
} else {
apply plugin: 'com.android.library'
}
if(iMisModule.toBoolean()) {
manifest.srcFile 'src/main/debug/AndroidManifest.xml'
}else {
manifest.srcFile 'src/main/AndroidManifest.xml'
}
1.大型项目只编译某些module
2.海外分享和国内分享依赖编译不同module带不同sdk
Arouter流程图
本质解决:不同module无法相互引用对方的类的问题
1.通过router注解创建映射类
2.init navigation 通过映射构建postcard进行跳转等
apt语javapoet
apt注解处理器(参见RouteProcessor) :
APT(Annotation Processing Tool):
编译期注解处理技术,通过自定义注解和注解处理器来实现编译期生成代码的功能,并且将生成的代码和源代码一起编译成 class 文件
1.基础配置依赖等
2.继承AbstractProcessor
3.重写init方法对Element操作
什么是Element Element
Java- poet:
Arouter processor过程:
动态生成class文件过程
Android Gradle Transform
Gradle Transform是Android官方提供给开发者在项目构建阶段(.class -> .dex转换期间)用来修改.class文件的一套标准API,即把输入的.class文件转变成目标字节码文件。
目前比较经典的应用是字节码插桩、代码注入等。
参考:链接
1.gradle依赖
2.创建groovy 目录,创建 Transform 类(ARouter RegisterTransform)
transform方法中可以遍历所有的jar包里面文件和目录文件
DirectoryInput 集合 是指以源代码方式参与项目编译的所有目录结构及其目录下的源代码
JarInput 集合 是指以 jar 包方式参与项目编译的本地 jar 包和远程 jar 包,包含 aar
第三步创建 plugin(参考ARouter PluginLaunch), 注册 transform
第四步 创建 properties 文件 在 plugin/src/main 目录下创建新目录 resources/META-INFO/gradle-plguins, 然后创建文件,内容指定为上一步创建的 plugin
第五步,修改相关的 build.gradle 文件,添加依赖
Arouter 动态注册loadRouterMap register 方法的过程
流程:RegisterTransform 的transform扫描所有的class文件
调用ScanUtil.scanJar()扫描jar包
调用ScanUtil.scanClass()扫描所有class文件
ScanClassVisitor扫描每个class类,进行接口判断,如果在RegisterTransform.registerList配置的接口中,就搜集该类
扫描时需要判断class是否在com/alibaba/android/arouter/routes/的包下
在搜索jar包时,顺便把LogisticsCenter所在的文件找到,方便代码插入到这个类中
事件总线
参考文章:
Android组件化架构
Android组件化