发布包含源码的Kotlin项目aar包到Maven

以上标题只是个总结,此篇文章实际是踩坑记录。java

原由

  1. 接手Kotlin项目时,前辈跟我说,项目中依赖的第一方Kotlin库没法调试。
  2. 排查调用栈时,依赖的第一方库的类居然没有源码,是反编译出来的。

直接原由

  1. 其实前辈跟我提及因1时,我还没明白啥意思,怎么Kotlin就不能调试了。
  2. 今天下午排查内存泄漏问题时,发现第一方的aar包居然没有关联上源码。
  3. 因而我就去maven仓库上把*-source.jar源码包下载到本地并解压,发现对于混合开发的项目,*-source.jar包只包含了Java源码,Kotlin源码并无被打包进来。
  4. 顿时,我回忆起了前辈跟我说的不能调试是啥状况,没有源码!无法跟踪调试。

解决过程

  • 找到lib用的打包发布到maven的gradle task 发现是这么配置源码包的:android

    task sourcesJar(type: Jar) {
      if (project.hasProperty("android")) {
          from android.sourceSets.main.java.sourceFiles
      } else {
          println project
          from sourceSets.main.allSource
      }
      classifier = 'sources'
    }
    复制代码
  • 去网上搜了一圈,好像你们都是这么配置frombash

  • 具体去Google详细的“kotlin”+“aar”+“源码”关键字时,找到的大多都是开源打包插件的maven-publish等的配置,而咱们公司的是本身写的,无法参考。maven

  • 尝试了一下使用from android.sourceSets.main.allSourcefrom android.sourceSets.main等配置,都报错。这个多是由于项目使用了默认的源码路径没有配置sourceSets,因此检查不到ide

  • 但偶尔有一次我使用from android.sourceSets.main时报错提示以下gradle

    * What went wrong:
    Cannot convert the provided notation to a File or URI: source set main.
    The following types/formats are supported:
    - A String or CharSequence path, for example 'src/main/java' or '/usr/include'.
    - A String or CharSequence URI, for example 'file:/usr/include'.
    - A File instance.
    - A Path instance.
    - A Directory instance.
    - A RegularFile instance.
    - A URI or URL instance.
    复制代码

灵感乍现,from后面能够跟路径呀。因而尝试以下配置ui

from android.sourceSets.main.java.getSrcDirs()
复制代码

果真奏效,task执行不报错,*-source.jar也将kt源码打包进去了。所谓不能调试的问题也就不存在了。spa

总结

猜想使用.sourceFiles时,gradle筛选了.java类型的文件进行打包。插件

而使用.getSrcDirs()把整个目录做为参数时,gradle再也不排查文件后缀,把全部目录下全部文件都打包进来了。调试

最终修改了打包任务以下,解决了含有kotlin的项目的打包问题:

task sourcesJar(type: Jar) {
    if (project.hasProperty("kotlin")) {
        from android.sourceSets.main.java.getSrcDirs()
    } else if (project.hasProperty("android")) {
        from android.sourceSets.main.java.sourceFiles
    } else {
        println project
        from sourceSets.main.allSource
    }
    classifier = 'sources'
}
复制代码
相关文章
相关标签/搜索