API Düzeyi: 17
Android 4.2 (JELLY_BEAN_MR1
)
kullanıcılar ve uygulama için yeni özellikler sunan Jelly Bean sürümünün güncellemesidir.
birlikte çalışır. Bu belgede, projenin en önemli ve en önemli
geliştiriciler için yararlı yeni API'ler.
Uygulama geliştirici olarak Android 4.2 sistem görüntüsü ve SDK platformunu şuradan indirmeniz gerekir: SDK Manager'ı en kısa sürede güncelleyin. Şu durumda: Uygulamanızı test etmek için Android 4.2 çalıştıran bir cihazınız yoksa Android 4.2 sistemini kullanın görselini kullanarak uygulamanızı Android emülatöründe test edebilirsiniz. Ardından, en yeni API'leri kullanmaya başlamak için uygulamalarınızı Android 4.2 platformunda derleyin.
Uygulamanızı Android 4.2 çalıştıran cihazlar için daha iyi optimize etmek üzere
targetSdkVersion
özelliğini şu şekilde ayarlamalısınız:
"17"
, Android 4.2 sistem görüntüsüne yükleyin,
test edip bu değişikliği içeren bir güncelleme yayınlayın.
Siz
API'leri Android 4.2'de kullanabilir ve
çalıştırmadan önce sistem API düzeyini kontrol eden kodunuza koşullar
minSdkVersion
cihazınızın desteklemediği API'ler.
Şu konu hakkında daha fazla bilgi edinmek için:
geriye dönük uyumluluğu koruma için Geriye Dönük Uyumlu Oluşturma başlıklı makaleyi okuyun
Kullanıcı arayüzleri.
API düzeylerinin işleyiş şekli hakkında daha fazla bilgiyi API nedir? Düzey mi?
Önemli davranış değişiklikleri
Daha önce Android için bir uygulama yayınladıysanız aşağıdakilere dikkat edin Uygulamanızın davranışını etkileyebilecek değişiklikler:
- İçerik sağlayıcılar artık varsayılan olarak dışa aktarılmıyor. Diğer bir deyişle,
android:exported
özelliği için artık“false"
. Diğer uygulamaların sağlayıcıya erişebiliyorsanız artıkandroid:exported="true"
özelliğini açık bir şekilde ayarlamanız gerekir.Bu değişiklik yalnızca
android:targetSdkVersion
veyaandroid:minSdkVersion
değerini 17 ya da daha yüksek bir değere ayarlarsanız geçerli olur. Aksi takdirde varsayılan değer yine“true"
olur hatta Android 4.2 ve sonraki sürümlerde bile kullanılabilir. - Android'in önceki sürümleriyle karşılaştırıldığında kullanıcı konumu sonuçlarının doğruluğu daha düşük olabilir
Uygulamanız
ACCESS_COARSE_LOCATION
iznini istiyor ancak ,ACCESS_FINE_LOCATION
iznini istemiyor.Uygulamanız şunlar için izin istediğinde kullanıcıların gizlilik beklentilerini karşılamak: yaklaşık konum (tam konum değil) olduğunda sistem, kullanıcıya yaklaşık konum tahmini sağlamaz bir şehir bloğundan daha doğrudur.
Settings.System
tarafından tanımlanan bazı cihaz ayarları artık tanımlandı salt okunur. Uygulamanız,Settings.System
politikasında tanımlanan veSettings.Global
hizmetine taşınan ayarları yazmaya çalışırsa Android 4.2 ve sonraki sürümlerde çalışırken yazma işlemi sessiz bir şekilde başarısız olur.android:targetSdkVersion
veandroid:minSdkVersion
değeriniz 17'den düşük olsa bile uygulamanız, , Android 4.2 ve sonraki sürümlerde çalışırkenSettings.Global
konumuna taşındı.- Uygulamanızda
WebView
kullanılıyorsa Android 4.2, uygulamanızın Böylece JavaScript'i uygulamanıza daha güvenli bir şekilde bağlayabilmek için Android kodu. ÖrneğintargetSdkVersion
için artık@JavascriptInterface
ek açıklamasını eklemek istediğiniz herhangi bir yönteme eklemeniz JavaScript'inizde kullanılabilir olmasını ister (yöntem ayrıca herkese açık olmalıdır). Lütfen not, söz konusu yöntemeWebView
içindeki bir web sayfası tarafından erişilemiyorsa . ÖrneğintargetSdkVersion
değeri 16 veya altına düştüğünde ek açıklama gerekmez ancak hedef sürümünüzü güncellemenizi öneririz. ve daha fazla güvenlik için ek açıklama ekleyin.Bağlama hakkında daha fazla bilgi edinin. JavaScript kodu için Android kodu.
Daydream
Daydream, Android cihazlar için geliştirilmiş yeni etkileşimli ekran koruyucu modudur. Otomatik olarak etkinleştirilir Cihaz bir yuvaya takıldığında veya yuvaya takılıyken boşta kaldığında şarj cihazı (ekranı kapatmak yerine). Daydream her seferinde bir rüya görüntüler ve bu, Dokunulduğunda kapanan veya etkileşimli ve duyarlı olabilen, tamamen görsel, pasif bir ekran olmalıdır. tüm giriş etkinlikleri paketine otomatik olarak geçiş yapar. Hayalleriniz, uygulamanızın sürecinde çalışır ve aşağıdakilere tam erişim elde eder: görünüm, düzenler ve animasyonları içeren Android kullanıcı arayüzü araç seti sayesinde daha esnek animasyonlu duvar kağıtlarından veya uygulama widget'larından daha güçlü.
DreamService
alt sınıfını uygulayarak Daydream için bir hayal oluşturabilirsiniz. DreamService
API'ler:
Activity
ile benzer olacak şekilde tasarlanmıştır. Şunun için kullanıcı arayüzünü belirtmek için:
öğesini tamamladıktan sonra herhangi bir noktada setContentView()
adresine bir düzen kaynağı kimliği veya View
onAttachedToWindow()
gibi bir pencereden
geri arama.
DreamService
sınıfı, yaşam döngüsü boyunca başka önemli geri çağırma işlemleri sağlar.
temel Service
API'lerine ek olarak onDreamingStarted()
, onDreamingStopped()
ve onDetachedFromWindow()
gibi yöntemler kullanabilirsiniz.
Şuradan bir DreamService
başlatamazsınız:
uygulama. Sistem tarafından otomatik olarak başlatılır.
Hayaliniz etkileşimliyse, rüyanızdan bir etkinlik başlatabilir ve kullanıcıyı ilgili
uygulamanızın tam kullanıcı arayüzünde daha fazla ayrıntı veya kontrol sağlayabilirsiniz. Kullanıcının görebileceği şekilde hayali sonlandırmak için finish()
öğesini kullanabilirsiniz.
yeni Etkinlik'e dokunun.
Hayal gücünüzü sistemde kullanılabilir hale getirmek için DreamService
öğenizi <service>
öğesiyle bildirin
manifest dosyanıza ekleyin. Daha sonra, "android.service.dreams.DreamService"
işlemine sahip bir intent filtresi eklemeniz gerekir. Örnek:
<service android:name=".MyDream" android:exported="true" android:icon="@drawable/dream_icon" android:label="@string/dream_label" > <intent-filter> <action android:name="android.service.dreams.DreamService" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service>
DreamService
ürününde başka yararlı yöntemler de vardır
dikkat etmeniz gereken bazı konular:
setInteractive(boolean)
, hayal, kullanıcı girişinden hemen sonra giriş etkinliklerini veya çıkışları alır. Hayalim kullanıcı rüyadan çıkmak için Geri veya Ana Ekran düğmelerini kullanabilir veya Rüyayı durdurmak içinfinish()
.- Tamamen etkileyici bir ekran istiyorsanız durum çubuğunu gizlemek için
setFullscreen()
öğesini çağırabilirsiniz. - Hafif uyku modu başlamadan önce, kullanıcıya boşta kalma zaman aşımının işaretleneceğini bildirmek için ekran kararır
yaklaşıyor.
setScreenBright(true)
numarasını aradığınızda, ekranı normal parlaklığına ayarlayabilirsiniz.
Daha fazla bilgi için DreamService
belgelerine bakın.
İkincil Ekranlar
Android artık bağlı olan ek ekranlarda uygulamanızın benzersiz içerikler göstermesine olanak tanıyor
veya kablosuz bağlantı üzerinden kullanıcının cihazına bağlayabilirsiniz.
İkincil bir ekran için benzersiz içerik oluşturmak isterseniz Presentation
öğesini genişletin
sınıfını kullanın ve onCreate()
geri çağırmasını uygulayın. Şu süre içinde:
onCreate()
, ikincil ekran için kullanıcı arayüzünüzü belirtin
setContentView()
numaralı telefonu arayarak.
Dialog
sınıfının bir uzantısı olarak Presentation
sınıfı, uygulamanızın
ikincil görüntülü reklam.
Presentation
gösterebileceğiniz ikincil ekranları algılamak için
DisplayManager
veya MediaRouter
kullanın
API'ler. DisplayManager
API'leri tüm verileri numaralandırmanıza
aynı anda bağlanabilecek birden fazla ekran varsa sistemin varsayılan ekranına hızlıca erişmek için
MediaRouter
tercih etmelisiniz.
en iyi uygulamaları
paylaşacağız.
Sununuzun varsayılan görüntüsünü almak için MediaRouter.getSelectedRoute()
numaralı telefonu arayıp iletebilirsiniz
ROUTE_TYPE_LIVE_VIDEO
. Bu komut, sistemin seçili olan rotasını açıklayan bir MediaRouter.RouteInfo
nesnesi döndürür.
en iyi uygulamaları paylaşacağız. MediaRouter.RouteInfo
boş değilse şunu çağırın:
Bağlı ekranı temsil eden Display
değerini almak için getPresentationDisplay()
.
Daha sonra Display
nesnesini ileterek sununuzu görüntüleyebilirsiniz
Presentation
sınıfınız için bir oluşturucusuna ekleyin. Sununuz artık
görünür.
Yeni bir ekran bağlandığını çalışma zamanında algılamak için onRoutePresentationDisplayChanged()
geri çağırma yöntemini uyguladığınız bir MediaRouter.SimpleCallback
örneği oluşturun. Yeni bir ekran bağlandığında sistem bu yöntemi çağırır.
sunu ekranı bağlandı. Ardından, MediaRouter.SimpleCallback
rotasını ROUTE_TYPE_LIVE_VIDEO
rota türüyle birlikte MediaRouter.addCallback()
adresine ileterek kaydedin. Bir çağrı aldığınızda
onRoutePresentationDisplayChanged()
, yukarıda belirtildiği gibi MediaRouter.getSelectedRoute()
adlı kişiyi aramanız yeterlidir.
Presentation
içindeki kullanıcı arayüzünü daha da optimize etmek için
ikincil ekranlara göre
arasında android:presentationTheme
özelliğini belirterek <style>
üzerine konuşacağız.
Kullanıcının cihazına bağlı ekranların genellikle daha büyük ekran boyutuna ve
farklı bir ekran yoğunluğuna sahip olabilir. Ekran özellikleri farklı olabileceğinden,
Özellikle bu tür daha büyük ekranlar için optimize edilmiş kaynaklar sağlar. İhtiyacınız varsa
Presentation
cihazınızdan ek kaynak istemek için getContext()
.getResources()
numaralı telefonu arayarak ekrana karşılık gelen Resources
nesnesini alın. Bu da
uygulamanıza en uygun kaynakları
ikincil ekranın ekran boyutu ve yoğunluğu.
Daha fazla bilgi ve bazı kod örnekleri için Presentation
sınıf belgeleri.
Kilit Ekranı Widget'ları
Android artık kullanıcıların kilit ekranına uygulama widget'ları eklemesine izin veriyor. Uygulama Widget'ınızı
kilit ekranında, AppWidgetProviderInfo
öğesini belirten XML dosyanıza android:widgetCategory
özelliğini ekleyin. Bu özellik iki değeri destekler: home_screen
ve keyguard
. Kullanıcılarınhome_screen
uygulama widget'ını ana ekrana taşıyın. Uygulama widget'ınızın kilitte de kullanılabilir olmasını istiyorsanız
ekranına keyguard
değerini ekleyin:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" ... android:widgetCategory="keyguard|home_screen"> </appwidget-provider>
Ayrıca, kilit ekranındayken uygulama widget'ınız için bir başlangıç düzeni
android:initialKeyguardLayout
özelliği için değer ekleyebilirsiniz. Bu, android:initialLayout
ile aynı şekilde çalışır. Çünkü
Uygulama widget'ınız başlatılana kadar hemen görünebilecek ve
kullanır.
Kilit ekranı için uygulama widget'ları oluşturma hakkında daha fazla bilgi için Uygulama Widget'ları kılavuzuna bakın.
Birden Çok Kullanıcı
Android artık tabletler gibi paylaşılabilir cihazlarda birden fazla kullanıcı alanına izin veriyor. Bir web sitesindeki her kullanıcı cihazın kendi hesapları, uygulamaları, sistem ayarları, dosyaları ve diğer öğeleri verileri de kapsar.
Uygulama geliştirici olarak, uygulamanızın çalışması için farklı bir şey yapmanız gerekmez aynı cihazda birden fazla kullanıcıyla düzgün şekilde çalışır. Bir platformda kaç kullanıcı olursa olsun söz konusu cihaz için uygulamanızın belirli bir kullanıcı için kaydettiği veriler, uygulamanızın kaydettiği verilerden ayrı tutulur. kullanıcılar için neden budur. Sistem, hangi kullanıcı verilerinin veri içeren kullanıcı işlemine ait olduğunu Uygulamanız çalışıyor ve uygulamanızın yalnızca bu kullanıcının verilerine erişmesine izin veriyor ve Diğer kullanıcıların verilerine erişme.
Çok kullanıcılı ortamda verileri kaydetme
Uygulamanız kullanıcı tercihlerini kaydettiğinde, veritabanı oluşturduğunda veya kullanıcının dahili veya harici depolama alanında yer alırsa bu verilere yalnızca ilgili kullanıcı olarak çalıştırıldığı sırada erişilebilir.
Uygulamanızın çok kullanıcılı bir ortamda düzgün bir şekilde davrandığından emin olmak için sabit kodlu yolları kullanarak dahili uygulama dizini veya harici depolama konumunu izleme ve onun yerine her zaman uygun API'leri kullanın:
- Dahili depolama alanına erişim için
getFilesDir()
,getCacheDir()
veyaopenFileOutput()
kullanın. - Harici depolama alanına erişim için
getExternalFilesDir()
veyagetExternalStoragePublicDirectory()
kullanın.
Belirli bir kullanıcının verilerini kaydetmek için bu API'lerden hangisini kullanırsanız kullanın, veriler yine de erişilebilir hale getirebilirsiniz. Uygulamanız açısından her kullanıcı tamamen ayrı bir cihazda saklamanıza olanak tanır.
Çok kullanıcılı ortamda kullanıcıları tanımlama
Uygulamanız, analiz toplamak veya başka bir hesap oluşturmak gibi benzersiz kullanıcıları tanımlamak istiyorsa
ilişkilendirmelerini not etmek için, Google Cloud'u tanımlamak üzere
benzersiz yükleme sayısı. UygulamanızUUID
kaç tanesine bakıldığından bağımsız olarak her kullanıcıyı izlemek için benzersiz bir kimlik alacağınızdan
uygulamanızı tek bir cihaza yüklemesini sağlar. Alternatif olarak, şuradan getirilen bir yerel jeton kaydedebilirsiniz:
veya Google Cloud Messaging tarafından sağlanan kayıt kimliğini kullanın.
Uygulamanız donanım cihazı tanımlayıcılarından (WiFi MAC gibi) birini isterse
SERIAL
numarası gibi) her biri için aynı değeri sağlar.
çünkü bu tanımlayıcılar kullanıcıya değil, donanıma bağlıdır. Diğerlerinden bahsetmiyorum.
Burada değinildiği gibi, bu tanımlayıcıların tanıttığı
Uygulama Yüklemeleri konulu blog yayınından daha fazla bilgi edinebilirsiniz.
Yeni Genel Ayarlar
Sistem ayarları, Settings.Global
ürününün eklenmesiyle birden fazla kullanıcıyı destekleyecek şekilde güncellendi. Bu ayar koleksiyonu salt okunur olduklarından Settings.Secure
ayarlarına benzer, ancak genel olarak şuralarda geçerlidir:
cihazdaki tüm kullanıcı alanları.
Mevcut bazı ayarlar Settings.System
veya Settings.Secure
konumundan buraya taşındı. Uygulamanız
şu anda daha önce Settings.System
içinde tanımlanan ayarlarda değişiklik yapılıyor
(AIRPLANE_MODE_ON
gibi) kullanıyorsanız,
Android 4.2 veya sonraki sürümleri çalıştıran cihazlarda bu ayarlar kullanılabiliyorsa
Settings.Global
klasörüne taşındı. Şuradaki ayarları okumaya devam edebilirsiniz:
Ayarlar artık güvenli olarak kabul edilmediğinden Settings.Global
bu değişikliği yapmaya çalıştığınızda işlem sessizce başarısız olur ve sistem,
Sistem günlüğü.
RTL Düzen Desteği
Android artık sorunsuz şekilde kullanıcı arayüzleri oluşturmanıza olanak tanıyan çeşitli API'ler sunuyor. Sağdan sola (RTL) kullanıcı arayüzleri ve okuma kullanan dilleri desteklemek için düzen yönünü dönüştürme yönlendirme için kullanabilirsiniz.
Uygulamanızda RTL düzenlerini desteklemeye başlamak için manifest dosyanızda android:supportsRtl
özelliğini <application>
öğesine ayarlayın.
ve “true"
olarak ayarladım. Bu özellik etkinleştirildiğinde sistem, şunları yapmak için çeşitli RTL API'lerini etkinleştirir:
uygulamanızı RTL düzenleriyle gösterin. Örneğin, işlem çubuğunda simge ve başlık gösterilir.
için de soldan sağa işlem düğmeleri ve
çerçeve tarafından sağlanan View
sınıfları da geri alınır.
Sağdan sola düzeniyle gösterildiğinde uygulamanızın görünümünü daha da optimize etmeniz gerekirse İki temel optimizasyon düzeyi vardır:
- Sol ve sağa yönlü düzen özelliklerini başlangıç ve bitiş odaklı düzene dönüştür
özellikler.
Örneğin,
android:layout_marginStart
kullanın (android:layout_marginRight
yerineandroid:layout_marginLeft
veandroid:layout_marginEnd
).RelativeLayout
sınıfı, ilgili düzeni de sağlar. özellikleri, örneğinandroid:layout_alignParentStart
-android:layout_alignParentLeft
veandroid:layout_toStartOf
yerineandroid:layout_toLeftOf
. - Bunun yerine RTL düzenleri için tam optimizasyon sağlamak üzere RTL düzenleri için tamamen ayrı
ldrtl
kaynak niteleyiciyi kullanan düzen dosyaları (ldrtl
, Edit-direction-right-to-left}). Örneğin, varsayılan düzen dosyalarınızıres/layout-ldrtl/
içinderes/layout/
ve RTL için optimize edilmiş düzenleriniz.ldrtl
niteleyicisi, çekilebilir kaynaklar için idealdir. Böylece Okuma yönüne karşılık gelen yöne bakan grafikler
RTL düzenlerini desteklemek için çerçeve genelinde
View
sınıfını kullanarak özel etiketler için doğru davranışları uygulayabilirsiniz.
görünümleri ve Configuration
içinde de geçerli düzen yönünü sorgulamak için kullanılır.
Not: SQlite kullanıyorsanız ve
"yalnızca sayı", olmak
Dikkatli: String.format(String, Object...)
kullanmak, rakamların
cihazınız Arapça yerel ayarına ayarlanmışsa Arapçadaki eşdeğerlerine dönüştürülecektir.
Sayıların doğru olduğundan emin olmak için String.format(Locale,String,Object...)
kullanmanız gerekir
korunduğundan emin olun. Ayrıca,String.format("%d", int)
Şunun için String.valueOf(int)
:
biçimlendirme sayıları.
İç İçe Yerleştirilmiş Parçalar
Artık parçaları parçaların içine yerleştirebilirsiniz. Bu, çalışma düzenindeki çeşitli
Dinamik ve yeniden kullanılabilir kullanıcı arayüzü bileşenlerini, kendi başına bir kullanıcı arayüzü bileşenine yerleştirmek istediğiniz
dinamik ve tekrar kullanılabilir. Örneğin, ViewPager
kullanarak
hızlıca sola ve sağa kaydırarak ekran alanının çoğunu kaplayan parçalar oluşturabilirsiniz.
parçaları her bir parça sayfasına ekleyin.
Bir parçayı iç içe yerleştirmek için üzerinde getChildFragmentManager()
komutunu çağırmanız yeterlidir
parça eklemek istediğiniz Fragment
öğesini seçin. Bu işlem, üst düzey etkinlikten normalde yaptığınız gibi kullanabileceğiniz bir FragmentManager
döndürür.
parça işlemleri oluşturmak için kullanılır. Örneğin, aşağıda örnek dosya içinden bir parça ekleyen
mevcut bir Fragment
sınıfı:
Kotlin
val videoFragment = VideoPlayerFragment() childFragmentManager.beginTransaction().apply { add(R.id.video_fragment, videoFragment) commit() }
Java
Fragment videoFragment = new VideoPlayerFragment(); FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); transaction.add(R.id.video_fragment, videoFragment).commit();
İç içe yerleştirilmiş bir parçanın içinden, şunu çağırarak üst parçaya bir başvuru alabilirsiniz:
getParentFragment()
Android Destek Kitaplığı artık iç içe yerleştirilmiş parçaları da desteklemektedir, böylece iç içe yerleştirilmiş parçaları parça tasarımlarını kullanın.
Not: Bu düzen söz konusu olduğunda, düzeni parçaya şişiremezsiniz
bir <fragment>
içerir. İç içe yerleştirilmiş parçalar yalnızca
parçasına dinamik bir şekilde uyar.
Renderscript
Renderscript hesaplama işlevi, aşağıdaki özelliklerle geliştirildi:
- Konuşma metni unsurları
Bu komut dosyalarını kullanarak yaygın işlemlerdir, örneğin:
Blends
Blur
Color matrix
3x3 convolve
5x5 convolve
Per-channel lookup table
Converting an Android YUV buffer to RGB
Yerleşik bir komut dosyası kullanmak için her bir yerleşik komut dosyasının statik
create()
yöntemini çağırın komut dosyasının bir örneğini oluşturun. Ardından, müsaitset()
hattını arayın. her komut dosyasının doğasında vardır. Son olarak,forEach()
yöntemini kullanabilirsiniz.- Komut Dosyası Grupları
-
ScriptGroup
öğeleri, ilgili Renderscript'i birbirine zincirlemenize olanak tanır tek bir çağrıyla yürütür.Tüm komut dosyalarını gruba eklemek için
ScriptGroup.Builder
kullanınaddKernel()
numaralı telefonu arayarak. Planınızı komut dosyalarını ekledikten sonra, komut dosyalarınıaddConnection()
çağırarak yapabilirsiniz. Bağlantıları ekleme işlemini tamamladığınızdacreate()
adlı kuruluşu arayın komut dosyası grubunu oluşturun. Komut dosyası grubunu yürütmeden önce girişi belirtinAllocation
ve ilk komut dosyası,setInput(Script.KernelID, Allocation)
yöntemini kullanıp çıktıyıAllocation
burada sonucun ve nihai komut dosyasınınsetOutput()
ile çalıştır. Son olarak, Komut dosyası grubunu çalıştırmak içinexecute()
. - Filtre komut dosyası
-
Filtre komut dosyası, mevcut Renderscript API'lerinde elde edilen kodun çalıştırılmasına olanak tanıyan kısıtlamaları tanımlar daha çeşitli işlemcilerde (CPU, GPU ve DSP) kullanılabilir. Filtre komut dosyası oluşturmak için
.fs
dosyası oluşturun dosyalarını kullanarak.rs
dosyalarını çalıştırabilir ve#pragma rs_fp_relaxed
öğesini Renderscript çalışma zamanına komut dosyalarınızın yüksek düzeyde IEEE 754-2008 kayan nokta kesinliği gerektirmediğini bildirir. Bu hassasiyet, denorlar için sıfıra yuvarlama ve sıfıra yuvarlamaya olanak tanır. Ayrıca, Filterscript komut dosyaları, 32 bit yerleşik türleri kullanmamalı ve__attribute__((kernel))
özelliği,root()
işlevinin varsayılan imzasını tanımlar.
Not: Platformda filterscript desteği mevcuttur ancak geliştirici desteği, SDK Araçları Sürüm 21.0.1'de sunulacaktır.
Android 4.2'deki tüm API değişikliklerinin ayrıntılı görünümü için API Farklılıkları Raporu.