Pull to refresh

Полезные инструменты в Android Studio

Reading time5 min
Views11K


Прошло уже достаточно много времени с момента презентации Android Studio и наверняка у многих накопилось много знаний, нюансов и фишек, используемых часто в работе. Этим и хочется поделиться. Я начну, а вы продолжите…
  • SSD
  • Наполнение лэйаута тестовыми данными
  • Автоинкремент версии и изменение имени билда
  • Создание различных вариантов сборки
  • Пипетка
  • Просмотр истории блока кода




SSD


Сборщик Gradle собирает долго. Если на простом проекте время сборки занимает до 10 секунд, то на большом, со множеством модулей — до двух минут. С учётом того, что за день работы проект собирается десятки раз в день, выходит большая утечка времени и появляется раздражительность (комп иногда уходит в ANR, даже браузером невозможно пользоваться). Проблема решается просто — переходом обратно на Эклипс установкой SSD накопителя. Цена вопроса — 100$. Profit — плюс 5-25 минут в день.
Результаты моего тестирования SSD:
1. ANR винды пропали
2. Время сборки сложных проектов уменьшилось от максимум двух минут до максимум 20 секунд.
3. Покупка SSD позволяет безболезненно использовать genymotion в связке со студией.
Сравнение скоростей работы HDD(сверху) и SSD(снизу), подключенного через SATA 1:


Наполнение лэйаута тестовыми данными


Префикс «tools:» помимо линтовских функций позволяет наполнять лэйаут тестовым данными без последствий для приложения. «Все, что происходит в Вегасе, остается в Вегасе». Всё, что отмечено данным префиксом, отображается в лэйауте и удаляется во время сборки.

Возможны даже такие вещи:
android:visibility="gone”
tools:visibility="visible”

Более подробно здесь — tools.android.com/tips/layout-designtime-attributes.
Ознакомиться с дополнительными возможностями по использованию префикса «tools:» можно здесь — tools.android.com/tech-docs/tools-attributes.

Автоинкремент версии и изменение имени билда


Градл полностью автоматизирует сборку и позволяет собирать различные билды одним кликом. Ниже код из build.gradle, который позволяет не забыть поднять версию приложения и переименовывает билд с учётом версии и даты — appname-release_v50_2014-11-04
Пример:
import java.util.regex.Pattern

android {
    buildTypes {
        debug {
            applicationIdSuffix '.debug'
            debuggable true
            runProguard false
            jniDebugBuild false
        }
        release {
            signingConfig signingConfigs.release
            applicationVariants. { variant ->
                def file = variant.outputFile;
                def newName = file.name.replace("release.apk", "release_v" + getVersionCode() + "_" + getDate() + ".apk");
                variant.outputFile = new File(file.parent, newName)
           }
            runProguard true
            proguardFile file("proguard.pro")
            debuggable false
            jniDebugBuild false
        }
    }
}

def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyy-MM-dd')
    return formattedDate
}

def getVersionCode() {
    println "getVersionCode"
    def manifestFile = file("AndroidManifest.xml")
    def pattern = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcher = pattern.matcher(manifestText)
    matcher.find()
    def version = ++Integer.parseInt(matcher.group(1))
    println sprintf("Returning version %d", version)
    return version
}

task incrementVersionCode << {
    println(":incrementVersionCode - Incrementing Version Code...")
    def manifestFile = file("src/main/AndroidManifest.xml")
    def patternVersionCode = Pattern.compile("versionCode=\"(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcherVersionCode = patternVersionCode.matcher(manifestText)
    matcherVersionCode.find()
    def mVersionCode = Integer.parseInt(matcherVersionCode.group(1))
    def mNextVersionCode = mVersionCode + 1
    def manifestContent = matcherVersionCode.replaceAll("versionCode=\"" + mNextVersionCode + "\"")
    println(":incrementVersionCode - current versionCode=" + mVersionCode);
    println(":incrementVersionCode - next versionCode=" + mNextVersionCode);
    manifestFile.write(manifestContent)
}
task incrementVersionName << {
    println(":incrementVersionName - Incrementing Version Name...")
    def manifestFile = file("src/main/AndroidManifest.xml")
    def patternVersionNumber = Pattern.compile("versionName=\"(\\d+)\\.(\\d+)\"")
    def manifestText = manifestFile.getText()
    def matcherVersionNumber = patternVersionNumber.matcher(manifestText)
    matcherVersionNumber.find()
    def majorVersion = Integer.parseInt(matcherVersionNumber.group(1))
    def minorVersion = Integer.parseInt(matcherVersionNumber.group(2))
    def mVersionName = majorVersion + "." + minorVersion
    def mNextVersionName = majorVersion + "." + (minorVersion + 1)
    def manifestContent = matcherVersionNumber.replaceAll("versionName=\"" + mNextVersionName + "\"")
    println(":incrementVersionName - current versionName=" + mVersionName);
    println(":incrementVersionName - new versionName=" + mNextVersionName);
    manifestFile.write(manifestContent)
}
task release << {
    println(":release - Build and Version Increment")
}
task debug << {
    println(":debug - Build")
}
incrementVersionName.mustRunAfter build
incrementVersionCode.mustRunAfter build
debug.dependsOn assembleDebug
release.dependsOn assembleRelease
release.dependsOn incrementVersionCode
release.dependsOn incrementVersionName


Далее остаётся запустить команду release главного модуля проекта.


Создание различных вариантов сборки


Думаю один из самых простых и популярных вариантов использование данной возможности это создание бесплатной и платной версии приложения или версии под релизный и тестовый сервер.

Ниже пример на данную тему
Пример:
Указываем варианты сборки — free и paid, и соответствующие параметры в build.gradle
  productFlavors {
        free {
            packageName "by.yegorov.communal"
            buildConfigField "boolean", "PAID", "false"
        }

        paid {
            packageName "yo.mobile.meters"
            buildConfigField "boolean", "PAID", "true"
        }
    }

В случае релизного и тестового сервера:
productFlavors {
        debugServer {
            buildConfigField "String", "SERVER_PATH", "\"http://test.api.ru\""
        }

        releaseServer {
            buildConfigField "String", "SERVER_PATH", "\"http://api.ru\""
        }
  }

Затем создаём папки в src с соответствующими названиями. Получится следующая структура проекта:

В ресурсах указываем различающиеся данные. Например, различные ключи для google analytics, crittercism, google backup service и пр.
В коде делаем проверки на BuildConfig.PAID для реализации логики.


Пипетка


Пипетка позволяет узнать код цвета с любой области на экране. Многие её просто не замечают и пользуются пэйнтом для того, чтобы узнать код цвета с картинки. Обратите внимание на левый верхний угол. Данная диаложка вызывается из colors.xml при клике по цвету.


Просмотр истории блока кода



Согласитесь, стандартная ситуация при работе в команде. Не знаю, как давно существует данное решение и есть ли оно в эклипсе, но вещь действительно полезная:


Всем спасибо! Жду ваших комментариев.

Only registered users can participate in poll. Log in, please.
Ваше отношение к Android Studio:
14.15% Не пробовал15
1.89% Пробовал, вернулся на Eclipse2
83.96% Попробовал и остался89
106 users voted. 17 users abstained.
Tags:
Hubs:
0
Comments0

Articles