24 декабря 2013

Спасаем программерские SSD

Недавно, ожидая завершения сборки проекта, я задумался, сколько операций файлового ввода-вывода происходит во время этого процесса: генерация файлов с байткодом, файлы ресурсов, одексированные файлы, оптимизация всего этого ProGuard'ом, выполнение тестов и т.п., а также отчёты и логи о каждом действии, и как это влияет на срок жизни моего SSD. И сразу захотелось прилинковать каталог с временными файлами системы сборки куда-нибудь в tmpfs. Сначала хотел написать shell-скрипт, но, быстро осознав негобкость такого подхода, решил включить соответствующие инструкции в сам проект, а также сделать их подходящими для повторного использования с минимумом усилий. В результате получился плагин SaveSSD для Gradle (системы сборки и управления зависимостями, используемой в качестве основной в Android Studio, а также поддерживаемой в некоторых других IDE). Полную инструкцию по использованию можно посмотреть на Github, где опубликованы исходники, а подключить скомпилированную библиотеку можно, сославшись на мой репозиторий в Bintray. Протестировано в Android Studio и Intellij IDEA на Android и Java проектах, но должно работать с любыми Gradle-проектами на *nix-системах (при запуске под Windows плагин просто ничего не делает). Кстати, поскольку скорость доступа к RAM существенно выше, чем к HDD, владельцы HDD тоже могут получить от этого плагина выгоду в виде ускорения сборки. Тем не менее, предусмотрена возможность включать и выключать его каждому участнику команды индивидуально, по желанию.

Итак, чтобы уменьшить нагрузку на ваш SSD при использовании Gradle, нужно:
  1. Активировать плагин в gradle.build (в данном случае, сославшись на новейшую версию плагина в репозитории)
    buildscript {
        repositories {
            maven {
                url 'http://dl.bintray.com/haunted-soft/maven'
            }
        }
        dependencies {
            classpath 'com.haunted.gradle-plugins:save-ssd:+@jar'
        }
    }
    apply plugin:'save-ssd'
    
  2. В gradle.properties (который обычно содержит индивидуальные настройки разработчика и не коммитится в общее хранилище кода) указать, что хотим, чтобы плагин работал на данной машине
    saveSSD = true
    
  3. Выполнить задачу clean (или удалить каталог /build вручную), а затем можно выполнять сборку проекта (или любые другие задачи) в вашем проекте как вы обычно это делаете.
    gradle clean
    gradle build
    
    Вы также можете запустить задачу saveSsd вручную - она запустится, игнорируя проверку saveSSD=true, но не будет ничего делать, если каталог /build существует и не пуст.
Пользуйтесь на здоровье, и долгой жизни вашим винтам!

Комментариев нет: