iOS ve Mac Catalyst'te yerel AOT dağıtımı

Yerel AOT dağıtımı, önceden zamanda (AOT) derlenmiş yerel koda sahip bir .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) uygulaması oluşturur ve bu uygulama iOS ve Mac Catalyst'te çalışır. Yerel AOT, statik program analizi, uygulamanızın tam kırpılması ve statik olarak başvurulmayan kodun agresif bir şekilde kaldırılması ile zamanından önce kod oluşturma işlemlerini gerçekleştiren bir yapıdır.

Yerel AOT uygulamasını yayımlamak ve dağıtmak aşağıdaki avantajları sağlar:

  • Uygulama paketi boyutu küçültüldü.
  • Daha hızlı başlangıç süresi.
  • Daha hızlı derleme süresi.

Yerel AOT, .NET çalışma zamanının belirli yönlerinin kullanımıyla ilgili sınırlamalar sunar ve yalnızca uygulama boyutunun ve performansının önemli olduğu senaryolarda kullanılmalıdır. Uygulamalarınızı Yerel AOT gereksinimlerine uyacak şekilde uyarlamanız gerekir; bu, bunların tamamen optimize edildiğinden ve AOT ile uyumlu olduğundan emin olmanız anlamına gelir. Yerel AOT sınırlamaları hakkında daha fazla bilgi için Native AOT sınırlamaları bölümüne bakın.

Yerel AOT dağıtımı etkinleştirildiğinde, derleme sistemi kodunuzu ve tüm bağımlılıklarını analiz ederek tam kırpma ve AOT derlemesi için uygun olup olmadığını doğrular. Uyumsuzluklar algılanırsa, kesme ve AOT uyarıları oluşturulur. Tek bir kesme veya AOT uyarısı, uygulamanın Native AOT dağıtımıyla uyumlu olmadığı ve düzgün çalışmayabileceği anlamına gelir. Bu nedenle, yerel AOT dağıtımına yönelik bir uygulama geliştirirken tüm kırpma ve AOT uyarılarını gözden geçirip düzeltmeniz gerekir. Gerekli kod kaldırılmış olabileceğinden, bunun yapılmaması çalışma zamanında özel durumlara neden olabilir. Uyarıları bastırırsanız, AOT ile dağıtılan uygulamanın, işlevselliğin kısaltılmamış uygulamadan değişmediğini doğrulamak için kapsamlı bir şekilde test edilmesi gerekir. Daha fazla bilgi için Kırpma uyarılarına ve AOT uyarılarına giriş bölümlerine bakın.

Not

Kırpma ve AOT uyarılarını düzeltmenin mümkün olmadığı durumlar olabilir, özellikle de bunlar üçüncü taraf kütüphanelerle ilgili gerçekleştiğinde. Bu gibi durumlarda, üçüncü taraf kitaplıkların tamamen uyumlu olması için güncelleştirilmesi gerekir.

Yerel AOT performans avantajları

Yerel AOT uygulaması yayımlama ve dağıtma genellikle 2,5 kata kadar daha küçük bir uygulama ve genellikle 2 kata kadar daha hızlı başlayan bir uygulama üretir. Ancak, tam performans avantajları kullanılan platformu, uygulamanın çalıştığı cihazı ve uygulamanın kendisini içeren birden çok faktöre bağlıdır.

Önemli

Aşağıdaki grafikler, iOS ve Mac Catalyst'te bir dotnet new maui uygulama için Yerel AOT dağıtımının tipik performans avantajlarını gösterir. Ancak, tam veriler donanıma bağlıdır ve gelecek sürümlerde değişebilir.

Aşağıdaki grafikte, farklı dağıtım modellerinde iOS ve Mac Catalyst'te bir dotnet new maui uygulamanın uygulama paketi boyutu gösterilmektedir:

Farklı dağıtım modellerinde uygulama paketi boyutunu gösteren grafik.

Yukarıdaki grafikte, Yerel AOT'nin hem iOS hem de Mac Catalyst için varsayılan dağıtım modeline kıyasla 2 kat daha küçük uygulamalar ürettiği gösterilmektedir.

Aşağıdaki grafikte, Mono ve Yerel AOT dağıtımında iOS ve Mac Catalyst üzerinde bir uygulama için belirli donanımlarda dotnet new maui ortalama başlangıç süresi gösterilmektedir:

Mono ve Yerel AOT'de ortalama uygulama başlatma süresini gösteren grafik.

Yukarıdaki grafikte Yerel AOT'nin genellikle iOS cihazlarında 2 kata kadar daha hızlı başlangıç süresine ve Mac Catalyst'te Mono dağıtımına kıyasla 1,2 kat daha hızlı başlangıç süresine sahip olduğu gösterilmektedir.

Aşağıdaki grafik, farklı dağıtım modellerinde iOS ve Mac Catalyst'te bir uygulamanın belirli donanımlarda dotnet new maui ortalama derleme süresini gösterir:

Mono ve Yerel AOT'de ortalama uygulama derleme süresini gösteren grafik.

Yukarıdaki grafik, yerel AOT'nin varsayılan dağıtım modeline kıyasla iOS cihazlarında genellikle 2,8 kata kadar daha hızlı derleme süresine sahip olduğunu göstermektedir. Mac Catalyst için derleme süreleri arm64 tek RID uygulamaları için karşılaştırılabilir, ancak Mono dağıtımına kıyasla evrensel uygulamalar için biraz daha yavaştır.

Önemli

Birçok senaryoda Yerel AOT daha küçük ve daha hızlı uygulamalar üretecektir. Ancak bazı senaryolarda Yerel AOT daha küçük ve daha hızlı uygulamalar üretmeyebilir. Bu nedenle, yerel AOT dağıtımının etkinleştirilmesinin sonucunu belirlemek için uygulamanızı test etmek ve profil oluşturmak önemlidir.

Yerel AOT kullanarak yayımlama

Yerel AOT dağıtım modeli, $(PublishAot) derleme özelliği ve dotnet publish komutuyla etkinleştirilir. Aşağıdaki örnekte, iOS ve Mac Catalyst'te Yerel AOT dağıtımını etkinleştirmek için proje dosyasının nasıl değiştirileceği gösterilmektedir:

<PropertyGroup>
  <!-- enable trimming and AOT analyzers on all platforms -->
  <IsAotCompatible>true</IsAotCompatible>

  <!-- select platforms to use with NativeAOT -->
  <PublishAot Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">true</PublishAot>
  <PublishAot Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">true</PublishAot>
</PropertyGroup>

Derleme özelliğinin $(IsAotCompatible) olarak, tüm platformlar için true ayarlanması, kırpmayı ve AOT çözümleyicilerini etkinleştirir. Bu çözümleyiciler kırpma veya AOT ile uyumlu olmayan kodu belirlemenize yardımcı olur.

iOS ve Mac Catalyst için $(PublishAot)'ün true olarak koşullu ayarlanması, derleme sürecinde dinamik kod kullanım analizini ve yayımlama sırasında Yerel AOT derlemeyi etkinleştirir. Yerel AOT analizi, uygulamanın tüm kodunu ve uygulamanın bağımlı olduğu tüm kitaplıkları içerir.

Uyarı

$(PublishAot) Derleme özelliği, derleme yapılandırmasına göre koşullandırılmamalıdır. Bunun nedeni, derleme özelliğinin değerine göre kırpma özellikleri anahtarlarının etkinleştirilmesi veya devre dışı bırakılması ve kodunuzun $(PublishAot) aynı şekilde davranması için tüm derleme yapılandırmalarında aynı özelliklerin etkinleştirilmesi veya devre dışı bırakılması gerekir. Özellik anahtarlarını kırpma hakkında daha fazla bilgi için Özellik anahtarlarını kırpma'ya bakın.

Yerel AOT uygulamasının düzgün çalıştığını doğrulamanın tek yolu uygulamayı dotnet publish kullanarak yayımlamak ve kodunuz ile bağımlılıklarınız tarafından hiçbir kırpma veya AOT uyarısının üretilmediğini doğrulamaktır. Özellikle, dotnet build -t:Publish ile dotnet publisheşdeğer değildir.

Yerel AOT dağıtımını kullanarak uygulamanızı iOS ve Mac Catalyst'te yayımlamak için aşağıdaki dotnet publish komutu kullanın:

# iOS
dotnet publish -f net9.0-ios -r ios-arm64

# Mac Catalyst
dotnet publish -f net9.0-maccatalyst -r maccatalyst-arm64
dotnet publish -f net9.0-maccatalyst -r maccatalyst-x64

# Universal Mac Catalyst apps
# (when <RuntimeIdentifiers>maccatalyst-x64;maccatalyst-arm64</RuntimeIdentifiers> is set in the project file)
dotnet publish -f net9.0-maccatalyst

İpucu

Geliştirme yaşam döngüsünün başlarında kırpma veya AOT sorunlarını keşfetmek için uygulamaları sık sık yayımlayın.

Yerel AOT sınırlamaları

Yerel AOT, .NET çalışma zamanının belirli yönlerinin kullanımıyla ilgili sınırlamalar sunar ve yalnızca uygulama boyutunun ve performansının önemli olduğu senaryolarda kullanılmalıdır. Uygulamalarınızı Yerel AOT gereksinimlerine uyarlamanız gerekir; bu da bunların tamamen kırpıldığından ve AOT ile uyumlu olduğundan emin olmanız anlamına gelir ve bu çok fazla çalışma gerektirebilir. Yerel AOT dağıtımının .NET sınırlamalarına ek olarak, .NET MAUI için Yerel AOT dağıtımının ek sınırlamaları vardır.

Uygulamalarınızın bağımlı olduğu üçüncü taraf kitaplıkları AOT ile uyumlu olmayabilir. Bir kitaplığın kırpma ve AOT uyumlu olmasını sağlamanın tek yolu, uygulamanızı Yerel AOT dağıtımı (ve dotnet publish komutu ile) kullanarak yayımlamak ve Yerel AOT derleyicisinin kitaplık için herhangi bir uyarı üretip üretmediğini kontrol etmektir. Kendi kitaplıklarınızı yerel AOT ile uyumlu hale getirme hakkında bilgi için Kitaplıkları yerel AOT ile uyumlu hale getirme bölümüne bakın.

Yansıma ve dinamik kod

Yerel AOT dağıtımı, kodunuzda ve bağımlılıklarında yansıma kullanımını sınırlar ve Yerel AOT derleyicisinin yansıma desenlerini anlamasına yardımcı olmak için ek açıklamaların kullanılması gerekebilir. Derleyici bir yansıma deseni ile karşılaştığında statik olarak çözümleyemez ve bu nedenle uygulamayı derleyemez, kırpma uyarıları üretir. Yerel AOT, uygulamanızda dinamik kod kullanmanızı da engeller. Örneğin derleme System.Linq.Expressions beklendiği gibi çalışmaz ve derlemeleri çalışma zamanında yükleyip yürütmek mümkün değildir. Derleyici, önceden derleme yapamadığı dinamik bir desenle karşılaştığında bir AOT uyarısı oluşturur.

.NET MAUI uygulamasında bu şu anlama gelir:

Önemli

Mono yorumlayıcı Yerel AOT dağıtımıyla uyumlu değildir ve bu nedenle $(UseInterpreter) ve $(MtouchInterpreter) MSBuild özelliklerinin Yerel AOT kullanılırken hiçbir etkisi yoktur. Mono yorumlayıcı hakkında daha fazla bilgi için bkz . iOS ve Mac Catalyst üzerinde Mono yorumlayıcı.

Trim uyarıları hakkında daha fazla bilgi için Trim Uyarılarına Giriş bölümüne bakın. AOT uyarıları hakkında daha fazla bilgi için bkz: AOT uyarılarına giriş.

Uygulamayı Yerel AOT dağıtımına uyarlama

Uygulamanızı Yerel AOT dağıtım gereksinimlerine uyarlamanıza yardımcı olması için aşağıdaki denetim listesini kullanın:

  • Tüm XAML'nin derlendiğinden emin olun:
    • Tüm [XamlCompilation(XamlCompilationOptions.Skip)] kullanımı kaldırın.
    • Tüm <?xaml-comp compile="false" ?> kullanımı kaldırın.
  • yöntemine yapılan tüm çağrıları LoadFromXaml kaldırın.
  • Tüm veri bağlamalarının derlendiğinden emin olun. Daha fazla bilgi için bkz . Derlenmiş bağlamalar.
    • Tüm XAML veri bağlamalarının x:DataType ile ek açıklama ile olduğundan emin olun.
    • Tüm kod veri bağlamalarının tüm dize tabanlı bağlamaları lambda tabanlı bağlamalarla değiştirdiğinden emin olun.
  • tüm OnPlatform XAML işaretleme uzantısı kullanımını OnPlatform<T> sınıfını kullanan bir uygulamayla değiştirin. Daha fazla bilgi için bkz. Platformtemelinde kullanıcı arabirimi görünümünü özelleştirme.
  • tüm OnIdiom XAML işaretleme uzantısı kullanımını OnIdiom<T> sınıfını kullanan bir uygulamayla değiştirin. Daha fazla bilgi için bkz. Kullanıcı arabirimi görünümünü cihaz deyimine göre özelleştirme.
  • Tüm [QueryProperty(...)] kullanımı arabiriminin IQueryAttributable bir uygulamasıyla değiştirin. Daha fazla bilgi için bkz . Gezinti verilerini tek bir yöntem kullanarak işleme.
  • Tüm SearchHandler.DisplayMemberName kullanımlarını ItemTemplate ile değiştirin. Daha fazla bilgi için bkz . Arama sonuçları öğe görünümünü tanımlama.
  • XAML'de kullanılan türler için tüm örtük dönüştürme işleçlerini bir TypeConverter ile değiştirin ve onu TypeConverterAttribute kullanarak türünüze ekleyin. Daha fazla bilgi için bkz Örtük dönüştürme işlecini değiştirmek için bir TypeConverter tanımlama.
    • Türünden türüne dönüştürme işlemi yapılırken, ConvertTo ile A ilişkilendirilmiş bir tür dönüştürücüsünün yöntemi veya ConvertFrom ile B ilişkilendirilmiş bir tür dönüştürücüsünün yöntemi kullanılır.
    • Hem kaynak hem de hedef türleri ilişkili bir tür dönüştürücüye sahip olduğunda, bunlardan biri kullanılabilir.
  • Kaynak oluşturucuları kullanarak tüm normal ifadeleri derleyin. Daha fazla bilgi için bkz . .NET normal ifade kaynak oluşturucuları.
  • JSON serileştirme ve seri durumdan çıkarmanın kaynak tarafından oluşturulan bir bağlam kullandığından emin olun. Daha fazla bilgi için bkz . Minimum API'ler ve JSON yükleri.
  • Kırpma veya AOT uyarılarını kontrol edin ve gerekli düzeltmeleri yapın. Daha fazla bilgi için Kırpma uyarılarına ve AOT uyarılarına giriş bölümlerine bakın.
  • Uygulamanızı kapsamlı bir şekilde test edin.

iOS ve Mac Catalyst'te yerel AOT tanılama desteği

Yerel AOT ve Mono, tanılama ve izleme özelliklerinin bir alt kümesini paylaşır. Mono'nun çeşitli tanılama araçları nedeniyle, sorunları Yerel AOT yerine Mono içinde tanılamak ve hata ayıklamak yararlı olabilir. Kırpma ve AOT uyumlu uygulamalarda davranış farklılıkları olmamalıdır, bu nedenle araştırma genellikle her iki çalışma zamanı için de geçerlidir.

Aşağıdaki tabloda iOS ve Mac Catalyst üzerinde Yerel AOT ile tanılama desteği gösterilmektedir:

Özellik Tam olarak desteklenir Kısmen desteklenir Desteklenmez
Gözlemlenebilirlik ve telemetri Kısmen desteklenir
Geliştirme süreci tanılama Tam olarak desteklenir
Yerel hata ayıklama Kısmen desteklenir
CPU Profili Oluşturma Kısmen desteklenir
Yığın analizi Desteklenmiyor

Aşağıdaki bölümlerde bu tanılama desteği hakkında ek bilgiler sağlanmaktadır.

Gözlemlenebilirlik ve telemetri

.NET MAUI uygulamalarının mobil platformlarda izlemesi, tanılama araçlarını iOS ve Mac Catalyst üzerinde çalışan .NET uygulamalarına TCP/IP üzerinden bağlayan dotnet-dsrouter aracılığıyla etkinleştirilir. Ancak Yerel AOT, TCP/IP yığınıyla oluşturulmuş EventPipe/DiagnosticServer bileşenlerini desteklemediğinden şu anda bu senaryoyla uyumlu değildir. Gözlemlenebilirlik hala kodda açıkça ulaşılabilir.

Geliştirme süresi teşhisi

.NET CLI araçları build ve publish için ayrı komutlar sağlar. dotnet build (veya Start Debugging (F5) Visual Studio Code'da), .NET MAUI iOS veya Mac Catalyst uygulamaları oluştururken veya başlatırken varsayılan olarak Mono kullanır. Yalnızca dotnet publish bu dağıtım modeli proje dosyasında etkinleştirilmişse Yerel AOT uygulaması oluşturur.

Tüm tanılama araçları yayımlanan Yerel AOT uygulamalarıyla sorunsuz çalışmaz. Bununla birlikte, kırpma ve AOT uyumlu tüm uygulamalarda (yani, derleme zamanında kırpma ve AOT uyarısı üretmeyen uygulamalarda) Mono ile Yerel AOT arasında davranış farklılıkları olmamalıdır. Bu nedenle, Hot Reload gibi tüm .NET geliştirme zamanına ait tanılama araçları, mobil uygulama geliştirme döngüsü sırasında geliştiriciler tarafından hala kullanılabilir.

İpucu

Uygulamanızı her zamanki gibi geliştirmeli, hata ayıklayıp test etmeli ve son uygulamanızı Yerel AOT ile son adımlardan biri olarak yayımlamalısınız.

Yerel hata ayıklama

Geliştirme sırasında .NET MAUI iOS veya Mac Catalyst uygulamanızı çalıştırdığınızda, varsayılan olarak Mono üzerinde çalışır. Ancak proje dosyasında Doğal AOT dağıtımı etkinleştirilirse, uygulama derleme zamanında herhangi bir kırpma ve AOT uyarısı üretmediğinde, Mono ve Doğal AOT arasında davranışın aynı olması beklenir. Uygulamanızın bu gereksinimi karşılaması koşuluyla, geliştirme ve test için standart Visual Studio Code yönetilen hata ayıklama altyapısını kullanabilirsiniz.

Yayınlandıktan sonra, Yerel AOT uygulamaları gerçek yerel ikili dosyalar haline gelir ve bu nedenle, yönetilen hata ayıklayıcı bu yerel ikili dosyalar üzerinde çalışmaz. Ancak, Yerel AOT derleyicisi tamamen yerel yürütülebilir dosyalar oluşturur ve bu dosyaları lldb ile hata ayıklayabilirsiniz. Bir Mac Catalyst uygulamasında lldb ile hata ayıklama işlemi, aynı sistemde yürütüldüğü için kolaydır. Ancak NativeAOT iOS uygulamalarında hata ayıklamak için ek çaba gerekir.

Yerel AOT ile .NET MAUI iOS uygulamalarında hata ayıklama

Yerel AOT ile uyumlu olan ve bu dağıtım modeliyle düzgün yapılandırılan ve yayımlanan .NET MAUI iOS uygulamalarında aşağıdaki gibi hata ayıklanabilir:

  1. Uygulamanızı Yerel AOT hedeflemesi ios-arm64 ile yayımlayın ve aşağıdaki bilgileri not edin:

    • Uygulama adı (aşağıda <app-name> olarak atıfta bulunulan).
    • Paket tanımlayıcısı (aşağıda <bundle-identifier> olarak referans verilmiştir).
    • Yayımlanan uygulamanın arşiv dosyası .ipa yolunun (<path-to-ipa> olarak aşağıda başvurulur).
  2. Fiziksel cihaz kimliğinizi alın (aşağıda <device-identifier> olarak referans verilmektedir):

    xcrun devicectl list devices
    
  3. Uygulamayı fiziksel cihazınıza yükleyin:

    xcrun devicectl device install app --device <device-identifier> <path-to-ipa>
    
  4. Uygulamayı fiziksel cihazınızda başlatın:

    xcrun devicectl device process launch --device <device-identifier> --start-stopped <bundle-identifier>
    
  5. Fiziksel cihazınızı açın lldb ve bu cihaza bağlanın:

    (lldb) device select <device-identifier>
    (lldb) device process attach -n <app-name>
    

Bu adımları başarıyla tamamladıktan sonra Yerel AOT .NET MAUI iOS uygulamanızda lldb hata ayıklamaya başlayabilirsiniz.

Sembol dosyasının önemi

Varsayılan olarak, hata ayıklama simgeleri uygulamanın ikili dosyasından bir .dSYM dosyasına çıkarılır. Bu dosya, yerel değişkenler, kaynak satır numaraları hakkındaki bilgileri göstermek ve çökme dökümlerinin yığın izlerini yeniden oluşturmak için hata ayıklayıcılar ve ölüm sonrası analiz araçları tarafından kullanılır. Bu nedenle, uygulamanızı App Store'a göndermeden önce sembol dosyasını korumak önemlidir.

CPU profili oluşturma

Xcode Instruments , Yerel AOT uygulamasının CPU örneklerini toplamak için kullanılabilir.

Yığın analizi

Yığın analizi şu anda Yerel AOT ile desteklenmiyor.

Ayrıca bkz.