2015-08-18 34 views
2

我有一個任務可以根據Android Gradle版本中編譯的類生成元數據文件。我可以通過編譯任務後執行它來運行它:Android/Gradle:在編譯階段之後添加資源

android.applicationVariants.all { variant -> 
    def variantName = variant.name.capitalize() 
    def compileSourcesTaskName = "compile${variantName}Sources" 
    def compileSourcesTask = project.tasks.findByName(compileSourcesTaskName) 
    compileSourcesTask.finalizedBy "myTaskThatGeneratesAssets" 
} 

不幸的是,Android此時已經處理了資產。新文件不會包含在組裝好的APK中。

similar question的回答建議在對齊/簽名前致電aapt add將文件添加到APK中。這似乎可以工作,但該帖子沒有進入實現細節。在the Android Gradle plugin中調用aapt的代碼對於構建腳本來說看起來相當複雜,我不確定如何訪問它引用的IAndroidTarget

我會很感激如何實施這個,或任何其他解決方案的建議!

回答

1

好的,這就是我最終的結果。它提出了兩個假設可以在Android插件的gradle更高版本的破解(我使用的是1.3.0):

  1. 的平臺工具的路徑是${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.buildToolsVersion}/
  2. 中間體(資源)的路徑APK是${buildDir}/intermediates/res/resources-${variant.baseName}.ap_

只要那些是真實的,這應該產生一個任務添加使用aapt資源後APK已經建立了新的資源文件:

def overlayDir = ... // path to a resources overlay directory that contains "assets/my.json" 
def addMyAssetTaskName = "add${variantName}MyAsset" 
task "${addMyAssetTaskName}" (type: Exec) { 
    dependsOn myTaskThatGeneratesAssets 
    workingDir overlayDir 
    def aaptCommand = "${android.getSdkDirectory().getAbsolutePath()}/build-tools/${android.buildToolsVersion}/aapt" 
    def apkPath = "${buildDir}/intermediates/res/resources-${variant.baseName}.ap_" 
    commandLine aaptCommand, 'add', apkPath, "assets/my.json" 
} 

然後我使用finalizedBy像上面的問題addMyAssetTaskName