Android SDK
Установка
Для подключения SDK проект должен использовать AndroidX, иметь minSdk 21 и compileSdk 36.1 или выше. Добавьте разрешение android.permission.INTERNET в AndroidManifest.xml.
Убедитесь, что Maven Central подключён в settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
}
}
Добавьте зависимость Android SDK в файл модуля приложения.
dependencies {
implementation("io.trisigma:sdk:0.1.0")
}
Если проект объявляет репозитории зависимостей в корневом build.gradle, убедитесь, что Maven Central подключён в allprojects.repositories:
allprojects {
repositories {
google()
mavenCentral()
}
}
И добавьте зависимость Android SDK в файл модуля приложения.
dependencies {
implementation "io.trisigma:sdk:0.1.0"
}
Quickstart
Инициализируйте SDK один раз, затем используйте созданный client в нужных сценариях.
Инициализация SDK
Передайте ключ проекта, тег, участника эксперимента и параметры подключения к Splitter.
import io.trisigma.sdk.external.Trisigma
import io.trisigma.sdk.external.models.TrisigmaOptions
import io.trisigma.sdk.external.models.TrisigmaParticipant
val client = Trisigma.initialize(
context = context,
key = clientKey,
tag = "app-name",
participant = TrisigmaParticipant(userId = 42L),
options = TrisigmaOptions(
host = "https://client.example.trisigma.io",
platformVersion = "1.0.0",
),
)
initialize - suspend-функция, поэтому вызывайте её из корутины. Метод загружает конфигурацию экспериментов и запускает её фоновое обновление. HTTP-ошибка или тайм-аут первой загрузки не блокируют запуск приложения: checkFeature возвращает defaultGroup, пока конфигурация недоступна.
Получение группы эксперимента
Получите назначенную группу и выберите соответствующий вариант интерфейса.
val group = client.checkFeature(
label = "new_checkout_flow", // Лейбл эксперимента
defaultGroup = "control",
)
when (group) {
"test" -> showNewCheckout()
else -> showCurrentCheckout()
}
SDK возвращает defaultGroup, если не находит эксперимент или доступную конфигурацию.
Регистрация экспозиции
Зарегистрируйте экспозицию после того, как пользователь увидел экспериментальную функциональность.
client.logExposure(
label = "new_checkout_flow", // Лейбл эксперимента
)
SDK сохраняет событие в локальную очередь и отправляет события пакетами. SDK отправляет очередь автоматически при достижении exposureQueueMaxSize или по истечении exposureFlushInterval. Перед завершением работы с клиентом вызовите shutdown(): метод пытается отправить оставшиеся экспозиции в пределах shutdownTimeout.
Регистрируйте exposure, когда пользователь дошёл до показа варианта и назначенный вариант начинает влиять на его опыт. Вызывайте logExposure симметрично для control и test, до действий и событий, зависящих от варианта.
Не ставьте exposure в зависимость от клика, конверсии и т.д.: это искажает результаты эксперимента.
Типовые сценарии
| Сценарий | Действие разработчика | Причина |
|---|---|---|
| Группа получена заранее, но пользователь не дошёл до экспериментальной функциональности | Не вызывать logExposure | SDK не может определить, увидел ли пользователь вариант, и добавляет событие в очередь при наличии назначения |
| Exposure вызывается только после клика, конверсии или другого действия пользователя | Не использовать такое действие как условие | SDK не распознаёт статистическую ошибку и добавляет событие в очередь при наличии назначения |
| Exposure вызывается только после успешного отображения фичи | Не ставить вызов в зависимость от успеха отображения | Асимметричный триггер отправки приводит к SRM |
Отправка накопленных экспозиций
Вызовите flush() при уходе приложе ния в фон или перед завершением пользовательской сессии.
client.flush()
Метод передаёт накопленные события в WorkManager и ожидает завершения созданных задач.
flush() отправляет только экспозиции, которые ранее попали в очередь через logExposure. Метод не регистрирует показ автоматически.
Ручное назначение группы
Используйте setOverride, чтобы локально протестировать конкретную группу без изменения эксперимента. Локальное назначение действует только на устройстве и не меняет назначения других участников. SDK сохраняет его между запусками приложения.
client.setOverride(
label = "new_checkout_flow",
group = "test",
)
try {
val group = client.checkFeature(
label = "new_checkout_flow",
defaultGroup = "control",
)
renderCheckout(group)
} finally {
client.removeOverride("new_checkout_flow")
}
Удаляйте локальное назначение после проверки, чтобы оно не повлияло на следующие проверки.
Работа с SDK
Каждый публичный метод описан на отдельной странице:
| Метод | Назначение |
|---|---|
Trisigma.initialize | Инициализировать SDK и создать клиент. |
TrisigmaClient.checkFeature | Получить группу эксперимента. |
TrisigmaClient.getVisitorId | Получить фактический visitorId. |
TrisigmaClient.logExposure | Зарегистрировать показ эксперимента. |
TrisigmaClient.clearCache | Очистить дисковый кеш. |
TrisigmaClient.setOverride | Задать локальную группу. |
TrisigmaClient.removeOverride | Удалить одно локальное назначение. |
TrisigmaClient.removeAllOverrides | Удалить все локальные назначения. |
TrisigmaClient.getAllOverrides | Получить все локальные назначения. |
TrisigmaClient.flush | Передать накопленные события в WorkManager. |
TrisigmaClient.shutdown | Завершить работу клиента. |
Кеш конфигурации экспери ментов
SDK поддерживает сохранение загруженного конфига экспериментов между запусками приложения в памяти устройства. Кеш включён по умолчанию. Не отключайте его в production.
Во время initialize SDK загружает непросроченный кеш, а затем запрашивает актуальный конфиг у Splitter. После успешного ответа SDK сохраняет новый конфиг и обновляет его с интервалом featuresRefreshInterval.
Если загрузка конфига завершилась ошибкой, SDK использует последнюю успешно загруженную версию.
Если кеш отключён через cacheEnabled или в кеше нет актуального конфига, checkFeature возвращает defaultGroup.
После успешной инициализации checkFeature ищет группу в следующем порядке:
- Локальное назначение.
- Конфиг в памяти.
- Непросроченный конфиг на диске.
defaultGroup.
cacheTTL определяет, как долго сохранённый конфиг считается актуальным. По умолчанию кеш хранится 24 часа.
clearCache() удаляет весь дисковый кеш текущего сервера (host) для всех тегов, участников и наборов атрибутов. Конфигурация в памяти и локальные назначения остаются без изменений.
Lifecycle
Вызовите flush() при уходе приложения в фон, чтобы отправить накопленные экспозиции.
Перед остановкой приложения вызовите shutdown(). Метод прекращает фоновые задачи, сохраняет очередь событий экспозиции и пытается отправить её в пределах shutdownTimeout.