Belgelere geç

Android SDK

Kixo Android SDK, Kotlin 2.0+ ve Java’yı destekler; en az minSdk 24 (Android 7.0) gerektirir ve compileSdk 35 karşısında derlenmiştir. Ana uygulamanız kendi targetSdk yapılandırmasından yine kendisi sorumludur. Application.onCreate içinde yapacağınız tek bir Kixo.configure çağrısı; ekranları, dokunuşları, oturumları, çökmeleri ve yaşam döngüsü olaylarını otomatik olarak izler. Push takibi için aşağıda açıklanan FCM köprüsü gerekir. Ağ isteği otomatik takibi, mevcut Android sürümünün bir parçası değildir. SDK ayrıca oturum yeniden oynatma, kimlik ve hedefleri de destekler.

Hızlı başlangıç

Üç dosya yeterli. Maven deposunu ekleyin, bağımlılığı ekleyin, ardından Application alt sınıfınıza iki satır bırakın.

Derleme gereksinimleri: compileSdk 35, minSdk 24, Kotlin 2.0+ veya Java ve Java 17 bytecode.

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo")
        }
    }
}

Not

Analytics entegrasyonu bu kadar. Standart otomatik izleyiciler varsayılan olarak açıktır; push takibi içinse yine aşağıdaki FCM köprüsü gerekir. Tek tek bayrakları yalnızca gerektiğinde KixoConfiguration.Builder(...) ile geçersiz kılın.

Uygulamanıza ekleyin

Kixo Maven deposu GitHub Pages üzerinde barındırılır. settings.gradle.kts içinde bunu google() ve mavenCentral() ile birlikte ekleyin:

kotlin
// settings.gradle.kts
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo")
        }
    }
}

Ardından bağımlılığı uygulama modülünüzde tanımlayın:

kotlin
// app/build.gradle.kts
dependencies {
    implementation("io.kixo:kixo-android-sdk:0.1.20")
}

İpucu

android.permission.INTERNET ve android.permission.ACCESS_NETWORK_STATE, SDK manifestine dahildir. Bildirim izinleri uygulamanızın sorumluluğunda kalır ve push özelliklerini etkinleştirdiğinizde siz beyan edersiniz.

Çok modüllü projeler

Gradle’ın implementation yapılandırması transitif değil niteliktedir: bir kütüphane modülünde (ör. :core_domain) implementation("io.kixo:kixo-android-sdk:0.1.20") tanımlamanız, Kixo öğesini :app veya başka bir tüketici için görünür kılmaz. İşe yarayan iki yaklaşım var — birini seçin.

Desen A — Kixo çağıran her modül bunu kendisi bildirir (önerilir)., her modülün classpath’ini olabildiğince küçük tutar ve zincirleme yeniden derlemeleri önler. Sürümü tek yerden yönetmek için sürüm kataloğu (libs.kixo.sdk) kullanın.

kotlin
// :core_domain/build.gradle.kts
dependencies {
    implementation("io.kixo:kixo-android-sdk:0.1.20")   // local use only
}

// :app/build.gradle.kts
dependencies {
    implementation(project(":core_domain"))
    implementation("io.kixo:kixo-android-sdk:0.1.20")   // declared again — fine
}

Desen B — api(...) üzerinden yeniden dışa aktarın. Tek bir bildirim yeterlidir; ancak kütüphane modülünün herkese açık ABI’si artık Kixo türlerini de içerir. Bu da her sürüm artışında aşağı akıştaki tüm modüllerin yeniden derlenmesine yol açar. Bunu yalnızca kütüphane, kendi herkese açık imzalarında Kixo türlerini yeniden kullanıyorsa tercih edin (örneğin bir fonksiyon KixoDiagnostics döndürüyorsa).

kotlin
// :core_domain/build.gradle.kts
dependencies {
    api("io.kixo:kixo-android-sdk:0.1.20")              // re-exposed
}

// :app/build.gradle.kts
dependencies {
    implementation(project(":core_domain"))            // gets Kixo for free
}

Uyarı

Bir modülde derleme sırasında Unresolved reference: Kixo görüyorsanız o modülün SDK’ye kendi bağımlılığı eksiktir — yukarıdaki implementation satırını ekleyin ya da B desenini kullanın.

Başlatma

Kixo’yu Application alt sınıfınızda yapılandırın — onCreate, herhangi bir activity’den önce çalışır; böylece her ekran görüntülemesi, dokunuş ve yaşam döngüsü olayı ilk kareden itibaren yakalanır. Application öğesini manifest’inize android:name=".MyApp" ile kaydedin.

kotlin
import android.app.Application
import io.kixo.sdk.Kixo

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Kixo.configure(
            context   = this,
            projectId = "kx_proj_YOUR_PROJECT_ID",
            apiKey    = "kx_key_YOUR_API_KEY",
        )
    }
}

Daha ayrıntılı ayarlar için (otomatik izleme bayrakları, gönderim sıklığı, yeniden oynatma örneklemesi, özel API ana makinesi) KixoConfiguration nesnesini açıkça oluşturun:

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.KixoConfiguration

val config = KixoConfiguration.Builder(
    projectId = "kx_proj_YOUR_PROJECT_ID",
    apiKey    = "kx_key_YOUR_API_KEY",
)
    .autoTrackScreens(true)
    .autoTrackTaps(true)
    .autoTrackNetwork(false)  // reserved; no-op in the current Android release
    .autoTrackCrashes(true)
    .autoTrackSessions(true)
    .autoTrackPush(true)
    .flushIntervalMillis(30_000)
    .flushAt(20)
    .maxBufferSize(200)
    .build(applicationContext)

Kixo.configure(this, config)

Not

İdempotent. Aynı süreçte ikinci kez yapılan configure çağrısı, WARN olarak günlüğe geçen etkisiz bir işlemdir; SDK ilk yapılandırmayı korur. Kimlik doğrulama singleton’ınızın önce configure gelmeden önce kuyruğa aldığı olaylar arabelleğe alınır (üst sınır 50) ve SDK bağlandıktan sonra yeniden gönderilir. Bu sayede Application.onCreate tamamlanmadan önce global bir yerden Kixo.identify(...) çağırabilirsiniz.

Olayları izleyin

Enstrümantasyonunuzun büyük kısmını üç temel yapı taşır: olaylar için track, dönüşüm sinyalleri için markGoal ve olay dışı bağlam için addBreadcrumb.

kotlin
import io.kixo.sdk.Kixo

Kixo.track("video_played", mapOf(
    "video_id"    to "vid_42",
    "duration_ms" to 18_500,
    "autoplay"    to false,
))

// markGoal(name, value?, currency?, properties?) — pass extra context
// through the named 'properties' argument (a Map can't be the 2nd
// positional arg; that slot is the Double 'value').
Kixo.markGoal("activated", properties = mapOf(
    "step" to "onboarding_completed",
))

// Revenue goals use the typed value + currency parameters:
Kixo.markGoal("purchase_completed", value = 49.99, currency = "USD")

Kixo.addBreadcrumb(
    message  = "user toggled dark mode",
    category = "ui",
    level    = "info",
)

İpucu

Hedefler derecelendirilir. İşaretlenen hedefler, Kixo’nun aktivasyon hunilerini ve günlük değişiklik algılama cron işini besler — hacmi haftadan haftaya %70 düşen bir hedef, panonuzda İnceleme gerekiyor rozetiyle görünür. Gerçekten önemli birkaç an için markGoal, geri kalan her şey için track kullanın.

Standart olaylar

Kixo’nun ada göre tanıdığı olaylar için Kixo.track üzerinde bir kolaylık katmanı — arka uçtaki standart olay algılayıcısının bire bir eşleştirdiği düz string anahtarlar. Özellik yapısını derleme zamanında doğrular ve adlandırma için tek bir kaynak sağlar.

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.SubscriptionInterval

Kixo.trackPurchase(
    amount    = 49.99,
    currency  = "USD",
    productId = "pro_yearly",
)

Kixo.trackSubscriptionStart(
    plan     = "pro",
    amount   = 9.99,
    currency = "USD",
    interval = SubscriptionInterval.MONTH,
)

Kixo.trackSignup(method = "google")
Kixo.trackTrialStart(plan = "pro", days = 14)
Kixo.trackCancel(plan = "pro", reason = "too_expensive")
Kixo.trackUpgrade(fromPlan = "free", toPlan = "pro")
Kixo.trackActivation(event = "first_post_published")
Kixo.trackShare(channel = "twitter", contentId = "post_123")
Kixo.trackInvite(channel = "email", recipientCount = 5)

Kullanıcıları tanımlayın

Sonraki olayları kalıcı bir kullanıcı kimliğine ve trait kümesine bağlayın. Anonimden bilinene eşleme Kixo içinde yapılır; identify öncesinde yakalanan olaylar geriye dönük olarak aynı kullanıcıya atanır.

kotlin
import io.kixo.sdk.Kixo

// Reserved standard property keys carry a $-prefix (Mixpanel
// convention) so they namespace away from your own custom traits
// and promote to the dashboard's profile columns. See
// io.kixo.sdk.StandardProperty for the typed catalogue, or the
// "Standard property catalog" section below for the full 37-key list.
Kixo.identify("user_123", mapOf(
    "$email" to "jane@example.com",     // identity
    "$name"  to "Jane Doe",              // identity
    "$plan"  to "pro",                   // subscription pack
    "$lifetime_orders" to 12,            // e-commerce pack
    "signup_source" to "twitter_ad",     // custom trait
))

// Logout: clear identity, super-properties, and the persisted queue.
Kixo.reset()

⚠️ Kotlin’de dolar işareti tuzağı. Standart kimlik anahtarları $ önekini kullanır ($email, $name, $first_name) — Kotlin sabit dizelerinde dolar işaretini "\$email" yazarak gerekir kaçırmanız gerekir. "$email" yazarsanız email değişkeniniz dize içine yerleştirilir; değer de fark edilmeden bir özel trait’i olarak kaydolur ve Audience içindeki e-posta / ad sütunlarını doldurmaz. En pratik çözüm, tür güvenli overload’ı kullanmaktır (SDK 0.1.13+): Kixo.setUserProperty(StandardProperty.EMAIL, email).

Segmentasyon için kullanıcı etiketleyin

Kullanıcıya basit bir evet/hayır etiketi eklemek için setUserProperty metodunu boolean değerle kullanın. Bu etiket uygulama yeniden açıldığında da korunur ve segmentler, e-posta kampanyaları ve sohbet sorgularında kullanılır — SDK çağrısının dışında ek kurulum gerekmez.

kotlin
// Tag a user as subscribed — segments + campaigns can target this
Kixo.setUserProperty("subscribe", true)

// VIP membership
Kixo.setUserProperty("vip", true)

// String + numeric values work too
Kixo.setUserProperty("plan_tier", "enterprise")
Kixo.setUserProperty("lifetime_orders", 42)

// Bulk-set
Kixo.setUserProperties(mapOf(
    "subscribe" to true,
    "plan_tier" to "enterprise",
))

Özellikler SharedPreferences üzerinden uygulama yeniden başlatmaları arasında korunur ve her giden olaya otomatik eklenir. Sohbette "subscribe değeri true olan kullanıcılara hoş geldin e-postası gönder" gibi şeyler yazın — Kixo sizin için segmenti oluşturur ve şablon taslağını hazırlar. Kixo.reset() ile temizlenir.

Standart özellik kataloğu

Ayrılmış özellik anahtarları, özel trait'lerinizle çakışmaması için $ öneki taşır. Kixo kataloğunda 3 evrensel paket (kimlik, coğrafya, yaşam döngüsü) ve 5 B2B dikey paketinde (abonelik, e-ticaret, medya, pazaryeri, sadakat) toplam 37 anahtar bulunur. Ürününüz için geçerli olanları ayarlayın; pano buna uyum sağlar ve yalnızca doldurduğunuz paketleri gösterir.

Kimlik

Her zaman anlamlıdır. Profil başlığındaki sütunları belirler.

AnahtarTürAçıklama
$emaildizeBirincil e-posta; kimlik birleştirmede çoğu zaman eşleştirme anahtarı olarak kullanılır.
$phonedizeE.164 telefon numarası.
$namedizeTam görünen ad.
$first_namedizeAd.
$last_namedizeSoyadı.
$avatar_urldizeKullanıcının avatar görselinin tam URL’si.

Coğrafi

Coğrafi bağlam.

AnahtarTürAçıklama
$countrydizeISO 3166 ülke kodu.
$citydizeŞehir adı.
$regiondizeEyalet veya il.
$timezonedizeAmerica/Los_Angeles gibi bir IANA zaman dilimi.
$languagedizeen veya ru-RU gibi bir IETF etiketi.
$localedizeTam yerel ayar tanımlayıcısı.

Yaşam döngüsü

Onu ne zaman gördük?

AnahtarTürAçıklama
$createdISO8601Kayıt veya hesap oluşturma zamanı.
$last_seenISO8601Son etkileşim zamanı.

Abonelik

Ürününüzde planlar varsa ayarlayın.

AnahtarTürAçıklama
$plandizeKademe slug'ı — free, pro, enterprise.
$subscription_statusdizeactive / trial / cancelled / past_due.
$trial_endsISO8601Geçerli denemenin biteceği zaman.
$mrrsayıHesap para birimindeki aylık yinelenen gelir.
$subscription_startedISO8601Geçerli aboneliğin başladığı zaman.

E-ticaret

Ürün satıyorsanız ayarlayın.

AnahtarTürAçıklama
$lifetime_orderssayıTamamlanan sipariş sayısı.
$lifetime_revenuesayıToplam harcama.
$aovsayıOrtalama sipariş değeri.
$last_purchaseISO8601En son başarılı satın alma.
$first_purchaseISO8601İlk başarılı satın alma.
$cart_abandoned_countsayıToplam sepet terk etme sayısı.

Medya

İçerik yayımlıyorsanız ayarlayın.

AnahtarTürAçıklama
$content_tierdizefree / premium / paid.
$subscribed_categoriesCSV metni veya diziKullanıcının takip ettiği kategoriler.
$watch_time_totalsayıToplam izleme süresi (saniye).
$last_playedISO8601En son oynatma başlangıcı.

Pazaryeri

İki taraflı bir platformsanız ayarlayın.

AnahtarTürAçıklama
$seller_tierdizeSatıcı tarafındaki kademe slug'ı.
$buyer_tierdizeAlıcı tarafı kademe slug’ı.
$listings_countsayıKullanıcının sahip olduğu aktif ilanlar.
$reviews_countsayıKullanıcının aldığı değerlendirmeler.
$verifiedbooleanKYC durumu.

Sadakat

Etkileşim ve ödül programları için ayarlayın.

AnahtarTürAçıklama
$loyalty_pointssayıKullanılabilir puan bakiyesi.
$vip_leveldizeVIP kademe slug'ı.
$referral_countsayıBu kullanıcıya atfedilen başarılı yönlendirmeler.

İpucu

Aradığınız kalıp burada yoksa özel trait’ler için düz anahtarlar kullanın. Bunlar, profil sütunlarını doldurmadan dashboard’daki Custom Traits panelinde görünür. Yukarıdaki 5 dikey paket, en yaygın B2B yapıları için önerilmiş varsayımlardır; müşteriye özgü terimler (ör. shipping_plan) düz kalır.

Super-properties

Her giden olaya otomatik eklenen, oturum düzeyindeki anahtar/değer çiftleri. identify trait’lerinden farklıdırlar; trait’ler kimliği tanımlar, super-property’ler ise oturum bağlamını tanımlar — etkin A/B varyantı, build flavor, izin verilmiş özellik bayrakları gibi. Uygulama yeniden açıldığında da korunur; reset() ile temizlenir. Aynı anahtar çakıştığında, track üzerindeki olay bazlı properties her zaman önceliklidir.

kotlin
import io.kixo.sdk.Kixo

Kixo.setSuperProperty("build_flavor", "beta")
Kixo.setSuperProperties(mapOf(
    "ab_variant"        to "B",
    "referrer_campaign" to "autumn-launch",
))

// Sugar for A/B tracking — stored as 'experiment_<id>'.
Kixo.setExperimentVariant("checkout_v2", "variant_a")

Kixo.unsetSuperProperty("build_flavor")
Kixo.clearSuperProperties()

Push bildirimleri

İki entegrasyon yolu var. FCM kullanıyor ve en kısa çalışan kurulumu istiyorsanız A’yı seçin; yeniden yapılandıramayacağınız özel bir FirebaseMessagingService yapınız varsa ya da Kixo’nun hangi FCM teslimatlarını göreceğini açıkça denetlemek istiyorsanız B’yi seçin.

Seçenek A — KixoFirebaseMessagingService sınıfını genişletin (otomatik izleme)

KixoFirebaseMessagingService sınıfından türeyin ve override ettiğiniz metodun içinden super.onMessageReceived(...) çağrın — Kixo, push_received (görünür payload) veya push_silent (yalnızca veri) olayını otomatik olarak gönderir. Override etmezseniz taban sınıf onNewToken kaydını da yönetir. AndroidManifest.xml kaydı ise normal bir FCM servisindekiyle aynıdır.

kotlin
import com.google.firebase.messaging.RemoteMessage
import io.kixo.sdk.KixoFirebaseMessagingService

class MyMessagingService : KixoFirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)  // Kixo auto-tracks push_received
        // … your own routing / notification display
    }
}

Not

Kixo bu isteğe bağlı sınıfı Firebase Messaging’e karşı derler, ancak Firebase’i uygulamanıza transitif olarak eklemez. SDK, Firebase’i compileOnly olarak bildirir; bu seçeneği kullanan bir uygulamanın, her FCM receiver’ında olduğu gibi, zaten firebase-messaging bağımlılığına sahip olması gerekir.

Seçenek B — kendi FCM servisinizden API’yi elle çağırın

FCM token’ınızı FirebaseMessagingService.onNewToken üzerinden Kixo’ya kaydedin, ardından her teslimatı açıkça loglayın. Kixo’nun yalnızca FCM teslimatlarının bir bölümünü görmesini istiyorsanız bu yolu kullanın. Android teslimat takibi şu anda yalnızca FCM’yi destekler.

kotlin
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import io.kixo.sdk.Kixo
import io.kixo.sdk.PushProvider

class MyMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        Kixo.setPushToken(token, PushProvider.FCM)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        // Convert the FCM payload to a Map<String, Any?> and log it —
        // Kixo correlates this with the open / dismiss it sees later.
        Kixo.logPushReceived(message.data.toMap(), appState = "background")
    }
}

Android, bildirim açılmaları, kapatılmaları veya işlem düğmeleri için evrensel bir yaşam döngüsü kancası sağlamaz. Bu sinyalleri, uygulamanızın oluşturduğu bildirim intent’lerinden veya receiver’lardan iletin:

kotlin
import io.kixo.sdk.Kixo

Kixo.logPushOpened(payload = pushPayload)            // open
Kixo.logPushOpened(payload = pushPayload, actionId = "reply")  // action-button tap
Kixo.logPushDismissed(payload = pushPayload)         // swipe-away

Oturum yeniden oynatma

Kullanıcının gördüğünü gerçek, görsel bir yeniden kurulumla oynatın. SDK, her yakalamada ekranın sıkıştırılmış bir karesini (bir JPEG görseli) görünüm hiyerarşisinin yapısal anlık görüntüsüyle birlikte kodlayıp yükler; böylece panodaki oynatıcı, etkileşim zaman çizelgesinin yanında piksel düzeyinde doğru bir oynatma sunabilir. Proje için yeniden oynatmayı Kontrol Paneli → Ayarlar → Oturum tekrarı içinde yapılandırın. SDK, maskeleme, yakalama modları ve hücresel ağ üzerinden yükleme izni dâhil bu proje politikasını otomatik olarak okuyup yeniler.

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.KixoConfiguration

val config = KixoConfiguration.Builder(
    projectId = "kx_proj_YOUR_PROJECT_ID",
    apiKey    = "kx_key_YOUR_API_KEY",
)
    .build(applicationContext)

Kixo.configure(this, config)

Hücresel ağ üzerinden yükleme kapalıysa kuyruğa alınan yeniden oynatmalar izin verilen bir ağı bekler.

İpucu

Yüklemeden önce maskeleyin. Kixo pikselleri yakaladığı için maskeleme, herhangi bir veri cihazdan çıkmadan önce uygulanır. Parola ve e-posta alanları otomatik olarak algılanıp gizlenir; yapısal anlık görüntülerdeki metinler PII filtresinden geçer; setKixoMask(true) ile işaretlediğiniz her görünüm ise JPEG önce kodlanmadan önce karede opak bir dikdörtgene dönüştürülür — pikselleri cihazdan hiç çıkmaz. Jetpack Compose ekranları varsayılan olarak bütünüyle maskelenir (denetlediğiniz bir ekranı dahil etmek için en dıştaki ComposeView üzerinde setKixoMask(false) çağrın). Operatörler panoda yeniden oynatıcıyı olay zaman çizelgesiyle birlikte inceler.

Veri toplama

SDK, projenizde etkin olan verileri ve uygulamanızın gönderdiği olaylarla özellikleri yakalar.

Hata ayıklama

Kixo.diagnostics(), SDK’nin durumuna dair salt okunur bir anlık görüntü döndürür. Gizli bir hata ayıklama ekranında veya smoke test’te özellikle işe yarar. “Olaylarım neden akmıyor?” sorusunu debugger açmadan yanıtlar.

kotlin
import io.kixo.sdk.Kixo

val diag = Kixo.diagnostics()
Log.d("Kixo", "queued=${diag.queue.bufferedEventCount}")
Log.d("Kixo", "paused=${diag.paused}")                  // collection paused state
Log.d("Kixo", "lifecycleState=${diag.lifecycleState}")  // SDK lifecycle state

Test altyapınızdan zorla gönderim başlatın — ağ gidiş dönüşü için en fazla timeoutMs boyunca bloklar:

kotlin
import io.kixo.sdk.Kixo

// Async fire-and-forget — returns immediately.
Kixo.flush()

// Blocking variant for instrumentation tests. Never call on the main thread.
val landed: Boolean = Kixo.flushBlocking(timeoutMs = 5_000L)
assertTrue(landed)

Compose Navigation

Activity / Fragment rotaları, ek kurulum gerektirmeden anında screen_view olayları ve kalma süresiyle akış metaverisini içeren yapılandırılmış screen_visit kayıtları üretir. Jetpack Compose Navigation kullanıyorsanız, rotaya göre anahtarlanmış bir LaunchedEffect içinden Kixo.screen çağırın; böylece SDK, yeniden bileşim sayısı ne olursa olsun her hedef için tek bir olay görür.

kotlin
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import io.kixo.sdk.Kixo

@Composable
fun AppNavHost(nav: NavHostController) {
    NavHost(navController = nav, startDestination = "home") {
        composable("home") {
            LaunchedEffect("home") { Kixo.screen("HomeScreen") }
            HomeScreen()
        }
        composable("settings") {
            LaunchedEffect("settings") { Kixo.screen("SettingsScreen") }
            SettingsScreen()
        }
    }
}

AI kodlama ajanları

SDK’nin herkese açık yüzeyi küçüktür ve kod tamamlama için tasarlanmıştır — tüm metodlar Kixo singleton’ındadır, bu kılavuzdaki tüm Kotlin örnekleri import io.kixo.sdk.Kixo ile başlar ve README içinde Claude Code, Cursor ve Codex gibi araçların bağlamına doğrudan yapıştırabileceği bir "AI agent quick reference" bloğu bulunur. Ajanınız takılırsa temel başlangıç örneği şudur:

kotlin
// Tell your AI coding agent:
// "Integrate the Kixo Android SDK using io.kixo:kixo-android-sdk
//  from https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo.
//  Call Kixo.configure(this, projectId, apiKey) in Application.onCreate.
//  Then use Kixo.track / Kixo.identify / Kixo.markGoal as needed."

Not

Yukarıdaki her bölüm bu iş akışı düşünülerek yazıldı: import’lar her zaman açıkça verilir, tür adları her zaman tam yazılır ve SDK singleton’ına asla takma ad verilmez. Bu sayfayı ajanınıza verin, gerisini o yönetsin.