Рубрики
Без рубрики

Становление заводным в Android с файлами сборки на уровне модуля в Gradle

Вступление Эта серия будет посвящена основам разработки Android…. Помечено как java, android, новички, тристан.

Android (Серия из 20 частей)

  • Эта серия будет посвящена основам разработки Android. Присоединяйтесь ко мне, и давайте попробуем создать и понять несколько интересных вещей. Этот пост будет посвящен пониманию того, почему наши файлы сборки выглядят так, как они выглядят, и как они себя ведут. Если вы ищете более конкретную часть наших файлов сборки, например, compileSdkVersion 30 , пожалуйста, дождитесь моего следующего поста. Я оставлю ссылку ЗДЕСЬ как только это будет сделано.

что такое Gradle?

  • Gradle – это инструмент автоматизации сборки. Именно благодаря Gradle все наши файлы Android, классы, ресурсы и все остальное компилируются вместе и могут запускаться на эмуляторе или аппаратном устройстве. Gradle делает все это хорошо благодаря своим файлам сборки и плагинам, о которых мы скоро поговорим.

Что такое Заводной?

  • Groovy – это язык программирования, созданный для плавной интеграции с Java. Groovy позволяет нам быть более выразительными с нашей Java и позволяет вашему Java-коду больше походить на python. Происхождение Groovy происходит от создателя, который посмотрел документацию python и понял, что Java не хватает выразительности. Groovy – это язык программирования, который мы используем в файлах сборки Gradle.

  • Файлы сборки на уровне модуля означают файлы сборки, которые будут влиять только на наше приложение, а не на что-либо конкретное для Gradle, например, версию Android SDK.

  • Теперь, когда у нас есть общее представление о том, что происходит, давайте перейдем к коду из файла build.gradle .

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30

    defaultConfig {
        applicationId "com.example.criminalintent"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        println(getDelegate())
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

Что происходит?

  • Первое, о чем мы должны поговорить, это синтаксис, потому что он немного похож на JSON но на самом деле это набор вызовов методов на доменно-специфичном языке Gradle (DSL).
Что такое DSL?
  • Это язык программирования, специализированный для работы в определенном домене. Теперь, что такое DSL по отношению к Gradle? Ну, Gradle предоставляет свой собственный специализированный способ кодирования в своих файлах сборки, и мы можем сделать это либо с помощью Kotlin, либо с помощью Groovy (мы выбрали Groovy).

Давайте поговорим о плагинах

  • Прежде чем мы двинемся дальше, давайте поговорим о том, что такое плагин. Плагин – это единица работы в Gradle, что означает, что он позволяет Gradle что-то делать. На самом деле Gradle не может сделать так много сам по себе, именно из-за плагинов Gradle может делать такие вещи, как компиляция кода и объединение файлов вместе. Плагин для Android, который автоматически предоставляется нам, позволяет Gradle компилировать, связывать и запускать наши файлы на аппаратном устройстве. Без этого плагина мы не смогли бы правильно запустить наше приложение
КРАТКОЕ ЗАМЕЧАНИЕ О СИНТАКСИСЕ ПЛАГИНА
  • Я хотел бы отметить, что код плагина, который мы видим ниже, сильно отличается от остального кода в файле. Блок кода плагина является специальным, он называется plugin DSL (язык, специфичный для домена). Когда мы объявляем плагины, мы используем этот специальный синтаксис, который позволяет Gradle и нам быстро определять, какие плагины используются. Я не могу подчеркнуть это достаточно, синтаксис похож на остальную часть кода, но это не так!! С этого момента я буду ссылаться на блок кода плагина как DSL плагина .
plugins {
    id 'com.android.application'
}
  • Существуют различные типы плагинов, но плагин, который мы определили в DSL плагина, называется Бинарный плагин . Бинарные плагины определяются уникальным идентификатором, который является глобальным уникальным идентификатором. Без этого идентификатора Gradle не знает, о каком плагине мы говорим.
  • Вот где все будет хорошо с Groovy, если вы новичок в Android, вы можете избежать этого раздела. Мы будем говорить о скрытом синтаксисе в вашем файле сборки, за вычетом DSL плагина. Весь этот синтаксис создан благодаря DSL Gradle, предоставленному нам Groovy. Теперь я называю это скрытым синтаксисом, потому что, если вы не знакомы с DSL Gradle (который является просто специфической формой Groovy ) вас легко ввести в заблуждение, заставив поверить, что мы просто декларируем недвижимость.
android {
    compileSdkVersion 30
    println(getDelegate())
    defaultConfig {
        applicationId "com.example.criminalintent"
        minSdkVersion 23
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        println(getDelegate())
    }

}
  • Обычно, когда вы видите что-то подобное, вы думаете, что мы определяем свойства для системы сборки. Но благодаря синтаксису Groovy мы фактически выполняем множество вызовов методов для определенных объектов, которые меняются с каждым внутренним блоком кода. Если вы хотите посмотреть, что это за таинственные объекты, вызовите println(getDelegate()) в каждом блоке кода (обратите внимание, что println(getDelegate()) не работает в DSL плагина ). Печатный код просто более прост, так что не стесняйтесь читать документацию и осваиваться с языком. Если вы заглянете в файлы журнала Gradle, вы заметите кучу странных объектов, которые печатаются на консоли, это наша работа. Эти объекты являются делегатом объекты.

Что такое Делегат?

  • Делегат – это просто сторонний объект, который используется для поиска вызовов методов и свойств, когда они не могут быть найдены в непосредственной области. Теперь объекты делегирования важны, потому что в Groovy закрытие еще важнее.

Что такое закрытие?

  • В Groovy замыкание – это открытый анонимный блок кода, который может принимать аргументы, возвращать значение и назначаться в качестве переменной. Короче говоря, это функция. Еще одно важное замечание заключается в том, что у каждого замыкания есть объект делегата, который затем Groovy использует для поиска переменных и ссылок на методы, которые не входят в локальную область замыкания. Пожалуйста, прочтите это предложение еще несколько раз, это важный шаг в DSL Gradle.

Что все это значит??

  • Теперь, когда у нас есть четкое представление о том, что такое объект делегата и что такое замыкание, мы можем начать говорить о скрытом синтаксисе android{ } . Несмотря на то, что это не похоже на это, этот синтаксис на самом деле является отличным вызовом метода, и метод принимает замыкание в качестве параметра. таким образом, android { } становится android(закрытие) {} и все, что объявлено внутри блока android {}, является вызовом метода, который обращается к объекту делегата закрытия для ссылки. Каждое утверждение, за которым сразу следует {}, следует этой структуре. Здесь есть ссылка, которая более подробно описывает эту идею. Хорошо, откуда взялся этот объект делегата и почему он так много знает об Android? Он предоставляется нам через двоичный плагин, который мы определяем внутри DSL плагина . Мы даже можем доказать это, удалив плагин для Android и синхронизировав наши файлы сборки. Вы заметите ошибку, в которой говорится: Не удалось найти метод android() , это доказывает 2 вещи: 1) android {} действительно является методом и 2) плагин Android – это то, что делает все возможным.
  • Я изо всех сил старался сделать быстрый, легкий и удобоваримый пост в блоге о том, что происходит в нашем файле сборки. Тем не менее, я все еще новичок в Android и знаю, что, вероятно, пропустил несколько вещей. Поэтому, пожалуйста, ознакомьтесь с документацией по закрытиям Groovy, объектам делегирования и документации Gradle.

Заводные затворы

Файлы сборки

Язык сборки Gradle

Градуированный и заводной

Андроид и заводной

  • Спасибо, что нашли время в свой день, чтобы прочитать этот мой пост в блоге. Если у вас есть какие-либо вопросы или проблемы, пожалуйста, прокомментируйте ниже или свяжитесь со мной по адресу Твиттер .

Android (Серия из 20 частей)

Оригинал: “https://dev.to/theplebdev/getting-groovy-in-android-with-module-level-build-files-in-gradle-54fd”