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”