MessageQueue davranış değişikliğiyle ilgili kılavuz

Android 17'den itibaren, Android 17 veya sonraki sürümleri hedefleyen uygulamalar android.os.MessageQueue'nin yeni bir kilit içermeyen uygulamasını alır. Yeni uygulama performansı artırır ve kaçırılan kare sayısını azaltır ancak MessageQueue özel alanlarını ve yöntemlerini yansıtan istemcilerin işleyişini bozabilir.

Android 17, temel MessageQueue sınıfını yeniden yazarak Looper ve Handler işleyişinde önemli bir değişiklik yapıyor. Android işletim sisteminin ilk sürümünden beri MessageQueue, ana iş parçacığının görev sırasını yönetmek için tek bir kilide güveniyordu. Bu tasarım genellikle kilit çekişmesine neden oluyordu. Ana iş parçacığı, arka plan iş parçacığı tarafından engellenebiliyor, bu da karelerin düşmesine ve kullanıcı arayüzünün takılmasına yol açıyordu.

Etkiyi azaltma

Uygulamanız veya bağımlılıkları, MessageQueue içine bakmak için çalışma zamanı yansıtmasına dayanıyorsa bu değişiklikten etkilenebilir. MessageQueue öğesini incelemek için çalışma zamanı yansıtması kullanmaktan kaçının.

Eski uygulamada geliştiriciler, bekleyen mesajları incelemek için bazen MessageQueue.mMessages gibi özel alanlara erişiyordu. Yeni kilit içermeyen uygulama ile birlikte, dahili veri yapıları tamamen değişti. Android 17, ikili uyumluluğu korumak için mMessages alanını tutar ancak yeni uygulamada bu alan, kuyrukta mesaj olup olmadığına bakılmaksızın her zaman null olur.

Ayrıca, bazı popüler test kitaplıklarını kullanıyorsanız kitaplıklarınızı yeni MessageQueue uygulamasıyla uyumlu olacak şekilde güncellemeniz gerekir.

Espresso

Espresso, kullanıcı arayüzü testi için yaygın olarak kullanılır. Espresso kitaplığının, kullanıcı arayüzü durumunu doğru şekilde onaylamak için ana iş parçacığının ne zaman boşta olduğunu bilmesi gerekir. Espresso'nun önceki sürümleri, artık kilit içermeyen MessageQueue ile uyumlu olmayan yansıtma tekniklerini kullanıyordu.

İşlem

Espresso 3.7.0 veya daha yeni bir sürüme güncelleyin. Bu sürüm, TestLooperManager API'sini (özellikle Android 16'nın kullanıma sunduğu yeni API'leri) kullanarak dahili uygulama ayrıntılarına güvenmeden Looper ile güvenli bir şekilde etkileşim kurar.

Robolectric

Benzer şekilde, Robolectric kullanarak birim testleri çalıştırıyorsanız testleriniz eski Looper modunu temel alıyorsa sorunlarla karşılaşabilirsiniz.

İşlem

Robolectric 4.17 veya daha yeni bir sürüme güncelleyin. @LooperMode(LEGACY) kullanıyorsanız testlerinizi yeni @LooperMode(LEGACY)'e taşımanız gerekir.@LooperMode(PAUSED) Daha fazla bilgi için Robolectric'in taşıma kılavuzuna bakın.

Davranışı test etme

Aşağıdaki komutu çalıştırarak uygulamanızı Android 17'deki davranış değişikliğiyle birlikte güncellemeyi beklemeden test edebilirsiniz: targetSDK

adb am compat enable USE_NEW_MESSAGEQUEUE <your-package-name>

Bu komut, uygulamanız hata ayıklanabilir bir derleme ise kilitsiz MessageQueue özelliğini etkinleştirir.

Uygulamanız Android 17'yi hedefliyorsa yeni davranış varsayılan olarak etkinleştirilir. Bu API düzeyini hedefledikten sonra beklenmedik davranışlar veya kilitlenmeler fark ederseniz MessageQueue'nın soruna neden olup olmadığını doğrulamak için yeni uygulamayı geçici olarak devre dışı bırakabilirsiniz.

Değişikliği iki seçenekten birini kullanarak etkinleştirebilir veya devre dışı bırakabilirsiniz:

  1. Geliştirici Seçenekleri'ndeki Uygulama Uyumluluğu Değişiklikleri menüsü.

  2. Aşağıdaki ADB komutunu çalıştırarak:

    adb am compat disable USE_NEW_MESSAGEQUEUE <your-package-name>
    

Bu işlem, uygulamanızı eski, kilit tabanlı uygulamaya geri döndürür. Böylece, sorunun mesaj sırası davranış değişikliğinden kaynaklanıp kaynaklanmadığını belirleyebilirsiniz.