前言
主要介绍hilt的整体框架,当前源码的讲解使用到案例会基于hilt demo。可自行下载。
AndroidEntryPointProcessor
类处理@AndroidEntryPoint和@HiltAndroidApp注解。当前使用该注解的节点校验并且生成AndroidEntryPointMetadata
对象,针对该`AndroidEntryPointMetadata对象再生成类。
校验并生成AndroidEntryPointMetadata对象
使用@AndroidEntryPoint或@HiltAndroidApp注解修饰的节点规则校验,校验过程中生成AndroidEntryPointMetadata对象。
校验规则
-
节点使用@HiltAndroidApp或@AndroidEntryPoint注解修饰有且仅有一个;
-
@HiltAndroidApp或@AndroidEntryPoint注解只能用于修饰类,而不能用于修饰接口;
-
@HiltAndroidApp或@AndroidEntryPoint注解修饰的类不能使用泛型;
-
判断 - @HiltAndroidApp或@AndroidEntryPoint注解修饰的类禁止超类验证(默认true) && @HiltAndroidApp或@AndroidEntryPoint注解的value值是Void.class类型:
-
4.1 true: @HiltAndroidApp或@AndroidEntryPoint注解修饰的类不是kotlin文件 || 如果是kotlin文件,那么该类存在不是默认参数的构造函数;
-
4.2 false:
-
① @HiltAndroidApp或@AndroidEntryPoint注解的value值不能是Void类型;
-
② @HiltAndroidApp或@AndroidEntryPoint注解修饰的类KaTeX parse error: Expected group after '_' at position 19: …SS extends Hilt_̲CLASS;
-
@HiltAndroidApp或@AndroidEntryPoint注解的value值类型,不能是@HiltAndroidApp或@AndroidEntryPoint注解修饰的类;否则形成死循环;
-
baseElement表示@HiltAndroidApp或@AndroidEntryPoint注解的value值节点(或@HiltAndroidApp或@AndroidEntryPoint注解修饰的类的父类),如果baseElement使用了@HiltAndroidApp或@AndroidEntryPoint注解修饰:
-
(1) @HiltAndroidApp或@AndroidEntryPoint注解修饰的类 和 其baseElement节点要么都使用@WithFragmentBindings注解修饰,要么都不要使用该注解;
-
(2) @HiltAndroidApp或@AndroidEntryPoint注解修饰的类不要使用@OptionalInject修饰的注解修饰 || baseElement类型使用@OptionalInject修饰的注解修饰;
-
@HiltAndroidApp只能用于修饰Application的继承类;
-
@AndroidEntryPoint可用于修饰Activity、Service、Broadcast_service,Fragment,View:
-
(1)@AndroidEntryPoint用于修饰Activity时,只能修饰androidx.activity.ComponentActivity的继承节点;
-
(2)@AndroidEntryPoint不能用于修饰Application的继承类。
AndroidEntryPointMetadata对象属性
-
TypeElement element: @HiltAndroidApp或@AndroidEntryPoint注解修饰的类;
-
TypeElement baseElement: @HiltAndroidApp或@AndroidEntryPoint注解的value值节点或@HiltAndroidApp或@AndroidEntryPoint注解修饰的类的父类;
-
ClassName generatedClassName:@HiltAndroidApp或@AndroidEntryPoint注解修饰的类KaTeX parse error: Expected group after '_' at position 18: …ASS生成的类名 - Hilt_̲CLASS;
-
boolean requiresBytecodeInjection: 判断 - @HiltAndroidApp或@AndroidEntryPoint注解修饰的类禁止超类验证 && @HiltAndroidApp或@AndroidEntryPoint注解的value值是Void.class类型;
-
AndroidEntryPointMetadata.AndroidType androidType: Type类的androidType属性;
- 注:下面有对AndroidType对象的描述;
-
Optional baseMetadata:baseElement(或其父节点)如果使用了@HiltAndroidApp或@AndroidEntryPoint注解修饰,生成的AndroidEntryPointMetadata对象;
-
ImmutableSet installInComponents:Type类的component属性;
- 注:下面有对Type类的描述;
-
TypeName componentManager:Type类的manager属性;
-
Optional componentManagerInitArgs:Type类的componentManagerInitArgs属性;
Type
该类主要有以下四个属性:
- ClassName component;
- AndroidType androidType;
- ClassName manager;
- CodeBlock componentManagerInitArgs。
针对Application、service、broadcast_receiver、activity、fragment和view组件采用不同处理。
Application
- ClassName component:SingletonComponent接口;
- AndroidType androidType:AndroidType.APPLICATION;
- ClassName manager:ApplicationComponentManager类