Aracılığıyla paylaş


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

Yerel AOT dağıtımı, iOS ve Mac Catalyst üzerinde yerel koda derlenmiş bir .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) uygulaması oluşturur. Yerel AOT statik program analizi, uygulamanızın tam kırpması gerçekleştirir ve statik olarak başvurulmayan kodu kaldırmada agresiftir ve önceden kod oluşturma işlemi gerçekleştirir.

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 uyarlamanız gerekir; bu da bunların tamamen kırpıldığından ve AOT ile uyumlu olduğundan emin olmanız anlamına gelir. Yerel AOT sınırlamaları hakkında daha fazla bilgi için bkz . Yerel AOT sınırlamaları.

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, kırpma ve AOT uyarıları üretilir. Tek bir kırpma veya AOT uyarısı, uygulamanın Yerel AOT dağıtımıyla uyumlu olmadığı ve düzgün çalışmayabileceği anlamına gelir. Bu nedenle, Yerel AOT dağıtımı için bir uygulama oluştururken 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ı gizlerseniz, AOT dağıtılan uygulamanın, işlevselliğin denenmeyen uygulamadan değişmediğini doğrulamak için kapsamlı bir şekilde test edilmesi gerekir. Daha fazla bilgi için bkz . Kırpma uyarılarına giriş ve AOT uyarılarına giriş.

Not

Kırpma ve AOT uyarılarını düzeltmenin mümkün olmadığı durumlar (örneğin, üçüncü taraf kitaplıklar için gerçekleştiği durumlar) olabilir. 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ı etkinleştirmenin sonucunu belirlemek için uygulamanızı test etmek ve profili oluşturmak önemlidir.

Yerel AOT kullanarak yayımlama

Yerel AOT dağıtım modeli derleme özelliği ve $(PublishAot) komutuyla dotnet publish 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) tüm platformlar için olarak trueayarlanması, 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 koşullu ayar $(PublishAot)true, derleme sırasında dinamik kod kullanım analizini ve yayımlama sırasında Yerel AOT derlemesini 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 bkz . Özellik anahtarlarını kırpma.

Yerel AOT uygulamasının düzgün çalıştığını doğrulamanın tek yolu kullanarak uygulamayı yayımlamak dotnet publish ve kodunuz ve bağımlılıkları tarafından üretilen kırpma veya AOT uyarısı olmadığını 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. Kitaplığın kırpma ve AOT uyumlu olmasını sağlamanın tek yolu Yerel AOT dağıtımı ve dotnet publish komutunu kullanarak uygulamanızı yayımlamak ve Yerel AOT derleyicisinin kitaplık için herhangi bir uyarı üretip üretmediğini görmektir. Kendi kitaplıklarınızı AOT ile uyumlu hale getirme hakkında bilgi için bkz . Kitaplıkları yerel AOT ile uyumlu hale getirme.

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 derleyemediğini 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ı.

Kırpma uyarıları hakkında daha fazla bilgi için bkz . Kırpma uyarılarına giriş. 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 ile x:DataTypeek açıklamalı 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ımı ile ItemTemplatedeğ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 TypeConverterile değiştirin ve kullanarak TypeConverterAttributebunu türünüzle ekleyin. Daha fazla bilgi için bkz . Örtük dönüştürme işlecini değiştirmek için TypeConverter tanımlama.
    • türünden türüne ABdönüştürürken, ConvertTo ile A ilişkilendirilmiş bir tür dönüştürücüsü üzerindeki yöntem veya ConvertFrom ile B ilişkilendirilmiş bir tür dönüştürücüsü üzerindeki yöntem 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ı gözden geçirin ve düzeltin. Daha fazla bilgi için bkz . Kırpma uyarılarına giriş ve AOT uyarılarına giriş.
  • 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 hatalarını 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 zamanı tanılaması 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 zamanı tanılaması

.NET CLI araçları ve buildiçin publish 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.

Yayımlanan Yerel AOT uygulamalarıyla tüm tanılama araçları 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, Çalışırken Yeniden Yükleme gibi tüm .NET geliştirme zamanı tanılama araçları mobil uygulama geliştirme döngüsü sırasında geliştiriciler tarafından 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 Yerel AOT dağıtımı etkinleştirilirse, uygulama derleme zamanında kırpma ve AOT uyarıları üretmediğinde Mono ile Yerel 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ımladıktan sonra Yerel AOT uygulamaları gerçek yerel ikili dosyalardır ve bu nedenle yönetilen hata ayıklayıcı bunlar üzerinde çalışmaz. Ancak, Yerel AOT derleyicisi ile lldbhata ayıklayabileceğiniz tamamen yerel yürütülebilir dosyalar oluşturur. Ile bir Mac Catalyst uygulamasında lldb hata ayıklama işlemi, aynı sistemde yürütülürken doğrudan yapılı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 olarak başvurulur <app-name>).
    • Paket tanımlayıcısı (aşağıda olarak başvurulur <bundle-identifier>).
    • Yayımlanan uygulamanın arşiv .ipa dosyasının yolu (aşağıda olarak başvurulur <path-to-ipa>).
  2. Fiziksel cihaz kimliğinizi alın (aşağıda olarak başvurulur <device-identifier>):

    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 ile Yerel AOT .NET MAUI iOS uygulamanızda lldbhata 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 kilitlenme dökümlerinin yığın izlemelerini yeniden oluşturmak için hata ayıklayıcılar ve mortem sonrası çözümleme 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.