前言:
最近接了个任务要在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是否可以为啥可以而本动态模块不一样
标签:java,implementation,jar,处理器,模块,注解,annotationProcessor,sdk From: https://www.cnblogs.com/czwlinux/p/17341728.html