1. 程式人生 > >gradle:編譯過程中修改第三方jar包

gradle:編譯過程中修改第三方jar包

編譯過程中修改第三方jar包

背景

Android專案過程中要引入第三方開源的jar,根據需求又要對其進行破壞性的定製,不修改原始碼不行。然而種種規範和要求又不能讓我們將第三方原始碼全部拿過來再修改。
奇葩的需求和奇葩的硬性規範,導致如下難題:

工程依賴要用原始未修改的jar
jar裡面某幾個class要修改
開發不能將所有原始碼引入

解決思路

工程依賴使用原始jar
工程內引入需要修改的原始碼(包路徑、類名稱等需要和原始碼相同)
編譯時用我們修改後程式碼生成的class覆蓋原jar中同名class

gradle指令碼如下

apply plugin: 'java'
sourceCompatibility = 1.7 targetCompatibility = 1.7 // 解壓縮第三方jar包到某目錄,拷貝過程中去掉我們要修改的class task unzip(type: Copy) { // 原始jar包檔案 def zipFile = file('xxxxx/xxx/abcdef.jar') // 解壓縮目標目錄 def outputDir = file("unpacked/dist") // 檔案過濾,去除部分class。這裡建議寫精確點,因為可能存在名稱相同或相近的檔案。 FileTree jarTree = zipTree(zipFile).matching { exclude '**/com/my/aaa.class'
, '**/com/my/util/bbb*.class' } // 從jar的目錄樹中輸出到目標目錄 from jarTree into outputDir } sourceSets { main { // 這個目錄是我們修改的少數幾個java原始碼檔案 java.srcDirs = ['src/main/java'] // jar包中所有解壓縮出來的檔案作為resource resources.srcDirs = ['unpacked/dist'] } } // compileJava是這個plugin的預設編譯任務,我們要在編譯任務執行前,進行解壓縮的操作
compileJava.dependsOn unzip dependencies { // com.android.library這個外掛不支援依賴中寫class path // 相反的,java這個外掛也不支援依賴aar或android module compile files('unpacked/dist') // 如果引入的原始碼還有其他的依賴,也加進來 compile files('../../android.jar') }