Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradle: глубокое погружение (Moscow Android Dev...

Gradle: глубокое погружение (Moscow Android Devs Meetup)

Gradle — отличный элегантный инструмент для создания сборок, но те скрипты, с которыми привыкли работать Android-разработчики, являются очень простыми.
Рассмотрим Gradle более глубоко.

Video: https://it.mail.ru/video/199/
Moscow Android Devs Meetup – 8 октября

Alexander Smirnov

October 08, 2015
Tweet

More Decks by Alexander Smirnov

Other Decks in Programming

Transcript

  1. - Базис - Управление зависимостями - Непонимание - Полезности -

    Дополнительные ресурсы О чём будем говорить? 5
  2. 2

  3. Элементы уровня проекта 16 - Control Flow не определяется Build

    автором.
 «Магически приходит из вне»
 
 
 
 Концепция «у меня» apply plugin: 'com.android.application'
  4. Элементы низшего уровня 17 sourceSets {
 integTest {
 java.srcDir file('src/integration-test/java')


    resources.srcDir file('src/integration-test/res')
 compileClasspath = sourceSets.main.output + configurations.integTest
 runtimeClasspath = output + compileClasspath
 }
 } - Control Flow cокрыт
  5. BuildVariants 18 apply plugin: 'com.android.application' android {
 compileSdkVersion 22
 buildToolsVersion

    "22.0.1"
 
 flavorDimensions "abi", "version"
 
 productFlavors {
 free { flavorDimension "version" }
 paid { flavorDimension "version" }
 arm { flavorDimension "abi" }
 x86 { flavorDimension "abi" }
 }
 } 300 Tasks 18 Sub Projects
  6. Важное замечание 19 Концепция декларативной сборки системы 
 относится только

    к Build Author. Для Build User процесс сборки происходит
 на императивном уровне – Control Flow определён.
  7. - Исключение (Exclude) - Замена (Substitution) - Правила выбора (Selection

    Rules) Управление зависимостями 22 Демо
  8. 25 Непонимание - Где живут переменные? - Когда же выполнится

    этот таск? - Как этот код работает? - Как другие разработчики узнают 
 как решить мою проблему?
  9. 27 Давайте с простого {} android { /* */ }

    android({ /* */ }) android() = android.apply() android.apply(Closure configuration)
  10. 28 Области видимости String localScope1 = 'localScope1'
 def localScope2 =

    'localScope2'
 ext.globalScope = 'extraProperty'
 
 println localScope1
 println localScope2
 println globalScope
 
 println ''
 def closure = {
 def localScope3 = 'localScope3'
 println localScope1
 println localScope2
 println globalScope
 println localScope3
 } def method() {
 println ''
 try {
 println localScope1
 } catch (MissingPropertyException e) {
 println 'localScope1NotAvailable'
 }
 try {
 println localScope2
 } catch(MissingPropertyException e) {
 println 'localScope2NotAvailable'
 }
 println globalScope
 }
 
 closure.call()
 method()

  11. 29 Области видимости sm:Gradle sm$ gradle localScope1 localScope2 extraProperty localScope1

    localScope2 extraProperty localScope3 localScope1NotAvailable localScope2NotAvailable extraProperty
  12. 31 Объяснение repositories {
 maven { url "example" }
 }

    repositories {
 maven { url "example" maven { url "example" }
 }
 } def maven(Closure closure) repositories { SEARCHED_SECOND
 maven { url "example" SEARCHED_FIRST maven { url "example" }
 }
 }
  13. 34 Фазы запуска println 'Фаза конфигурации'
 task configured {
 println

    'Фаза конфигурации: ещё одна'
 }
 task test << {
 println 'Фаза выполнения'
 }
 task testBoth {
 doFirst {
 println 'Фаза выполнения: doFirst'
 }
 doLast {
 println 'Фаза выполнения: doLast'
 }
 println 'Фаза конфигурации: :)'
 } sm:Gradle sm$ gradle test testBoth Фаза конфигурации Фаза конфигурации: ещё одна Фаза конфигурации: :) :app:test Фаза выполнения :app:testBoth Фаза выполнения: doFirst Фаза выполнения: doLast
  14. Быстродействие: Jack And Jill 37 - Jack (Java Android Compiler

    Kit) - Jill (Jack Intermediate Library Linker) userJack=true
  15. Splits 38 - Рекомендованный вариант для создания multi-APK - Варианты

    независимы друг от друга - Затрагивает только упаковку - Компиляция, proguard, dex – общий
  16. Размер APK 39 defaultConfig {
 resConfigs "en", "ru"
 resConfigs "nodpi",

    "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
 } splits {
 density {
 enable true
 exclude 'ldpi', 'tvdpi'
 compatibleScreens 'small', 'normall', 'large', 'xlarge'
 }
 }
  17. BuildConfig 40 buildTypes {
 debug {
 buildConfigField "String", "SERVER_PREFIX", "\"test.\""


    } release {
 buildConfigField "String", "SERVER_PREFIX", "\"\""
 } }
  18. android {
 compileSdkVersion compileSdkProjectVersion
 buildToolsVersion buildToolsProjectVersion
 //… } 
 ext.googlePlayVersion

    = '7.8.0'
 
 dependencies {
 compile "com.android.support:appcompat-v7:$supportLibraryVersion"
 compile "com.google.android.gms:play-services-base:$googlePlayVersion"
 compile "com.google.android.gms:play-services-maps:$googlePlayVersion"
 compile "com.google.android.gms:play-services-location:$googlePlayVersion" } BuildConfig_2 41 ext.compileSdkProjectVersion = 22
 ext.buildToolsProjectVersion = '22.0.1'
 ext.supportLibraryVersion = '22.2.1'
  19. BuildVariant or Library? 42 - Одновременное использование 2 flavor (variant)

    - Гибкость использования SourceSets (variant) - Лучшее разделение кода/тестов (library) - Переиспользование кода между различными приложениями (library)
  20. 43

  21. Не смешивайте 45 - Build скрипт для настройки сборки -

    Код содержащий логику выносите в отдельные файлы
  22. Crashlytics 45 android { // … buildTypes { debug {

    ext.enableCrashlytics=false } release { // … ext.enableCrashlytics=true } }
  23. - Udacity – Gradle A&J: https://goo.gl/jQdeDJ - Gradle User Guide:

    https://goo.gl/VtlIz7 - Gradle Goodness: http://goo.gl/sDHZJo - Search Plugins: https://plugins.gradle.org/ - IO13 Introduction: http://goo.gl/u0BjIy - NDK с полпинка: http://goo.gl/vu94Db Дополнительные ресурсы 49
  24. Итого 47 - Базис - Управление зависимостями - Непонимание -

    Полезности - Дополнительные ресурсы