之前看了微信Android模块化架构重构实践很受启发,对其中的".api
化"比较感兴趣,下面为自己的实现,和微信的效果有些许区别,但是能实现基本功能。
原理
- 找到所有需要暴露的接口文件
- 把他们打成
jar
包 - 发布到本地
maven
仓库 - 其他
module
引用jar
包使用
实现
-
约定需要暴露的接口文件规则:
- 因为打进
jar
包的是class
文件,所以按照微信的.api
后缀的做法就不能在我这里实现了,因为.api编译后还是.class
(除非自己javac
,这也是一种解决方案),所以我就在文件夹上进行标注,约定在"_apis_"
文件夹下的java/kotlin
文件为需要暴露的接口文件。 - 这样带来了一个好处就是兼容了
kotlin
文件,我们可以暴露使用kotlin
写的接口
- 因为打进
-
发布到本地
maven
仓库-
在需要暴露接口的
module
的build.gradle
中添加:apply plugin: 'maven-publish' task sourceJar(type: Jar) { //java编译后的class文件 from fileTree(dir: "${project.projectDir.absolutePath}/build/intermediates/classes/debug", include: '**/_apis_/**/*.class') //kotlin编译后的class文件 from fileTree(dir: "${project.projectDir.absolutePath}/build/tmp/kapt3/incrementalData/debug", include: '**/_apis_/**/*.class') } publishing { publications { bar(MavenPublication) { groupId 'your.group.id' artifactId project.name //使用当前module name作为jar的name version '1.0' artifact(sourceJar) } } repositories { maven { //发布到本项目的: 根目录/repo/ url "${rootProject.projectDir.absolutePath}/repo" } } }
-
Rebuild Project
后 找到gradle project
如下图:
image.png
-
依下图找到
publish task
,双击666
image.png
-
上述2步可以简洁化处理:在当前项目的
terminal
中执行./gradlew clean ./gradlew assembleDebug ./gradlew publish
-
使用
- 在项目根目录的
build.gradle
中添加:allprojects { repositories { maven { url "${rootProject.projectDir.absolutePath}/repo" } } }
- 在需要使用接口的
module
的build.gradle
中添加依赖provide 'you.group.id:module_name:1.0' //module_name为暴露接口的那个module的name