在使用gradle構建android應用的過程中,build tools提供的標準gradle task有時沒法滿足自己的要求(比如上傳、自動構建),或者有些問題需要一些自定義task纔可以解決(比如使用自定義task動態修改一些文件),這個時候就需要自定義task並結合標準task一起在構建版本的過程中達到自己的目的,那麼如何讓自己寫的task能放在指定標準task後運行呢?(或者說hack)
以我最近解決的問題爲例,因爲公司的產品使用了百川的jar包和so文件,但在使用build tools2.2.0的過程中,發現要打包的so文件被構建系統修改了(官方bug,詢問無果,暫無解),導致了阿里雲推送無法正常工作,於是我編寫了一個task,在即將打包時,把正常的so文件替換掉損壞的so文件,實現如下:
//開始--》移動正常的so文件到打包目錄中
task moveLibToTrip(type: Copy) {
from "bctrouble/armeabi/libsecuritysdk-3.1.27.so"
into "$buildDir/intermediates/transforms/stripDebugSymbol/CouponSimpleChinese/debug/folders/2000/1f" +
"/main/lib/armeabi/"
}
task moveLibToTrip2(type: Copy) {
from "bctrouble/x86/libsecuritysdk-3.1.27.so"
into "$buildDir/intermediates/transforms/stripDebugSymbol/CouponSimpleChinese/debug/folders/2000/1f" +
"/main/lib/x86/"
}
afterEvaluate {
tasks.matching {
it.name.startsWith('process') && (it.name.endsWith('ReleaseJavaRes') || it.name.endsWith
('DebugJavaRes'))
}.each { tk ->
tk.dependsOn(moveLibToTrip,moveLibToTrip2)
}
}
//結束
可以看到,這裏實現了task moveLibToTrip,moveLibToTrip2先於以process開頭以ReleaseJavaRes或DebugJavaRes結尾的標準task執行(當然還可以寫成it.name.equals(***),語法類似Java)。