@Compose 注解到底做了什么?了解一下~

本文深入探讨了Kotlin Compose中的注解,揭示了它们如何通过编译插件工作,实现函数转换和功能增强。与注解处理器不同,Compose注解通过Kotlin编译插件实现,提供了更快的编译速度和代码修改能力。文中介绍了注解的注册、添加参数等关键步骤,展示了Compose如何在函数中插入参数以实现智能重组和状态跟踪。文章总结了Compose注解处理的复杂性和优势,并提到了替代方案KSP。
摘要由CSDN通过智能技术生成

前言

了解过Compose的同学都知道,只需要添加一个@Compose注解就可以将函数转化成Compose函数,同时Compose函数也只能在Compose函数中运行。这看起来似乎跟协程比较像,@Compose是不是也像协程一样,往函数中添加了一些参数呢?

我们就一起来看下,@Compose到底做了什么,又是怎么做到的。

前置知识

一看到@Compose注解,我们很容易就想到注解处理器,但是@Compose的解析并不是通过注解处理器来实现的,因为注解处理器只能生成代码,不能修改代码
KCPKotlin Compiler Plugin):即kotlin编译插件,支持跨平台,android开发可以将它类比为kapt+transform机制,既可以生成代码,也可以修改代码

@Compose注解的解析就是通过KCP来实现的

什么是KCP

Kotlin编译过程简单来说,就是将Kotlin源码编译成字节码的过程,具体步骤如下所示:

Kotlin编译期插件则在编译过程中提供Hook时机,让我们可以解析符号,修改字节码生成结果等。
Kotlin库中的不少语法糖都用到了KCP,比如Kotlin-android-extension@Parcelize等,@Compose注解同样也是通过KCP解析的

相比KAPTKCP主要有以下优点:

  1. KAPT是基于注解处理器的,它需要将Kotlin代码转化成Stub再解析注解生成代码,常常转化成Stub的时间比生成代码还要长,而KCP则是直接解析Kotlin的符号,因此在编译速度上KCPKAPT要强的多
  2. KAPT只能生成代码,不能修改代码,而KCP不仅可以生成代码,也可以修改代码,可以看作是kapt+transorm机制

KCP的缺点则在于,KCP 的开发成本太高,涉及 Gradle PluginKotlin Plugin 等的使用,API 涉及一些编译器知识的了解,一般开发者很难掌握。
因此如果只是需要处理注解生成代码,不需要修改代码,通常使用KSP就足够了,KSP是对KCP的一个封装,如果对KSP的使用详情感兴趣可参见:告别KAPT!使用 KSP 为 Kotlin 编译提速

KCP的基本概念

上面也说到了,KCP的开发成本较高,主要包括以下内容:

  • PluginGradle 插件用来读取 Gradle 配置传递给 KCPKotlin Plugin
  • Subplugin:为 KCP 提供自定义 KPmaven 库地址等配置信息
  • CommandLineProcessor:负责将Plugin传过来的参数转换并校验
  • ComponentRegistrar:负责将用户自定义的各种Extension注册到KP中,并在合适时机调用

ComponentRegistrar是核心入口,所有的KCP自定义功能都需要通过这个类注册一些Extension接口来实现。

下面列举一些常用的Extension接口,大家可以根据需求选用:

  • IrGenerationExtension,用于增/删/改/查代码
  • DiagnosticSuppressor,用于抑制语法错误,Jetpack Compose有使用
  • StorageComponentContainerContributor,用于实现IOC

@Compose注解的作用

上面介绍了KCP的基本概念,下面看下在Jetpack Compose@Compose注解到底是怎么解析的,又起了什么作用

注册IrGenerationExtension

上面我们介绍了ComponentRegistrar是核心入口,负责将用户自定义的各种Extension注册到KP中,并在合适时机调用,而IrGenerationExtension可以用于修改代码
Compose插件的入口为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值