2014-12-03 153 views
3

外部依賴我所熟悉的建築使用make大型應用程序,但現在我已經使用過Android Studio開始,我想知道如何做的事情我已經在做Makefile在搖籃

這裏有一個例子,可以幫助你編一個答案:

的Makefile例子:(簡約)

INK=inkscape 
INKFLAGS=--export-area-page 

# Resolve *.png dependencies 
drawable-mdpi/%.png: %.svg 
     $(INK) $< [email protected] -w 48 -h 48 $(INKFLAGS) 

drawable-hdpi/%.png: %.svg 
     $(INK) $< [email protected] -w 72 -h 72 $(INKFLAGS) 

drawable-xdpi/%.png: %.svg 
     $(INK) $< [email protected] -w 96 -h 96 $(INKFLAGS) 

更簡單的例子:

drawable-mdpi/ic_launcher.png: ic_launcher.svg 
     inkscape ic_launcher.svg --export-png=ic_launcher.png -w 48 -h 48 --export-area-page 

drawable-hdpi/ic_launcher.png: ic_launcher.svg 
     inkscape ic_launcher.svg --export-png=ic_launcher.png -w 72 -h 72 --export-area-page 

如何在Gradle中做到這一點?

我想解決外部依賴性,如上面的例子中提到的。其實,我通過「讓」做它,但我想徹底刪除這個額外的步驟。

+0

搖籃默認編譯所有的繪製媒體在你的Android項目中的 「繪製」 文件夾中。它還自動識別子文件夾,例如drawable-hdpi和drawable-mdpi,並在適當的情況下使用這些子文件夾來查找適當的圖像以獲得解決方案。 build.gradle文件中有一個'dependencies'標籤,但是據我所知它主要用於從項目或Maven中添加外部JARS,以向外部存儲庫提供地址以便爲您下載庫。希望它有助於你在路上的一點點。 – 2014-12-18 13:09:52

+0

@G_V我知道,我想解決外部依賴關係,如我的示例中提到的。修改時手動導出每個圖像都是非生產性的。實際上,目前我正在使用'make'來做這件事,但我想徹底刪除這個額外的步驟。 – 2014-12-19 01:15:40

+0

我可以想象,我在後臺線程上將所有代碼都預先標記爲自己,然後根據需要緩存我需要的內容。除非你有數百個大型繪圖工具,否則工作效果不夠好,在這種情況下,縮放本身仍然不會減慢應用程序的速度,但垃圾收集器的確如此。我無法真正幫助你,但也許Gradle的[推薦書籍](https://www.gradle.org/books)更有用。 – 2014-12-19 11:17:06

回答

3

它可以從Grandle運行外部命令和整合這些到您的構建過程。我的例子在Windows上運行inkscape.exe,並在構建腳本定義了它的參數,你也可以只運行一個shell腳本這樣。

下面的代碼進入app\build.gradle文件。任務convertDrawable是寫在Groovy的語法和完成以下(文藝青年最愛的是你「簡單的例子」的實現):

  • 它看起來在所有的*.svg文件自定義文件夾art/drawable
  • 在每個*.svg文件中,查看資源文件夾中的所有drawable-*文件夾
  • 基於drawable-*文件夾名稱,確定目標分辨率。
  • 然後調用inkscape.exe轉換每個*.svg*.png與所需的尺寸。

代碼:

task convertDrawables() { 
    def ink = 'C:\\Program Files (x86)\\Inkscape\\inkscape.exe' 

    // look for *.svg files in app/src/art/drawable folder 
    new File('app\\src\\art\\drawable').eachFileMatch(~/.*\.svg/) { file -> 
     // look for destination folders 
     new File('app\\src\\main\\res').eachFileMatch(~/drawable-.*/) { outputDir -> 

      // define size based on folder name 
      def size = '' 
      switch (outputDir.getAbsolutePath()) { 
       case ~/.*-ldpi/: 
        size = '36' 
        break 
       case ~/.*-mdpi/: 
        size = '48' 
        break 
       case ~/.*-hdpi/: 
        size = '72' 
        break 
       case ~/.*-xhdpi/: 
        size = '96' 
        break 
       case ~/.*-xxhdpi/: 
        size = '144' 
        break 
       case ~/.*-xxxhdpi/: 
        size = '192' 
        break 
      } 
      def cmd = ink + ' ' + file.getCanonicalPath() + ' --export-png=' + outputDir.getAbsolutePath() + '\\ic_launcher2.png -w ' + size + ' -h ' + size + ' --export-area-page' 
      def process = cmd.execute(); 
      process.waitFor(); 
     } 
    } 
} 


// make sure the convertDrawable task is executed somewhere in the make process 
gradle.projectsEvaluated { 
    preBuild.dependsOn(convertDrawable) 
} 

下面是我使用的資源: