Write custom kotlin gradle build plugin

Введение

Kotlin, язык программирования с открытым исходным кодом, разработанный JetBrains, становится все более популярным среди разработчиков Java. Он часто рекламируется как преемник Java. По сравнению с Java, он предлагает более богатый опыт разработки, потому что он более современный, выразительный и лаконичный.

Если вы ищете альтернативный язык программирования для разработки Android, вы должны попробовать Kotlin. Его можно легко использовать вместо или в сочетании с Java в ваших проектах Android.

В этом уроке я покажу вам, как использовать плагины Kotlin и Kotlin в ваших проектах Android Studio.

Gradle

Add the plugin artifact to the build script dependencies and apply the plugin:

buildscript {
dependencies {
classpath
«org.jetbrains.kotlin:kotlin-allopen:$kotlin_version»
}
}

apply plugin: «kotlin-allopen»

As an alternative, you can enable it using the block:

plugins {
id «org.jetbrains.kotlin.plugin.allopen» version «1.6.10»
}

Then specify the list of annotations that will make classes open:

allOpen {
annotation(«com.my.Annotation»)
// annotations(«com.another.Annotation», «com.third.Annotation»)
}

If the class (or any of its superclasses) is annotated with , the class itself and all its members will become open.

It also works with meta-annotations:

@com.my.Annotation
annotation class MyFrameworkAnnotation

@MyFrameworkAnnotation
class MyClass // will be all-open

webpack configuration customization

To customize webpack configuration, you can apply additional scripts by placing them in the directory . The scripts will be appended to the end of config script. Use number prefix to change order (it is very similar to UNIX rc.d config directories)

Sample structure:

  • webpack.config.d
    • css.js
    • minify.js
    • 10-apply-ealier.js
    • 20-apply-later.js

Karma

Karma configuration:

This will generate a config file located at .

Note that for your tests to run correctly with webpack their module type must be defined as well:

If you would like to use a custom then specify it using :

Your custom config file will be copied to the build folder and renamed to .

karma log is located at

Hot module replacement

Webpack does a lot of work for you however to get it working well most likely you have to implement state save and restore functionality via webpack’s API. See HMR.kt for corresponding Kotlin external declarations for webpack API and main.kt for sample save/load.

Briefly at module load accept HMR feature and listen for disposal

module.hot?.let { hot ->
    hot.accept() // accept hot reload
    
    hot.dispose { data -> // listen for disposal events
        data.my-fields =  // put your state in the 'data' object
    }
}

To get previously saved state at module load use

    module.hot?.data?.let { data -> // if we have previous state then we are in the middle of HMR
        myRestoreFunction(data) // so get state from the 'data' object
    }

Finally use Gradle continuous build with run task to get live replacement every time you change your code.

Публикация плагина в локальную директорию

Ваш плагин готов! Для публикации в вашу локальную директорию откройте файл build.gradle в вашем проекте IntelliJ и добавьте:

После добавления кода снова синхронизируйте изменения Gradle. Эта задача опубликует ваш плагин в желаемом месте. Вы можете выполнить задачу, щелкнув зеленую кнопку воспроизведения рядом с задачей или выполнив команду ./gradlew -q uploadArchives в терминале. Скомпилируйте и запустите, и вы увидите директорию плагина в желаемом месте.

Затем вы будете использовать его в своем проекте Android Studio. Снова запустите проект ProjectTracker и откройте файл build.gradle на уровне проекта. Внутри repositories в блоке buildscript добавьте:

И добавьте в задачу dependencies:

Теперь ваш проект имеет доступ к файлам плагина. Для его применения откройте на уровне модуля файл build.gradle и добавьте следующие строки в файл Gradle:

В итоге вы можете вызвать задачу в файле build.gradle, добавив в самый низ:

Запустите ./gradlew clean для очистки Gradle и вызовите ./gradlew -q writeModuleDependencies. Наслаждайтесь вашим плагином!

Что дальше?

Вы можете загрузить окончательный проект, нажав кнопку Download Materials.

Фух! В этом руководстве вы узнали о многих вещах. Теперь вы можете создать свой собственный плагин Gradle и использовать его в разных проектах.

И это еще не все! Чтобы узнать больше о плагине Gradle и о том, что еще вы можете с ним сделать, ознакомьтесь с официальной документацией Gradle.

Использование Kotlin

Для упрощения примера я покажу как создал Activity с одним единственным TextView, отображающим строку.

Убедитесь, что ваш класс является подклассом Activity и переопределен метод onCreate. Ваш класс должен выглядеть так:

package com.hathy.kotlinsample
 
import android.app.Activity
import android.os.Bundle
 
public class MainActivity: Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }
}

Создайте экземпляр класса TextView как локальную переменную с помощью ключевого слова val:

val myMessage = TextView(this)

Вызовите метод setText у TextView для установки текста и установите его как layout с помощью метода setContentView.

myMessage.setText("Hello")
setContentView(myMessage)

Также как и Activity на Java, вам нужно объявить вашу Kotlin-Activity в AndroidManifest.xml. Вот так выглядит объявление Activity в манифесте:

<activity android:name=".MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN"/>
        <category android:name="android.intent.category.LAUNCHER"/>
    </intent-filter>
</activity>

Теперь вы можете скомпилировать и запустить приложение на вашем Android-устройстве или эмуляторе. Хотя компилятор Kotlin немного медленнее, чем Java, вы вряд ли ощутите особую разницу во время сборки вашего проекта.

kotlin-android актуальный боевой проект (общая конфигурация проекта приложения — gradle и класс приложения)

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>style=»clear:both;»>

Kotlin впервые начал контактировать два года назад, уделял внимание и учился.Как дополнительный язык для java старшего брата, он дает людям ощущение свежести. перестань говорить чушь Начнем с настройки проекта

Конфигурация основного модуля

Поговорим о первом классе котлина

Приложение должно интегрировать конфигурацию болезни приложения в манифест, имя пользователя и loginpwd — это статическая аутентификация для входа, от ленивого использования — ленивая загрузка companion — это статический блок kotlin, instance — статический экземпляр App, используемый для сохранения инструментов или других экземпляров, получает только ? Необязательный тип, Приложение использует Realm для хранения данных orm для синхронизации с хранилищем данных ios. iconfont — это библиотека значков, используемая в приложении.

Интеллектуальная рекомендация

1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…

Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…

package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…

Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …

тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …

Вам также может понравиться

D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…

calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…

Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…

Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …

Kotlin 1.3.30

KAPT поддерживает инкрементную компиляцию процессоров аннотаций

KAPT уже поддерживает инкрементную компиляцию процессора аннотаций, эта функция все еще находится на экспериментальной стадии в градациях серого, вы можете передатьДобавьте следующую конфигурацию, чтобы включить его:

Следует отметить, что введение любого процессора аннотаций неинкрементной компиляции или изменений зависимостей (до настоящего момента, включая модификацию внутренних объявлений) в существующей версии приведет к тому, что процесс обработки аннотаций этого модуля перейдет в неинкрементный режим.

Последующие действия будут продолжать следить за улучшением этой функции.

Улучшенная функция отладки

Когда вы отлаживаете код сопрограммы, вы можете видеть, что существует отдельный асинхронный стек «Асинхронная трассировка стека», который показывает переменные во время приостановки. Взгляните на пример:

Когда программа останавливается в точке останова в функции приостановки или Lambda (строка 13 примера), «Асинхронная трассировка стека» показывает состояние переменной, когда она была в последний раз приостановлена ​​(строка 12). Вы можете просмотреть весь стек функции приостановки в текущей сопрограмме из последней точки приостановки (строки 12 и 4) и подтвердить значение переменной:

Это поможет вам легче понять текущий статус выполнения сопрограммы.

При отладке кода Kotlin вы можете выбрать режим «Kotlin» для просмотра переменных. Щелкните значок Kotlin, и вы увидите имя Kotlin переменной вместо основного имени Jvm:

Укажите версию байт-кода JVM от 9 до 12

Если ваша программа работает под управлением JVM 9, 10, 11 или 12 версий, вы можете установитьК соответствующей версии. Этот параметр повлияет на версию байт-кода создаваемых файлов классов. Они не имеют обратной совместимости. Помните об этом. Напротив, новая целевая версия не будет иметь никаких оптимизаций байт-кода или новых функций, но эта ситуация не продлится долго.

Исправление несуществующего типа

Некоторые обработчики аннотаций (например,) Зависит от точного типа в подписи объявления. По умолчанию Kapt заменяет каждый неизвестный тип (включая тип сгенерированного класса) на, Но вы можете изменить это поведение. Добавить дополнительные флаги в Файл для включения типа ошибки, указанной в заглушке:

Создание плагина, используя директорию buildSrc

Теперь создадим плагин по-другому. Сначала создайте директорию buildSrc в корне проекта. Именно там будет вся логика по сборке. А так, как она поддерживает Kotlin DSL, вы можете писать плагин на Kotlin.

Внутри новой директории создайте файл build.gradle.kts. Внутри этого файла добавьте код:

Итак, что же здесь происходит? Для начала buildSrc – это та директория, на которую Gradle обращает внимание при компиляции. Если он находит специальный сборочный код, то добавляет его в путь класса

В этом файле вы применяете плагин kotlin-dsl, но при попытке синхронизировать проект с его добавлением ничего не будет работать. Нужно также добавить mavenCentral() в repositories, потому что именно тут находится плагин. После добавления этих строчек синхронизируйте проект, и вы заметите еще несколько директорий в папке buildSrc. Структура вашего проекта будет выглядеть как-то так:

Это значит, что ваш файл build.gradle.kts был успешно добавлен в путь класса Gradle. Далее правой кнопкой мышки нажмите на папку buildSrc и выберете New ▸ Directory и далее src/main/java.

Здесь можно начать писать плагины на Kotlin, и все модули будут иметь доступ к ним. Откройте папку java и создайте класс на Kotlin BuildManager, который имплементирует Plugin.

Вы можете создавать задачи внутри метода apply по примеру того, как вы это делали в модуле build.gradle ранее. Для этого вы создадите задачу, которая не только распечатывает предложение.

Внутри apply добавьте этот код:

Добавьте import для класса File вверху файла:

Вы создаете задачу под названием renameApk и в этом классе находите расположение вашего APK, и затем переименовываете его. Но что, если APK еще не был создан? Или что, если вы удалили файл по какой-то причине? В этом случае последняя строка .dependsOn(«build») приходит на помощь. Эта функция создаст зависимость в задаче build, которая предоставит APK.

Но при попытке выполнить задачу из терминала, приложение упадет и выдаст ошибку BUILD FAILED. Это все из-за того, что вы не применили плагин к проекту. Чтобы это исправить, перейдите в файл build.gradle.kts и добавьте следующее:

В коде выше вы регистрируете ваш плагин путем использования одного из расширений функций – gradlePlugin. Используя функцию create, можно сообщить имя, ID, версию и ссылку на плагин класса, который вы создали.

Самое время добавить зарегистрированный плагин в ваш модуль. Перейдите в файл build.gradle и добавьте его в конец списка задач plugins:

Вот и все! Синхронизируйте проект, запустите ./gradlew clean для очистки директории build и выполните задачу через ./gradlew -q renameApk. Перейдите в папку /app/build/outputs/apk/release и найдите переименованный APK.

«Проблема с записью» Библиотека Kotlin-android, привязка неразрешенных справочных данных

http-equiv=»Content-Type» content=»text/html;charset=UTF-8″>style=»clear:both;»>

Я написал библиотеку на Kotlin, в которой использовалась привязка данных. Когда я ссылался на этот модуль в приложении, возникла проблема, заключающаяся в том, что привязка данных не могла сгенерировать код, «привязка неразрешенных справочных данных».

Решение:http://stackoverflow.com/questions/33165324/kotlin-android-unresolved-reference-databinding

Согласно этому методу вручную настройте компилятор привязки данных и используйте kapt для решения этой проблемы.

Интеллектуальная рекомендация

1. Для реальных сигналов (для понимания): A (ω) является соотношением амплитуды выходного сигнала и амплитуды входного сигнала, называемого частотой амплитуды. Φ (ω) — это разница межд…

Один. вести Многие люди задавали некоторые вопросы о создании проекта Flex + LCDS (FDS) в сообщениях и группах. Из-за операции ее трудно четко объяснить, поэтому я написал простой учебник (я обещал эт…

package com.example.phonehttp; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.widget.ScrollView; import android.widget.TextView; public class MainActi…

Он предназначен для реализации подкласса того же родительского класса с родительским классом. Полиморфизм Один и тот же ссылочный тип использует разные экземпляры для выполнения разных операций; Идея …

тема: Объедините два упорядоченных слоя в новый заказанный список и возврат. Новый список состоит из всех узлов двух связанных списков, данных сплавным. Пример: Анализ: два связанных списка состоит в …

Вам также может понравиться

D. Самая ценная строка Пример ввода 2 2 aa aaa 2 b c Образец вывода aaa c На самом деле, будучи задетым этим вопросом, вы должны быть осторожны. После инвертирования строки, если две строки имеют один…

Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surro…

calc () может быть очень незнакомым для всех, и трудно поверить, что calc () является частью CSS. Поскольку он выглядит как функция, почему он появляется в CSS, поскольку это функция? Этот момент такж…

Основываясь на дереве регрессии, сформированном CART, а также на предварительной и последующей обрезке дерева, код выглядит следующим образом:…

Откат Обновление в режиме онлайн с версии Centos (CentOS Linux версии 7.3.1611 (Core) до CentOS Linux версии 7.5.1804 (Core)) # ошибка соединения yum-ssh после обновления yexpected key exchange group …

Branch Strategy

We have three branches for shared development: , and . Tagged releases are only made from .

  • Target branch for new features.
  • Cotains the latest publishable state of the SDK.
  • are being created for every commit.
  • All tagged releases are made from this branch.
  • Target branch for bug fixes.
  • Every commit should be merged back to master .
  • Minor changes (e.g. to documentation, tests, and the build system) may not affect end users but should still be merged to to avoid diverging too far from and to reduce the likelihood of merge conflicts.

Target branch for breaking changes that would result in a major version bump.

Note: We currently only have the branch, as no tagged releases have been made yet.

3. Использование Kotlin

Чтобы упростить пример, я покажу вам, как создать с помощью одного , который отображает .

Убедитесь, что ваш класс является подклассом и переопределяет его метод . Конечно, вы должны сделать это в Kotlin. Если вы новичок в Kotlin, я предлагаю вам использовать функциональность генерации кода Android Studio, нажав Control + O, чтобы получить сигнатуры метода справа.

Теперь ваш класс должен выглядеть следующим образом:

Создайте экземпляр как локальную переменную assign-once, используя ключевое слово .

Вызовите ее метод , чтобы установить , который хотите отобразить, и затем вызовите для отображения текстового вида.

Как и для Java-, вам нужно объявить свою Kotlin- в AndroidManifest.xml вашего приложения, чтобы она была распознана системой Android. Если это единственный  в вашем проекте, ваш файл манифеста должен выглядеть так:

Теперь вы можете скомпилировать и запустить приложение на своем Android-устройстве или эмуляторе. Хотя компилятор Kotlin немного медленнее, чем у Java, вы вряд ли увидите существенные изменения во времени сборки вашего проекта.

Command-line compiler

All-open compiler plugin JAR is available in the binary distribution of the Kotlin compiler. You can attach the plugin by providing the path to its JAR file using the kotlinc option:

-Xplugin=$KOTLIN_HOME/lib/allopen-compiler-plugin.jar

You can specify all-open annotations directly, using the plugin option, or enable the «preset». The only preset available now for all-open is .

# The plugin option format is: «-P plugin:<plugin id>:<key>=<value>».
# Options can be repeated.

-P plugin:org.jetbrains.kotlin.allopen:annotation=com.my.Annotation
-P plugin:org.jetbrains.kotlin.allopen:preset=spring

Добавляем больше задач

Можно создать больше задач в функции apply, как это делали с renameApk, но лучше разделить задачи по разным классам для чистоты кода и переиспользования.

Создайте папку внутри папки java и назовите ее tasks. Внутри нее создайте новый Kotlin класс ManageApk.

В этот класс добавьте:

Расширяя класс с помощью DefaultTask, вы имеете возможность определять ваши собственные задачи. Для этого вам нужно объявить функцию с @TaskAction и затем записать собственную логику внутри. Функция moveFile переместит созданный APK, куда вы захотите (убедитесь, что вы поменяли положение внутри Constans.kt). Ваш класс task готов.

Для его использования в вашем плагине откройте ваш плагин-класс BuildManager и внутри apply() замените существующий код на:

Добавьте также следующие зависимости:

Вы только что зарегистрировали задачу, которую создали в вашем классе ManageApk в вашем плагин-классе. Задача будет выполнена при вызове renameApk. Последнее зависит от задачи build.

Теперь синхронизируйте и запустите ./gradlew clean для очистки проекта. В терминале запустите ./gradlew -q renameApk, и ваш APK будет переименован согласно имени, данному приложению в Constant.kt. Его суффикс должен быть сегодняшней датой и предоставленной вами версией кода. Он также переместит APK, куда вы захотите.

И финальные штрихи. Создайте ManageDependency.kt внутри директории tasks и добавьте код:

Эти задачи создадут текстовый файл и добавят все зависимости вашего модуля в файл каждый раз, как вы собираете проект. Но для этого необходимо добавить все эти задачи в плагин-класс. Откройте BuildManager и добавьте следующие строки внутрь функции apply:

Импортируйте это:

И вот так будет выглядет класс BuildManager:

Теперь можно протестировать созданный плагин. Для начала удалите папку newOutput. Запустите ./gradlew clean для удаления директории со сборкой и затем вызовите ./gradlew -q createBuild в терминале для теста.

На этом все по созданию плагина Gradle в buildSrc!! Наконец вы изучите как создать плагин в standalone проекте в следующем разделе.

Kotlin 1.3.20

Минимальная поддерживаемая версия Gradle — 4.1, а соответствующий плагин Android Graldle — 3.0.

Создавайте более быстрый Gradle с помощью параллельных задач

Плагин Kotlin Gradle теперь может выполнять задачи параллельно в проекте. API Gradle Worker поддерживает параллельное выполнение. Добавьте следующую конфигурацию вилиФайл для активации функции:

Эта функция очень полезна для проектов, в которых есть индивидуальные пути к исходным файлам.Оригинальные независимые исходные пути поддерживают параллельную компиляцию. Для многоплатформенных проектов вы также можете строить параллельно для разных целевых платформ. Задачи компиляции Android, отладки и релиза могут выполняться параллельно.

производительность

Помимо уменьшения объема памяти и повышения производительности во время выполнения, эта версия также содержит оптимизацию компилятора для обхода диапазона, что ускоряет итерацию.

Пропустить компиляцию Kapt

В GradleЗадача добавлена ​​вПоддержка для повышения скорости сборки. Когда кеш kapt не изменился и в зависимостях изменилось только тело метода, он пропустит его компиляцию. Установить следующим образом

вВключить в

Но обратите внимание, что этот параметр также отключит обнаружение AP в пути к классам компиляции, но если вы добавите AP вКонфигурация, на вас это никак не повлияет

Эта конфигурация будет включена по умолчанию в последующих версиях.

Output:

This is the very basic example of Kotlin DSL, we can write to express almost anything using this. This is a much more clean and expressive way of doing programming. Since it uses Kotlin lambda expressions extensively to achieve this, we should be conscious of the extra classes it generates at the byte code level. So how to fix this , simply try to inline the lambda expressions where ever possible in order to reduce the extra class which would get generated for the small code blocks.

That’s it folks for today. Please be generous enough to comment for feedback or suggestions or any queries. Thanks for reading .

New dependency syntax

Moving from to isn’t that hard, right? Yes, you are right. If you have just a few dependencies. But if you have round a bout 90 dependencies it is really annoying to convert them all.

First we thought we could make use of Kotlins . After some research we found out that needs always three parameters. So doing like the following would be possible, but doesn’t really solve the problem:

dependencies {  this implementation "x.y:z:1.0"}

Anyway. Thanks to our powerful IDE we can do some cool “Find and Replace”-Scripting which will do the converting for us.

Let the IDE do the work for you

Just press ⌘+R (for macOS users), check the Regex checkbox, put the following into the fields and press :

// Searchimplementation '(.*)'// Replaceimplementation("$1")

You have to do this for all of your configurations of course. If you want to know more about how that works: here is the explanation.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: