- Meta, yıllara yayılan bir proje kapsamında Android kod tabanını Java'dan Kotlin'e dönüştürüyor
- Şu anda dünyanın en büyük Android kod tabanlarından birini yönetiyor ve bunun yarısından fazlasını başarıyla Kotlin'e çevirmiş durumda
- Meta, 2020'den beri Kotlin-first geliştirme stratejisini benimsiyor
- Tüm kodu dönüştürme nedenleri:
- Kotlin'in "üretkenlik artışı" ve "null güvenliği" avantajlarından azami ölçüde yararlanmak için mevcut on milyon satırlık Java kodunu da dönüştürmeye karar verdi
- Null güvenliğini güçlendirmek ve karma kod tabanı sorunlarını çözmek
- Karma derleme (Java ve Kotlin'in aynı anda derlenmesi) derleme hızını en çok yavaşlatıyor
- Geriye kalan Java kodu null güvenliği sorunlarına yol açıyor: null-safe olmayan Java kodu, bağımlılık grafiğinde
NullPointerException (NPE) için potansiyel bir kaynak oluyor
- Kotlin, çalışma zamanı doğrulamasıyla null güvenliğini garanti ediyor
Otomasyon süreci
- Başlangıçta Intellij IDE'nin J2K dönüştürme aracını tekrar tekrar çalıştırdılar
- Meta'nın büyük ölçekli kod tabanında bu, 100.000'den fazla tıklama gerektiriyor ve her çalıştırma birkaç dakika sürüyordu
- Sonuç olarak bu yöntem, ölçeklenebilirlik eksikliği nedeniyle verimsizdi
- Otomasyon aracı: Kotlinator geliştirildi
- 6 aşamalı dönüşüm süreci
- Deep Build: Dönüştürülecek kodu derleyerek IDE'nin tüm sembolleri çözebilmesini sağlama. Üçüncü taraf bağımlılıklar ve üretilmiş kodlar dahil
- Preprocessing: Meta'nın özel aracı Editus tabanlı. Null güvenliği ve bağımlılık işleme, J2K workaround'ları gibi yaklaşık 50 adım içeriyor
- Headless J2K: J2K'nin sunucu ortamında çalışabilmesi için değiştirilmesi
- Postprocessing: Android'e özgü değişiklikler, null güvenliği, Kotlin stili uygulamaları gibi yaklaşık 150 adım
- Linters: Otomatik düzeltmelerle dönüşüm kalitesini sürekli iyileştirme
- Build Error-based Fixes: Derleme hatalarını analiz ederek ek düzeltmeler uygulama
J2K'yi headless hale getirmek
- J2K'yi uzaktan çalıştırılabilir hale getirmek için değiştirildi:
- J2K, Intellij IDE ile sıkı biçimde bağlı olduğundan bağımsız çalıştırmak zordu
- Başta Intellij test ortamı kullanılarak çalıştırılması düşünüldü ancak JetBrains'in J2K uzmanı Ilya Kirillov ile görüşüldükten sonra headless inspection yöntemine geçildi
- Bir Intellij eklentisi oluşturularak
ApplicationStarter sınıfı genişletildi ve J2K'nin JavaToKotlinConverter sınıfı çağrılarak uygulandı
- Headless yaklaşımın avantajları
- Yerel IDE sorunlarının çözülmesi: geliştiricilerin IDE'de düğmelere bizzat tıklaması gerekmiyor
- Birden fazla dosyanın aynı anda dönüştürülmesi: büyük ölçekte dosya işleme mümkün hale geliyor
- Harcanan sürenin azalması: dönüşüm süresi yaklaşık 30 dakikaya çıksa da geliştiricilerin harcadığı zaman büyük ölçüde azalıyor
- Derleme ve hata düzeltme desteği: zaman alıcı ama faydalı iş adımları (derleme sonrası düzeltmeler) uzaktan otomatik çalıştırılabiliyor
- Otomasyon ve kod inceleme
- Meta'nın iç sistemleri kullanılarak günlük toplu işler oluşturuluyor:
- Özel ölçütlere göre toplu diff'ler üretiliyor (Meta'nın pull request sürümü)
- Otomatik olarak reviewer atanıyor, test ve doğrulama yapıldıktan sonra son onaylı diff dağıtıma alınıyor
- Web arayüzü sağlandı: geliştiriciler belirli dosya veya modüllerin dönüşümünü uzaktan tetikleyebiliyor
- Dönüşüm sırasının belirlenmesi
- Belirli bir sıra zorunlu kılınmıyor:
- Aktif geliştirme yapılan dosyalar önce işleniyor
- Kotlinator, bağımlılık grafiğini otomatik işleyerek dış dosyalardaki uyumluluk sorunlarını çözüyor
- Örneğin
foo.getName() ifadesini otomatik olarak foo.name olarak güncelliyor
Diğerleri
- Özel preprocessing (Java->Java) ve postprocessing (Kotlin->Kotlin) adımları eklendi
- Meta'nın iç aracı Editus ve JetBrains PSI kütüphanesi kullanılarak dönüşüm kalitesi artırıldı
- Nullsafe ve NullAway
Kotlin dönüşümünün bugünü ve geleceği
- Meta'nın Android Java kodunun yarısından fazlası Kotlin'e dönüştürüldü (veya bazı kodlar silindi)
- Ancak, kolay olan yarı bitti:
- Kalan iş daha karmaşık ve daha büyük ölçekli
- Tam otomatik dönüştürülebilir dönüşümler için özel adımlar eklemek veya J2K'yi iyileştirmeye katkı sağlamak gerekiyor
- Yarı otomatik dönüşüm için ise Kotlinator'ı geliştirerek daha pürüzsüz ve güvenli dağıtım hedefleniyor
- Diğer şirketlerin de benzer Android kod dönüşümü sorunları yaşadığı düşünülüyor
- Meta, dönüşüm araçlarını iyileştirip optimize ederken elde ettiği çözümleri paylaştı
- İş birliği çağrısı:
- Kotlinlang Slack'teki #j2k kanalında diğer geliştiricilerle tartışma
- Birbirlerinin örneklerini ve çözümlerini paylaşarak daha iyi bir dönüşüm deneyimi oluşturmanın mümkün olacağı belirtiliyor
Henüz yorum yok.