2014-12-03 9 views
3

Я знаком с созданием больших приложений с использованием make, но теперь я начал использовать Android Studio, и я хочу понять, как делать то, что я уже делаю в Makefile.Внешние зависимости от Gradle

Вот пример, который может помочь вам сформулировать ответ:

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?

Я хочу разрешить внешние зависимости, например, упомянутые в приведенном выше примере. На самом деле я делаю это через «make», но я хочу полностью удалить этот дополнительный шаг.

+0

Gradle по умолчанию компилирует весь Drawable носителя из папки "вытяжки" в вашем андроида проекта.Он также автоматически распознает вложенные папки, такие как drawable-hdpi и drawable-mdpi, и будет использовать их, если это необходимо и доступно для поиска соответствующих изображений для разрешения. В файле build.gradle есть тэг 'dependencies', но из того, что я знаю, он в основном используется для добавления внешних JARS из проекта или, например, Maven, для подачи адреса во внешний репозиторий для загрузки библиотеки для вас. Надеюсь, это поможет вам на вашем пути. –

+0

@G_V Я знаю, что я хочу разрешить внешние зависимости, например, упомянутые в моем примере. Непродуктивно экспортировать каждое изображение вручную при его изменении. Фактически, в настоящее время я делаю это, используя «make», но я хочу полностью удалить этот дополнительный шаг. –

+0

Я могу себе представить, что я сам создаю все в коде на фоновом потоке, а затем кеширую то, что мне нужно, столько, сколько мне нужно. Работает достаточно хорошо, если у вас нет сотен больших рисунков, и в этом случае масштабирование по-прежнему не замедлит работу приложения, но сборщик мусора. Я не могу вам помочь, но, возможно, более рекомендуемые книги [рекомендуемые книги] Грэдля (https://www.gradle.org/books). –

ответ

3

Можно запускать внешние команды из Grandle и интегрировать их в процесс сборки. Мой пример запускает inkscape.exe в Windows и определяет его параметры в скрипте сборки, вы также можете запустить сценарий оболочки таким образом.

Следующий код указан в файле 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) 
} 

Вот ресурсы, которые я использовал:

Смежные вопросы