發佈包含源碼的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'
}
複製代碼
相關文章
相關標籤/搜索