Bir Android Uygulamasını AGP 9 ile Kotlin Multiplatform'a Taşımak: Yedi Tuzak
Nesim Razon, bağımsız Android geliştiricisi · 2026-11-14
Küçük bir Compose oyununu iPhone'da da çalışsın diye Kotlin Multiplatform'a taşıdım. Kotlin kısmı kolaydı, derleme düzeni değildi. Android Gradle Plugin 9 ve Compose Multiplatform ile karşılaştığım yedi tuzak, karşılaştığım sırayla, ve başka hiçbir şeyin değişmediğini söyleyen kontroller.
1. Uygulama eklentisi ve çok platformlu eklenti artık aynı modülde durmuyor
Android Gradle Plugin 9 ile Kotlin Multiplatform eklentisi, Android uygulama eklentisini de kullanan bir modüle uygulanamıyor. Ortak kodun, çok platformlu yeni Android kütüphane eklentisini kullanan kendi kütüphane modülüne ihtiyacı var. Uygulama modülü normal bir Android uygulaması olarak kalıyor ve ona bağlanıyor. Kotlin geçiş kılavuzu ayrıca yeni bir Gradle, 9.1 ya da üstü istiyor.
2. Sessizce çalışmayı bırakan birim testleri
Oyun kurallarını ve on birim testini ortak modüle taşıdım, derlemeyi çalıştırdım ve yeşil sonuç aldım. Sonra günlüğe baktım: ortak modülün Android test görevi çalıştıracak bir şey olmadığını söylüyordu. Yeni eklentide Android host testi, siz açana kadar kapalı.
Modülün Android bölümünde bir host testi tanımlamak sorunu çözdü ve sonuç dosyasında on test çalışmış, hiçbiri düşmemişti. Ders: geçişten sonra yalnızca yeşile bakma, testleri say.
3. Compose Resources için Android kaynakları açık olmalı
Metinler ve yazı tipleri ortak modüle Compose Resources olarak taşındı. Ekran görüntüsü testlerim, derlenmiş bir metin dosyasını işaret eden eksik kaynak hatasıyla düştü. Testlere bir önizleme yapılandırması çağrısı eklemek işe yaramadı. Çözen şey, ortak modülün Android bölümünde Android kaynaklarını açmak ve host testi için de Android kaynaklarını dahil etmekti.
4. Taşımadan sağ çıkan bir ters eğik çizgi
Android metin dosyaları kesme işaretini ters eğik çizgiyle kaçırır. Compose Resources bunu çözmüyor; bu yüzden Türkçe istatistik penceresi 2048'e yerine 2048\'e gösterdi. Çözüm, kopyalanan metinlerde düz kesme işareti kullanmak.
Bunu yalnızca aşağıdaki sonraki kontrol sayesinde buldum. Hiçbir şey çökmedi, hiçbir test düşmedi, metin sadece biraz yanlıştı.
5. Kotlin/Native'in kabul etmediği test adları
Bir testin ters tırnaklı adında virgül vardı, Android'de zararsız bir şey. iOS test hedefi derlenirken adın geçersiz karakter içerdiği mesajıyla durdu. Adı virgülsüz yazmak çözdü.
6. Ortadan kalkan bir simülatör hedefi
Hem Apple silicon hem Intel Mac'ler için iOS simülatör hedeflerini listelemiştim. Derleme bağımlılık çözümleme hatası verdi: Compose Multiplatform kütüphaneleri Intel simülatör hedefi için yayınlanmamıştı. O hedefi çıkardım; derleme arm64 simülatörünü ve gerçek cihazları kapsıyor.
7. Dosya başına tek DataStore
Eski Android kodu süreç başına tek DataStore üreten bir temsilci kullanıyordu. Ortak kodda depoyu kendim oluşturup içeri veriyorum; aynı dosya üzerinde açık iki depo uygulamayı çökertir. Bu yüzden Android'de küçük bir tutucu nesnenin arkasında tek örnek tutuyorum ve eski temsilcinin kullandığı dosyayı gösteriyorum; böylece mevcut kayıtlı oyunlar okunabilir kalıyor.
Başka hiçbir şeyin değişmediğini nasıl kontrol ettim
Mağaza görsellerini üreten ekran görüntüsü testleri regresyon takımım oldu. Geçişten sonra on altı mağaza görselinin hepsini yeniden ürettim ve git'in değişmiş diye bildirdiğine baktım. On beşi commit edilmiş dosyalarla birebir aynıydı; farklı olan, yukarıdaki kesme işareti hatasıydı.
Kayıtlı veri için eski koddan derlemeyi kurdum, birkaç hamle oynadım, sonra yeni derlemeyi kaldırmadan üstüne kurdum. Uygulamayı tamamen yeniden başlatınca tahta, skor ve rekor aynıydı. Veri dosyası yolu ve anahtarlar değişmediği için bu kontrol ucuz ve her sürümden önce yapmaya değer.
Sık sorulan sorular
AGP 9 ile Android uygulama eklentisi ve Kotlin Multiplatform tek modülde kullanılabilir mi?
Hayır. Ortak kodu, çok platformlu Android kütüphane eklentisini kullanan bir kütüphane modülüne koy; uygulama modülü ayrı kalsın.
Geçişten sonra ortak birim testlerim neden çalışmadı?
Yeni eklentide Android host testi varsayılan olarak açık değil. Modülün Android bölümünde aç ve test sayısının beklediğin kadar olduğunu kontrol et.
Compose Resources kesme işaretinden önceki ters eğik çizgiyi çözer mi?
Hayır. Ortak metin dosyalarında Android tarzı kaçış yerine düz kesme işareti kullan.
Compose Multiplatform ile Intel iOS simülatörü hâlâ çalışıyor mu?
Benim derlememde kütüphaneler o hedef için çözülmedi; ben onu çıkardım, arm64 simülatörünü ve gerçek cihazları tuttum.
Diğer yazılar
- App Store Bağlantım Neden 404 Verdi ve Sayfa 2018 Ekran Görüntülerini Gösterdi
- App Store İnceleme Kuralı 2.1 "Bilgi Gerekli": Ne Gönderdim
- Telefonsuz App Store Ekran Görüntüleri: Robolectric, Sahte Görsel Yükleyici ve Başsız Tarayıcı
- İki Mağaza İçin Tek QR Kodu: Küçük Bir Yönlendirme Sayfası
- Davranışı Değiştirmeden Kotlin Multiplatform'a Geçiş: Eski Kodu Test Kâhini Olarak Tutmak
- "Diğer Oyunlarım" İçin Sunucusuz Uzak Liste: GitHub Pages'te Tek JSON Dosyası