java-动态模块添加注解处理器

前言:

最近接了个任务要在app中接入QQ小游戏sdk。因为该小游戏只是在国内不在googleplay发行,则需要做成动态模块的方式。

步骤

一、在工程中创建动态模块

二、接入QQ小游戏sdk

1、该sdk暂时不支持外部maven,则需要把对应的sdk拷贝到自己的目录下。

2、将对应sdk的aar和jar拷贝到libs目录下

3、因为要求必须要实现MiniAppProxy,并且要实现的Proxy必须添加注解

4、添加完之后验证是否添加sdk并且实现MiniAppProxy成功,编译之后发现找不到ExtProxyServiceScope对应的类

三、问题排查

1、排查是不是动态模块比较特殊:将对应的sdk和实现添加的注解放到主app或者添加到静态模块,发现都能够生成ExtProxyServiceScope。

2、怀疑是不是动态模块是不是哪里的配置不对,排查了很久发现自己本身的gradle配置没啥问题

3、再重新看QQ小游戏的demo,发现他是通过如下的方式

        // 本地maven,外网maven申请中,也可以把repository目录下的aar拷贝到自己的项目
        maven {url '../repository'}


    def miniSdkVersion = '1.6.41'
    annotationProcessor "com.tencent.qqmini:miniannotation_processor:${miniSdkVersion}"
    implementation "com.tencent.qqmini:miniannotation:${miniSdkVersion}"
    implementation "com.tencent.qqmini:minigame:${miniSdkVersion}"

通过将对应的sdk放到本地的repository目录下然后再进行处理注解和导入

这样子也通过他这种方式进行操作发现竟然可以了;

 

事情到这里就开始研究为啥这种方式这种方式和放到lib的方式的区别

四、原因发现

1、maven中,会放对应的jar或者aar还有pom文件。重点在这个pom文件,该文件会描述本jar包的名字还有对应的依赖项。

通过这个去查看注解的jar对应的依赖项:

发现除了miniannotation的jar文件,还有依赖另外的一个文件javapoet;该文件的功能才是生成注解文件必要的文件

那么小游戏sdk的jar和aar放到libs的方式应该是可行的,只要再导入javapoet就可以了。

即:

implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

implementation "com.squareup:javapoet:1.11.1"

编译发现还是不对~~~~

不能只是implementation么?

通过对比demo发现,注解处理器导入的方式有点区别:annotationProcessor "xxxxxxx" 这种方式,而不是implementation的方式

那么修改成

    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])

    annotationProcessor files('libs/miniannotation_processor-1.6.41.jar')
    implementation "com.squareup:javapoet:1.11.1"

 

发现可以了,然后通过另外的关键字kapt测试是否可以,发现也是没有问题。通过上网发现注解处理器的导入还可以通过kapt 而不止有annotationProcessor

那么kapt和annotationProcessor到底有啥区别呢?这里问了下chatgpt,他给了对应的解释

`kapt`(Kotlin Annotation Processing Tool)和 `annotationProcessor` 都是用于处理注解的 Gradle 依赖项配置。它们在处理注解方面具有相似的功能,但主要的区别在于它们所支持的编程语言。
1. `annotationProcessor`:这个配置是 Android 项目中 Java 模块使用的默认注解处理器配置。它只能处理 Java 代码中的注解。当你在 Java 编写的 Android 项目中使用注解处理器时,可以通过此项配置添加相应的依赖。
2. `kapt`:这个配置专门针对 Kotlin 项目设计。由于 Kotlin 和 Java 存在差异,因此单独使用 `annotationProcessor` 无法正确处理 Kotlin 代码中的注解。因此,Kotlin 项目需要使用 `kapt` 来代替 `annotationProcessor` 进行注解处理。
如果你的 Android 项目使用 Kotlin 编写,你应该将注解处理器依赖添加到 `kapt` 而不是 `annotationProcessor`。

 

通过上述的说明,如果支持kotlin则可以使用kapt

 

五、总结

1、注解处理器不管是在静态模块还是动态模块都是能够生成的

2、放弃maven,使用本地libs导入的方式需要注意该jar文件对应的pom文件是否有描述依赖的文件,如果有则需要保证所有的文件已经导入

3、在发现demo可以但是本地不行的时候,要先对比demo跟本地的差异是什么而不是先去验证在app是否可以为啥可以而本动态模块不一样

 

posted @   LCAC  阅读(264)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示