Android 11, uygulamanızı Android platformunun yeni sürümlerindeki davranış değişikliklerine göre test etmek ve hatalarını ayıklamak için yeni geliştirici araçları kullanıma sundu. Bu araçlar, uygulama geliştiricilerin geliştirici seçeneklerini veya ADB'yi kullanarak zarar veren değişiklikleri tek tek açıp kapatabilmelerini sağlayan bir uyumluluk çerçevesinin parçasıdır. En kararlı API sürümünü hedeflemeye hazırlanırken ve uygulamanızı bir sonraki Android sürümünün önizleme sürümüyle test ederken bu esnekliği kullanın.
Uyumluluk çerçevesi araçlarını kullandığınızda Android platformu, dahili mantığını otomatik olarak uyarlar. Böylece targetSDKVersion
uygulamanızı değiştirmeniz veya temel testleri gerçekleştirmek için uygulamanızı yeniden derlemeniz gerekmez. Değişiklikler tek tek değiştirilebildiğinden, her seferinde bir davranış değişikliğini tespit edebilir, test edebilir ve hata ayıklayabilir ya da daha önce başka bir şeyi test etmeniz gerekiyorsa soruna neden olan tek bir değişikliği devre dışı bırakabilirsiniz.
Hangi değişikliklerin etkinleştirildiğini belirleme
Bir davranış değişikliği etkinleştirildiğinde, uygulamanızın bu değişiklikten etkilenen platform API'lerine erişme biçimi etkilenebilir. Geliştirici seçenekleri, logcat veya ADB komutlarını kullanarak hangi davranış değişikliklerinin etkinleştirildiğini kontrol edebilirsiniz.
Geliştirici seçeneklerini kullanarak etkin değişiklikleri tanımlama
![](https://developer.android.com/static/images/guide/app-compatibility/appcompat-dev-options.png?authuser=5&hl=tr)
Şekil 1. Geliştirici seçeneklerindeki Uygulama Uyumluluğu Değişiklikleri ekranı.
Cihazın geliştirici seçeneklerinden hangi değişikliklerin etkinleştirildiğini görebilir ve bu değişiklikleri açıp kapatabilirsiniz. Bu seçeneklere erişmek için şu adımları izleyin:
- Geliştirici seçenekleri henüz etkinleştirilmemişse bunları etkinleştirin.
- Cihazınızın Ayarlar uygulamasını açıp Sistem > Gelişmiş > Geliştirici seçenekleri > Uygulama Uyumluluğu Değişiklikleri'ne gidin.
Listeden uygulamanızı seçin.
Her davranış değişikliği genellikle aşağıdaki iki kategoriden birine aittir:
Uygulamanın
targetSdkVersion
özelliklerinden bağımsız olarak, Android'in o sürümünde çalışan tüm uygulamaları etkileyen değişiklikler.Bu değişiklikler, uyumluluk çerçevesinde varsayılan olarak etkindir ve kullanıcı arayüzünde, Varsayılan Etkin Değişiklikler bölümünde listelenir.
Yalnızca belirli Android sürümlerini hedefleyen uygulamaları etkileyen değişiklikler. Bu değişiklikler yalnızca Android'in belirli bir sürümünü hedefleyen uygulamaları etkilediğinden
targetSDKVersion
tarafından güvenlikle korunan değişiklikler olarak da adlandırılır.Uygulamanız listelenen API sürümünden daha yüksek bir sürümü hedefliyorsa bu değişiklikler uyumluluk çerçevesinde varsayılan olarak etkindir. Örneğin, Android 13'te (API düzeyi 33)
targetSDKVersion
tarafından kapılı bir davranış değişikliği, kullanıcı arayüzünde targetSdkVersion >=33 için etkin başlıklı bir bölümde listelenir. Android'in daha eski bazı sürümlerinde bu bölümün başlığı "API_LEVEL SDK'sından Sonra Etkinleştirildi" şeklindedir.
Şekil 1'de Varsayılan Devre Dışı Değişiklikler adlı bir bölüm de görürsünüz. Bu bölümde yer alan değişiklikler çeşitli amaçlara hizmet edebilir. Bu değişiklikleri etkinleştirmeden önce, söz konusu Android sürümünün uyumluluk çerçevesi listesindeki değişiklik açıklamasını okuyun.
Logcat'i kullanarak etkin değişiklikleri tanımlama
Her davranış değişikliği için, uygulamanız işlem sırasında ilk kez etkilenen API'yi çağırdığında sistem, aşağıdaki gibi bir logcat mesajı üretir:
D CompatibilityChangeReporter: Compat change id reported: 194833441; UID 10265; state: ENABLED
Her logcat mesajı aşağıdaki bilgileri içerir:
- Kimliği Değiştir
- Uygulamayı etkileyen değişikliği gösterir. Bu değer, Uygulama Uyumluluğu Değişiklikleri ekranında listelenen davranış değişikliklerinden biriyle eşlenir (Şekil 1'e bakın). Bu örnekte
194833441
,NOTIFICATION_PERM_CHANGE_ID
ile eşlenir. - Benzersiz Kimlik
- Hangi uygulamanın değişiklikten etkileneceğini gösterir.
- Eyalet
Değişikliğin uygulamayı etkileyip etkilemediğini belirtir.
Eyalet, şu değerlerden biri olabilir:
Eyalet Anlamı ENABLED
Bu değişiklik etkinleştirilir ve uygulama, değiştirilen API'leri kullanıyorsa uygulamanın davranışını etkiler. DISABLED
Değişiklik devre dışı bırakılır ve uygulamayı etkilemez.
Not: Uygulamanın
targetSDKVersion
metriği gerekli eşiğin altında olduğu için bu değişiklik devre dışı bırakılırsa daha yüksek bir sürümü hedeflemek için uygulamatargetSDKVersion
değerini artırdığında değişiklik varsayılan olarak etkinleştirilir.LOGGED
Değişiklik, uyumluluk çerçevesi üzerinden günlüğe kaydedilmektedir ancak açılıp kapatılamaz. Bu değişiklik açılıp kapatılamasa da uygulamanızın davranışını etkileyebilir. Daha fazla bilgi için söz konusu Android sürümünün uyumluluk çerçevesi listesindeki değişikliğin açıklamasına bakın. Çoğu durumda, bu tür değişiklikler deneyseldir ve yoksayılabilir.
ADB kullanarak etkin değişiklikleri tanımlama
Tüm cihazdaki değişiklikleri (hem etkin hem de devre dışı) görmek için aşağıdaki ADB komutunu çalıştırın:
adb shell dumpsys platform_compat
Çıkışta her değişiklik için aşağıdaki bilgiler listelenir:
- Kimliği Değiştir
- Bu davranış değişikliği için benzersiz bir tanımlayıcı. Örneğin,
194833441
. - Ad
- Bu davranış değişikliğinin adı. Örneğin,
NOTIFICATION_PERM_CHANGE_ID
. - targetSDKVersion ölçütleri
Değişikliğin hangi
targetSDKVersion
tarafından (varsa) denetlendiği.Örneğin, bu değişiklik yalnızca SDK 33 veya sonraki bir sürümü hedefleyen uygulamalar için etkinleştirilirse
enableAfterTargetSdk=32
çıktısı alınır. DeğişikliktargetSDKVersion
tarafından kontrol edilmezseenableAfterTargetSdk=0
çıktısı alınır.- Paket geçersiz kılmaları
Değişikliğin varsayılan durumunun (etkin veya devre dışı) geçersiz kılındığı her bir paketin adı.
Örneğin bu, varsayılan olarak etkinleştirilen bir değişiklikse geliştirici seçeneklerini veya ADB'yi kullanarak değişikliği kapatırsanız uygulamanızın paket adı listelenir. Bu durumda çıkış şu şekilde olur:
packageOverrides={com.my.package=false}
targetSDKVersion
tarafından denetlenen değişiklikler varsayılan olarak etkinleştirilebilir veya devre dışı bırakılabilir. Böylece paket listesi, uygulamanıntargetSDKVersion
şartlarına bağlı olarak hemtrue
hem defalse
örneklerini içerebilir. Örneğin:packageOverrides={com.my.package=true, com.another.package=false}
Belirli değişiklikler hakkında daha fazla bilgi edinin.
Uyumluluk çerçevesindeki davranış değişikliklerinin tam listesi, her Android sürümüyle ilgili dokümanlarda yer almaktadır. Uygulamanızı test ettiğiniz Android sürümüne bağlı olarak daha fazla bilgi için aşağıdaki bağlantılara bakın:
- Android 15 (API düzeyi 35)
- Android 14 (API düzeyi 34)
- Android 13 (API düzeyi 33)
- Android 12 (API düzeyleri 31 ve 32)
- Android 11 (API düzeyi 30)
Değişiklikler ne zaman değiştirilir?
Uyumluluk çerçevesinin ana amacı, uygulamanızı Android'in daha yeni sürümleriyle test ederken size kontrol ve esneklik sağlamaktır. Bu bölümde, uygulamanızı test ederken ve hata ayıklarken değişiklikleri ne zaman açıp kapatacağınızı belirlemek için kullanabileceğiniz bazı stratejiler açıklanmaktadır.
Değişiklikler ne zaman kapatılır?
Değişikliklerin ne zaman devre dışı bırakılacağına karar vermek genellikle değişikliğin targetSDKVersion
tarafından yapılıp yapılmadığına bağlıdır.
- Değişiklikler tüm uygulamalar için etkinleştirildi
Tüm uygulamaları etkileyen değişiklikler, uygulamanızın
targetSDKVersion
sürümünden bağımsız olarak belirli bir platform sürümü için varsayılan olarak etkinleştirilir. Böylece uygulamanızın o platform sürümünde çalıştırılmasından etkilenip etkilenmediğini görebilirsiniz.Örneğin, Android 14'ü (API düzeyi 34) hedeflemeye hazırlanıyorsanız uygulamanızı Android 14 çalıştıran bir cihaza yükleyerek başlayabilir ve normal test iş akışlarınızı kullanarak uygulamanızı test edebilirsiniz. Uygulamanızda sorunlarla karşılaşırsanız soruna neden olan değişikliği devre dışı bırakarak diğer sorunları test etmeye devam edebilirsiniz.
Bu değişiklikler,
targetSDKVersion
ürününden bağımsız olarak tüm uygulamaları etkileyebileceği için genellikletargetSDKVersion
tarafından denetlenen değişikliklerden önce uygulamanızı bu değişikliklere göre test etmeniz ve güncellemeniz gerekir. Bu, kullanıcılarınız cihazlarını yeni bir platform sürümüne güncellediklerinde kötü bir uygulama deneyimi yaşamalarına yardımcı olur.Android'in herkese açık sürüm derlemesini kullanırken bu değişiklikleri kapatamayacağınız için bu değişiklikleri test etmeye de öncelik vermelisiniz. İdeal olarak, sürüm önizlemedeyken her Android sürümü için bu değişiklikler üzerinde test yapmanız gerekir.
targetSDKVersion
tarafından denetlenen değişikliklerUygulamanız belirli bir
targetSDKVersion
sürümünü hedefliyorsa bu sürüm tarafından korunan tüm değişiklikler varsayılan olarak etkinleştirilir. Bu nedenle, uygulamanızıntargetSDKVersion
sürümünü yeni bir sürüme geçirdiğinizde, uygulamanız aynı anda birçok yeni değişiklikten etkilenmeye başlar.Uygulamanız bu değişikliklerden birden fazlasından etkilenebileceğinden, uygulamanızı test ederken ve hata ayıklarken bu değişikliklerden bazılarını tek tek kapatmanız gerekebilir.
Değişiklikler ne zaman etkinleştirilir?
Bir uygulama, geçişli sürümden daha düşük bir SDK sürümünü hedeflediğinde, belirli bir targetSDKVersion
tarafından denetlenen değişiklikler varsayılan olarak devre dışı bırakılır.
Genellikle, yeni bir targetSdkVersion
hedeflemeye hazırlanırken uygulamanızı test etmeniz ve hata ayıklamanız gereken davranış değişikliklerinin bir listesi ortaya çıkar.
Örneğin, uygulamanızı önümüzdeki targetSdkVersion
içinde bir dizi platform değişikliğine göre test ediyor olabilirsiniz. Geliştirici seçeneklerini veya ADB komutlarını kullanarak uygulama manifestinizi değiştirip tüm değişiklikleri tek seferde etkinleştirmek yerine, kapılı her değişikliği tek tek etkinleştirebilir ve test edebilirsiniz. Bu ek kontrol, değişiklikleri tek başına test etmenize ve uygulamanızın birden fazla bölümünde hata ayıklamaktan ve aynı anda güncellemeden kaçınmanıza yardımcı olabilir.
Bir değişikliği etkinleştirdikten sonra, tipik test iş akışlarınızı kullanarak uygulamanızı test edebilir ve hata ayıklama yapabilirsiniz. Sorunlarla karşılaşırsanız sorunun nedenini belirlemeye yardımcı olması için günlüklerinizi kontrol edin. Sorunun, etkinleştirilen bir platform değişikliğinden kaynaklanıp kaynaklanmadığı net değilse bu değişikliği devre dışı bırakıp uygulamanızın bu alanını yeniden test etmeyi deneyin.
Değişiklikleri açma veya kapatma
Uyumluluk çerçevesi, geliştirici seçeneklerini veya ADB komutlarını kullanarak her bir değişikliği açıp kapatabilmenizi sağlar. Değişiklikleri açmak veya kapatmak, uygulamanızın kilitlenmesine veya önemli güvenlik değişikliklerinin devre dışı bırakılmasına neden olabileceğinden, değişiklikleri açıp kapatabileceğiniz zamanlarla ilgili bazı kısıtlamalar vardır.
Geliştirici seçeneklerini kullanarak değişiklikleri açma/kapatma
Değişiklikleri açmak veya kapatmak için geliştirici seçeneklerini kullanın. Geliştirici seçeneklerini bulmak için şu adımları izleyin:
- Geliştirici seçenekleri henüz etkinleştirilmemişse bunları etkinleştirin.
- Cihazınızın Ayarlar uygulamasını açıp Sistem > Gelişmiş > Geliştirici seçenekleri > Uygulama Uyumluluğu Değişiklikleri'ne gidin.
- Listeden uygulamanızı seçin.
Değişiklikler listesinde, açmak veya kapatmak istediğiniz değişikliği bulun ve anahtara dokunun.
ADB kullanarak değişiklikleri aç/kapat
ADB'yi kullanarak bir değişikliği açmak veya kapatmak için aşağıdaki komutlardan birini çalıştırın:
adb shell am compat enable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
adb shell am compat disable (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
CHANGE_ID
(örneğin, 194833441
) veya CHANGE_NAME
(örneğin, NOTIFICATION_PERM_CHANGE_ID
) ve uygulamanızın PACKAGE_NAME
öğesini iletin.
Bir değişikliği varsayılan durumuna sıfırlamak için aşağıdaki komutu da kullanabilir ve ADB veya geliştirici seçeneklerini kullanarak ayarladığınız geçersiz kılmaları kaldırabilirsiniz:
adb shell am compat reset (CHANGE_ID|CHANGE_NAME) PACKAGE_NAME
Değişikliklerle ilgili kısıtlamalar
Varsayılan olarak her bir davranış değişikliği etkinleştirilir veya devre dışı bırakılır. Tüm uygulamaları etkileyen değişiklikler
varsayılan olarak etkindir. Diğer değişiklikler bir targetSdkVersion
ile korunur. Bir uygulama ilgili SDK sürümünü veya üstünü hedeflediğinde bu değişiklikler varsayılan olarak etkin, kapılı sürümden daha düşük bir SDK sürümünü hedefleyen uygulamalar varsayılan olarak devre dışı bırakılır. Bir değişikliği açtığınızda veya kapattığınızda
varsayılan durumunu geçersiz kılarsınız.
Uyumluluk çerçevesinin kötü amaçlı olarak kullanılmasını önlemek için değişiklikleri ne zaman değiştirebileceğiniz konusunda bazı kısıtlamalar vardır. Bir değişikliği açıp kapatamayacağınız değişiklik türüne, uygulamanızın hata ayıklamaya uygun olup olmadığına ve cihazınızda çalışan derleme türüne bağlıdır. Aşağıdaki tabloda farklı değişiklik türlerini açıp kapatabileceğiniz zamanlar açıklanmaktadır:
Derleme türü | Hata ayıklanamayan uygulama | Hata ayıklanabilir uygulama | |
---|---|---|---|
Tüm değişiklikler | targetSDKVersion tarafından kontrol edilen değişiklikler | Diğer tüm değişiklikler | |
Geliştirici Önizlemesi veya Beta derlemesi | Geçiş yapılamıyor | Geçiş yapabilir | Geçiş yapabilir |
Herkese açık kullanıcı derlemesi | Geçiş yapılamıyor | Geçiş yapabilir | Geçiş yapılamıyor |