Настройка подключаемого модуля Astromkey Android Gradle для процессов инструментирования
Следующие параметры конфигурации позволяют настроить процесс инструментирования плагина Dynatrace для Android Gradle.
Конфигурации для конкретных вариантов
Плагин позволяет указать несколько конфигураций для конкретных вариантов, где каждая конфигурация для конкретного варианта может быть применена к нескольким вариантам сборки Android . Для каждого варианта необходимо указать конфигурацию для конкретного варианта. Если подключаемый модуль не может найти конкретную конфигурацию для определенного варианта сборки Android, он отменяет сборку и выдает ошибку. Эту функцию защиты можно отключить с помощью strictMode
свойства.
Связь определяется регулярным выражением, указанным в свойстве variantFilter
, и именем варианта сборки Android. Регулярное выражение чувствительно к регистру, и если вкус продукта не определен, тип сборки в имени варианта указывается в нижнем регистре. Если несколько конфигураций для конкретного варианта соответствуют одному и тому же варианту, выбирается и применяется первая конфигурация.
В следующем примере показано, как можно указать в dynatrace
блоке конфигурацию для конкретного варианта:
Groovy:
dynatrace {
configurations {
dev {
// build type name is upper case because a product flavor is used
variantFilter "Debug"
// other variant-specific properties
}
demo {
// the first product flavor name is always lower case
variantFilter "demo"
// other variant-specific properties
}
prod {
// build type name is upper case because a product flavor is used
variantFilter "Release"
// other variant-specific properties
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("dev") {
// build type name is upper case because a product flavor is used
variantFilter("Debug")
// other variant-specific properties
}
create("demo") {
// the first product flavor name is always lower case
variantFilter("demo")
// other variant-specific properties
}
create("prod") {
// build type name is upper case because a product flavor is used
variantFilter("Release")
// other variant-specific properties
}
}
}
Например, у вас может быть приложение с двумя вариантами продукта, demo
и paid
, и двумя типами сборки по умолчанию, debug
и release
. Плагин можно использовать для указания конфигурации для всех вариантов отладочной сборки, demoDebug
а paidDebug
также двух других конфигураций для двух вариантов, demoRelease
и paidRelease
.
Связь между специфическими для варианта конфигурациями из плагина и вариантами сборки Android может быть напечатана вместе с задачей printVariantAffiliation
. Например, в следующем примере показан вывод консоли из приведенного выше примера:
> Task :app:printVariantAffiliation
Variant 'demoDebug' will use configuration 'dev'
Variant 'demoRelease' will use configuration 'demo'
Variant 'paidDebug' will use configuration 'dev'
Variant 'paidRelease' will use configuration 'prod'
Отдельные данные мониторинга разработки и производства
Если вы не хотите загрязнять данные производственного мониторинга данными мониторинга из ваших debug
сборок, отделите данные разработки от данных производственного мониторинга.
Для этого создайте два мобильных приложения в Dynatrace. Создайте две конфигурации для конкретных вариантов и используйте предоставленные значения applicationId
и beaconUrl
со Instrumentation
страницы.
Groovy:
dynatrace {
configurations {
debug {
variantFilter "[dD]ebug"
autoStart {
applicationId '<DebugApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
prod {
variantFilter "[rR]elease"
autoStart {
applicationId '<ProductionApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("debug") {
variantFilter("[dD]ebug")
autoStart {
applicationId("<DebugApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
create("prod") {
variantFilter("[rR]elease")
autoStart {
applicationId("<ProductionApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
}
}
Если вы предпочитаете не отслеживать свои debug
сборки, отключите конфигурацию для конкретного варианта, которая отвечает за ваши debug
сборки.
Groovy:
dynatrace {
configurations {
debug {
variantFilter "[dD]ebug"
enabled false
}
prod {
variantFilter "[rR]elease"
autoStart {
applicationId '<ProductionApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("debug") {
variantFilter("[dD]ebug")
enabled(false)
}
create("prod") {
variantFilter("[rR]elease")
autoStart {
applicationId("<ProductionApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
}
}
Деактивировать автоинструментарий
Вы можете отключить автоинструментирование для всех вариантов или для определенного варианта.
Деактивировать все варианты
Чтобы отключить автоинструментирование для всех вариантов, отключите плагин с помощью свойства pluginEnabled
. Плагин по-прежнему добавляет OneAgent SDK в качестве зависимости Gradle, чтобы гарантировать, что компилятор может скомпилировать исходные файлы, настроенные вручную.
С этой настройкой шаг проверки плагина деактивирован. Кроме того, функция автозапуска деактивируется, и приложение перестает отслеживаться. Если вы запускаете агент вручную, приложение отслеживается, но OneAgent может собирать только данные о взаимодействии с мобильными пользователями, которые обрабатываются ручными вызовами OneAgent SDK.
Вы можете отключить автоинструментирование для всех вариантов или для определенного варианта.
Groovy:
dynatrace {
pluginEnabled false
configurations {
dev {
// variant-specific properties
}
prod {
// variant-specific properties
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
pluginEnabled(false)
configurations {
create("dev") {
// variant-specific properties
}
create("prod") {
// variant-specific properties
}
}
}
Деактивировать один вариант
Если вы хотите деактивировать автоматическое инструментирование для определенного варианта, явным образом деактивируйте конфигурацию для конкретного варианта с помощью свойства enabled
. В следующем примере показано, как можно деактивировать все debug
типы сборки (вариант demoDebug
и paidDebug
):
Groovy:
dynatrace {
configurations {
dev {
enabled false
variantFilter "Debug"
}
prod {
// variant-specific properties
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("dev") {
enabled(false)
variantFilter("Debug")
}
create("prod") {
// variant-specific properties
}
}
}
Пропуск автоинструментирования, если нет доступной конфигурации для конкретного варианта:
Вы можете деактивировать это strictMode
свойство и определить специфичную для варианта конфигурацию только для того варианта, который вы хотите инструментировать. Плагин не обрабатывает варианты сборки Android, если никакая конкретная конфигурация не соответствует данному варианту сборки Android.
Если вы не отключите strictMode
свойство, плагин отменит сборку и выдаст ошибку. Мы не рекомендуем этот подход, поскольку функция строгого режима должна защитить вас от создания вариантов без конфигурации для конкретного варианта. Деактивируйте автоинструментирование с помощью enabled
свойства конфигурации вашего варианта.
Groovy:
dynatrace {
strictMode false
configurations {
prod {
variantFilter "Release"
// other variant-specific properties
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
strictMode(false)
configurations {
create("prod") {
variantFilter("Release")
// other variant-specific properties
}
}
}
Автозапуск инжектирования
Чтобы получить правильные параметры запуска, перейдите к мастеру инструментов в веб-интерфейсе Dynatrace.
- В меню Dynatrace выберите Mobile .
- Выберите мобильное приложение, которое вы хотите настроить.
- Выберите «Дополнительно » ( … ) > «Изменить» в правом верхнем углу плитки с названием вашего приложения.
- В настройках приложения перейдите к мастеру инструментов .
- Выберите Android и перейдите на вкладку Groovy (build.gradle) или Kotlin (build.gradle.kts) .
- Используйте предварительно настроенный фрагмент (см. шаг « Применить плагин Dynatrace и добавьте конфигурацию плагина »), который уже заполнен значениями конфигурации из вашего мобильного приложения.
Все свойства, связанные с запуском OneAgent, являются частью AutoStart DSL и должны быть настроены с помощью autoStart
блока :
Groovy:
dynatrace {
configurations {
sampleConfig {
autoStart {
applicationId '<YourApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("sampleConfig") {
autoStart {
applicationId("<YourApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
}
}
Функция автозапуска внедрения запускает OneAgent в Application.onCreate
методе. Если ваше приложение поддерживает прямую загрузку, вам необходимо отключить функцию автоматического запуска внедрения. Вы также должны прочитать Настройка связи с OneAgent SDK для Android , чтобы убедиться, что OneAgent может передавать данные в кластер.
Деактивация автозапуска инжектирования
Вы можете деактивировать функцию автоматического запуска инъекции с помощью enabled
свойства. Вы не можете указать свойства applicationId
и beaconUrl
, поскольку эти значения должны использоваться при вызове запуска вручную.
Groovy:
dynatrace {
configurations {
sampleConfig {
autoStart.enabled false
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("sampleConfig") {
autoStart.enabled(false)
}
}
}
Рекомендуется добавить в Application.onCreate
метод вызов запуска. Дополнительные сведения см. в разделе OneAgent SDK для Android > Запуск OneAgent .
Дополнительные изменения конфигурации, указанные с помощью DynatraceConfigurationBuilder
переопределения значений конфигурации, определенных с помощью DSL плагина Dynatrace для Android Gradle.
Исключение определенных классов и методов
По умолчанию подключаемый модуль Dynatrace для Android Gradle обрабатывает все пакеты. Если вы хотите исключить определенные классы, у вас есть два варианта:
- Исключить список пакетов, классов и методов
- Использовать настраиваемый фильтр исключения
Исключить список пакетов, классов и методов с помощью свойств packages
, classes
иmethods
Groovy:
dynatrace {
configurations {
sampleConfig {
exclude {
packages "com.mypackage", "com.another.example"
classes "com.example.MyClass"
methods "com.example.ExampleClass.exampleMethod", "com.example.ExampleClass\$InnerClass.anotherMethod"
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("sampleConfig") {
exclude {
packages("com.mypackage", "com.another.example")
classes("com.example.MyClass")
methods("com.example.ExampleClass.exampleMethod", "com.example.ExampleClass\$InnerClass.anotherMethod")
}
}
}
}
Эти свойства содержат некоторые дополнительные функции:
packages
автоматически исключает подпакетыclasses
автоматически исключает внутренние классыmethods
автоматически исключает все методы с одинаковым именем (независимо от подписи метода)
Экранируйте $
символ для внутренних классов, как показано в приведенном выше примере.
Использование настраиваемый фильтр исключения
Этот параметр позволяет определить более точную логику исключения с помощью дополнительных правил фильтрации. В фильтре вы можете определить регулярное выражение для className
, methodName
и methodDescription
.
- Для
className
свойства используется полное имя. - Имя класса совпадает, когда указанное выражение находится где-то в имени класса.
- Имя метода совпадает, когда указанное выражение находится где-то в имени метода.
- Описание метода совпадает , когда указанное выражение находится где-то в описании метода.
Groovy:
dynatrace {
configurations {
sampleConfig {
exclude {
// exclude all inner classes
filter {
className "\$"
}
// exclude all methods that fulfill this requirements
filter {
// the class is part of the "com.example" package
className "^com\\.example\\."
// the method name contain the phrase "webrequest" (uppercase notation is ignored for two letters)
methodName "[wW]eb[rR]equest"
// where the last parameter is a String and where the return value is void
methodDescription "Ljava/lang/String;\\)V"
}
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("sampleConfig") {
exclude {
// exclude all inner classes
filter {
className("\$")
}
// exclude all methods that fulfill this requirements
filter {
// the class is part of the "com.example" package
className("^com\\.example\\.")
// the method name contain the phrase "webrequest" (uppercase notation is ignored for two letters)
methodName("[wW]eb[rR]equest")
// where the last parameter is a String and where the return value is void
methodDescription("Ljava/lang/String;\\)V")
}
}
}
}
}
Настройка инструментария тестового примера
Плагин выполняет этап автоинструментации только при сборке приложения. Поэтому поведение локальных модульных тестов и инструментальных модульных тестов отличается.
Локальные модульные тесты
- Плагин Android Gradle версии 7.0.0+ Локальные модульные тесты используют инструментированные классы из вашей исходной папки, но неинструментированные библиотеки. Это не должно влиять на модульные тесты, так как подключаемый модуль в основном использует специфичные для Android классы и вызовы методов, которые игнорируются, когда OneAgent не запущен. Это также справедливо для вызовов методов OneAgent SDK.
- Версии подключаемого модуля Android Gradle 4.0.0–4.2.0. Локальные модульные тесты напрямую используют классы, сгенерированные компилятором Java или Kotlin, а этап автоматического инструментирования подключаемого модуля никогда не выполняется. Поскольку вызовы методов OneAgent SDK помещаются в исходный код, они также доступны и выполняются в ваших локальных модульных тестах. Однако OneAgent не запускается, а вызовы методов игнорируются.
Локальные модульные тесты с Robolectric
Robolectric позволяет имитировать Android в локальных модульных тестах.
- Плагин Android Gradle версии 7.0.0+ Robolectric использует инструментированные классы из вашей исходной папки, но неинструментированные библиотеки.
- Плагин Android Gradle версий 4.0.0–4.2.0 Robolectric использует классы, сгенерированные компилятором Java или Kotlin, которые не инструментированы автоматически.
Если вы отключили автозапуск внедрения и запустили OneAgent вручную в Application
классе, OneAgent запускает и контролирует ваши тестовые случаи Robolectric. В этом случае скорректируйте конфигурацию, либо разделив данные мониторинга разработки и производства , либо используя другой тип сборки для модульных тестов .
Инструментальные модульные тесты
Для запуска инструментальных модульных тестов на устройстве или эмуляторе сборка Android создает два APK-файла:
- APK-файл приложения, которое вы хотите протестировать. Плагин является частью этого процесса сборки и автоматически обрабатывает APK-файл.
- Тестовый APK-файл, содержащий класс для тестирования другого APK. Плагин также является частью этого процесса сборки, но он не выполняет автоматическую настройку этих тестовых APK.
Поскольку APK инструментирован, каждый инструментальный модульный тест отслеживается. В этом случае вам следует скорректировать конфигурацию, либо разделив данные мониторинга разработки и производства , либо используя другой тип сборки для модульных тестов .
Использование другого типа сборки для модульных тестов
Для индивидуального поведения инструментовки для ваших модульных тестов создайте новый тип сборки для ваших модульных тестов с помощью подключаемого модуля.
Groovy:
android {
buildTypes {
// build type used for unit tests in the CI
CI {
initWith debug
applicationIdSuffix ".debugTesting"
}
}
}
Kotlin:
android {
buildTypes {
// build type used for unit tests in the CI
create("CI") {
initWith(getByName("debug"))
applicationIdSuffix = ".debugTesting"
}
}
}
Например, если вы хотите отслеживать свои debug
сборки, используемые разработчиками, и не хотите отслеживать выполнение модульного теста в CI, используйте следующую конфигурацию:
Groovy:
dynatrace {
configurations {
developer {
variantFilter "[dD]ebug"
autoStart {
applicationId '<DebugApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
ciTesting {
// deactivate instrumentation for CI tests
variantFilter "CI"
enabled false
}
prod {
variantFilter "[rR]elease"
autoStart {
applicationId '<ProductionApplicationID>'
beaconUrl '<ProvidedBeaconURL>'
}
}
}
}
Kotlin:
configure<com.dynatrace.tools.android.dsl.DynatraceExtension> {
configurations {
create("developer") {
variantFilter("[dD]ebug")
autoStart {
applicationId("<ProductionApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
create("ciTesting") {
// deactivate instrumentation for CI tests
variantFilter("CI")
enabled(false)
}
create("prod") {
variantFilter("[rR]elease")
autoStart {
applicationId("<DebugApplicationID>")
beaconUrl("<ProvidedBeaconURL>")
}
}
}
}
Когда вы выполняете модульные тесты с debug
вариантом, модульные тесты отслеживаются, поскольку инструментирование деактивируется только для CI
варианта.