Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Nativní nasazení kompilace AOT vytvoří aplikaci .NET MAUI na iOSu a Mac Catalystu, která byla předběžně zkompilována do nativního kódu. Nativní AOT provádí statickou analýzu programu, kompletní ořezání aplikace, které agresivně odstraňuje kód, na který se staticky neodkazuje, a generování kódu předem.
Publikování a nasazení nativní aplikace AOT přináší následující výhody:
- Zmenšená velikost balíčku aplikace
- Rychlejší spuštění.
- Rychlejší doba sestavení.
Nativní AOT zavádí omezení používání určitých aspektů modulu runtime .NET a mělo by se používat pouze ve scénářích, ve kterých je důležitá velikost a výkon aplikace. Budete muset přizpůsobit své aplikace požadavkům nativního AOT, což znamená zajistit, aby byly plně optimalizovány a kompatibilní s AOT. Další informace o omezeních Nativního AOT najdete v tématu Omezení Nativního AOT.
Pokud je povolena nativní distribuce AOT, systém sestavení analyzuje váš kód a všechny jeho závislosti, aby ověřil, zda je vhodný k úplné eliminaci nepotřebného kódu a kompilaci AOT. Pokud jsou zjištěny nekompatibility, jsou generována varování o ořezávání a AOT. Jedno varování ohledně ořezávání nebo AOT znamená, že aplikace není kompatibilní s nativním nasazením pomocí AOT a nemusí správně fungovat. Proto při vytváření aplikace pro nativní nasazení prostřednictvím AOT byste měli zkontrolovat a opravit všechna upozornění na ořezávání a AOT. Pokud to neuděláte, může dojít k výjimkám za běhu, protože byl odebrán potřebný kód. Pokud potlačíte upozornění, musíte důkladně otestovat aplikaci nasazenou pomocí AOT, abyste ověřili, že se funkčnost nezměnila oproti neokrájené aplikaci. Další informace naleznete v tématu Úvod do upozornění pro trim a Úvod do upozornění pro AOT.
Poznámka:
Mohou nastat případy, kdy není možné opravit oříznutí a výstrahy AOT, například když se vyskytují u knihoven třetích stran. V takových případech bude nutné aktualizovat knihovny třetích stran, aby byly plně kompatibilní.
Výhody nativního výkonu AOT
Publikování a nasazení nativní aplikace AOT vytvoří aplikaci, která je obvykle až o 2,5x menší a aplikace, která se spouští obvykle až o 2x rychleji. Přesné výhody výkonu jsou ale závislé na několika faktorech, mezi které patří použitá platforma, zařízení, na kterém je aplikace spuštěná, a samotné aplikaci.
Důležité
Následující grafy ukazují typické výhody výkonu nativního nasazení AOT pro aplikaci v dotnet new maui systémech iOS a Mac Catalyst. Přesná data jsou ale závislá na hardwaru a v budoucích verzích se můžou změnit.
Následující graf ukazuje velikost balíčku aplikace pro aplikaci v dotnet new maui systémech iOS a Mac Catalyst v různých modelech nasazení:
Předchozí graf ukazuje, že nativní AOT obvykle vytváří více než 2x menší aplikace pro iOS i Mac Catalyst ve srovnání s výchozím modelem nasazení.
Následující graf ukazuje průměrnou dobu spuštění aplikace na konkrétním dotnet new maui hardwaru pro systémy iOS a Mac Catalyst při nasazení na Mono a Native AOT.
Předchozí graf ukazuje, že nativní AOT má obvykle až 2x rychlejší spouštění na zařízeních s iOSem a 1,2x rychlejší spuštění v systému Mac Catalyst v porovnání s nasazením Mono.
Následující graf ukazuje průměrnou dobu sestavení na konkrétním hardwaru pro aplikaci v dotnet new maui systémech iOS a Mac Catalyst v různých modelech nasazení:
Předchozí graf ukazuje, že nativní AOT má na iOS zařízeních až 2,8krát rychlejší dobu sestavení ve srovnání s výchozím modelem nasazení. Pro Mac Catalyst jsou časy sestavení srovnatelné pro aplikace ARM64 s jedním identifikátorem RID, ale jsou mírně pomalejší pro univerzální aplikace v porovnání s nasazením Mono.
Důležité
V mnoha scénářích nativní AOT vytvoří menší a rychlejší aplikace. V některých scénářích ale nativní AOT nemusí vytvářet menší a rychlejší aplikace. Proto je důležité otestovat a profilovat aplikaci, abyste zjistili výsledek povolení nativního nasazení AOT.
Publikujte nativně pomocí AOT
Nativní model nasazení AOT je aktivován s $(PublishAot) vlastností sestavení a příkazem dotnet publish . Následující příklad ukazuje, jak upravit soubor projektu tak, aby umožňoval nativní nasazení AOT v systémech iOS a Mac Catalyst:
<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>
Nastavení vlastnosti sestavení $(IsAotCompatible) na true pro všechny platformy umožňuje trimování a analyzátory AOT. Tyto analyzátory vám pomohou identifikovat kód, který není kompatibilní s trimováním nebo AOT.
Podmíněné nastavení $(PublishAot) na true pro iOS a Mac Catalyst umožňuje dynamickou analýzu využití kódu během sestavování a kompilaci nativní AOT během publikování. Nativní analýza AOT zahrnuje veškerý kód aplikace a všechny knihovny, na které aplikace závisí.
Upozornění
Vlastnost sestavení $(PublishAot) by neměla být podmíněna konfigurací sestavení. Důvodem je to, že přepínače funkcí oříznutí jsou povolené nebo zakázané na základě hodnoty $(PublishAot) vlastnosti sestavení a stejné funkce by měly být povoleny nebo zakázány ve všech konfiguracích sestavení, aby se váš kód chová stejně. Další informace o ořezávání přepínačů funkcí naleznete v tématu Ořezávání přepínačů funkcí.
Jediným způsobem, jak ověřit, že nativní aplikace AOT funguje správně, je publikovat ji pomocí dotnet publish a ověřit, že neexistují žádná upozornění na oříznutí nebo upozornění AOT vytvořená vaším kódem a jejími závislostmi. Konkrétně dotnet build -t:Publish není ekvivalentem dotnet publish.
Pomocí následujícího dotnet publish příkazu publikujte aplikaci v systémech iOS a Mac Catalyst pomocí nativního nasazení AOT:
# 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
Tip
Abyste mohli odhalit problémy s oříznutím nebo AOT v rané fázi vývojového cyklu, často publikujte aplikace.
Omezení nativního AOT
Nativní AOT zavádí omezení používání určitých aspektů modulu runtime .NET a mělo by se používat pouze ve scénářích, ve kterých je důležitá velikost a výkon aplikace. Bude od vás vyžadováno, abyste své aplikace přizpůsobili požadavkům nativního AOT, což znamená zajistit, že jsou plně trimovatelné a kompatibilní s AOT, a to může vyžadovat hodně práce. Kromě omezení nativního nasazení AOT rozhraní .NET má nativní nasazení AOT pro .NET MAUI další vlastní omezení.
Knihovny třetích stran, na které vaše aplikace závisí, nemusí být kompatibilní s AOT. Jediný způsob, jak zajistit, aby byla knihovna schopná oříznutí a kompatibilní s AOT, je publikovat aplikaci pomocí nasazení nativního AOT a příkazu dotnet publish a zjistit, zda nativní kompilátor AOT vytvoří pro knihovnu nějaká upozornění. Informace o tom, jak zajistit kompatibilitu vlastních knihoven AOT, najdete v tématu Jak nastavit, aby knihovny byly kompatibilní s nativní AOT.
Reflexe a dynamický kód
Nativní nasazení AOT omezuje použití reflexe v kódu a jejích závislostech a může být nezbytné používat poznámky, které umožní nativnímu kompilátoru AOT porozumět vzorům reflexe. Když kompilátor narazí na reflexní vzor, který nelze staticky analyzovat, a proto nelze sestavit aplikaci, vytvoří varování o oříznutí. Nativní AOT vám také brání v používání dynamického kódu v aplikaci. Kompilace System.Linq.Expressions například nebude fungovat podle očekávání a není možné načíst a spouštět sestavení za běhu. Když kompilátor narazí na dynamický vzor, který nemůže předčasně zkompilovat, zobrazí varování AOT.
V aplikaci .NET MAUI to znamená, že:
- Všechny XAML musí být předem zkompilované. Proto se ujistěte, že jste neaktivovali kompilaci XAML a že jsou zkompilovány všechny vazby. Další informace naleznete v tématu Kompilace XAML a Kompilované vazby.
- Všechny výrazy vazby musí místo cesty vazby nastavené na řetězec používat kompilované vazby. Další informace naleznete v tématu Kompilované vazby.
- Implicitní převodní operátory nemusí být volány při přiřazení hodnoty nekompatibilního typu do vlastnosti v XAML, nebo když dvě vlastnosti různých typů používají datovou vazbu. Místo toho byste měli definovat TypeConverter pro svůj typ a připojit ho k typu pomocí TypeConverterAttribute. Pro více informací si přečtěte Jak definovat TypeConverter pro nahrazení implicitního převodního operátoru.
- Xaml za běhu není možné parsovat pomocí LoadFromXaml metody. I když lze zajistit bezpečnost přidáním poznámek ke všem typům, které mohou být načteny za běhu, pomocí atributu
DynamicallyAccessedMembersnebo atributuDynamicDependency, je to velmi náchylné k chybám a nedoporučuje se. - Příjem navigačních dat pomocí QueryPropertyAttribute funkce nebude fungovat. Místo toho byste měli implementovat IQueryAttributable rozhraní u typů, které potřebují přijímat parametry dotazu. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody.
- Vlastnost
SearchHandler.DisplayMemberNamenemusí fungovat. Místo toho byste měli poskytnout ItemTemplate k definování vzhledu SearchHandler výsledků. Další informace najdete v tématu Definování vzhledu položky výsledků hledání. - Přizpůsobení vzhledu uživatelského rozhraní pomocí rozšíření značek XAML
OnPlatformnení možné. Místo toho byste měli použít třídu OnPlatform<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě platformy. - Přizpůsobení vzhledu uživatelského rozhraní pomocí rozšíření značek XAML
OnIdiomnení možné. Místo toho byste měli použít třídu OnIdiom<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě idiomu zařízení.
Důležité
Interpretátor Mono není kompatibilní s nativním AOT nasazením, a proto vlastnosti MSBuild $(UseInterpreter) a $(MtouchInterpreter) nemají při použití nativního AOT žádný vliv. Další informace o interpretu Mono naleznete v tématu Mono interpret v systémech iOS a Mac Catalyst.
Další informace o upozorněních na oříznutí najdete v tématu Úvod do upozornění na oříznutí. Další informace o upozorněních AOT najdete v tématu Úvod k upozorněním AOT.
Přizpůsobení aplikace nativnímu nasazení AOT
Následující kontrolní seznam vám pomůže přizpůsobit aplikaci nativním požadavkům na nasazení AOT:
- Ujistěte se, že je kompilován veškerý XAML:
- Odeberte veškeré
[XamlCompilation(XamlCompilationOptions.Skip)]využití. - Odeberte veškeré
<?xaml-comp compile="false" ?>použití.
- Odeberte veškeré
- Odeberte všechna volání metody LoadFromXaml .
- Ujistěte se, že jsou zkompilovány všechny datové vazby. Další informace naleznete v tématu Kompilované vazby.
- Ujistěte se, že všechny datové vazby XAML jsou opatřeny poznámkami
x:DataType. - Zajistěte, aby všechny datové vazby kódu nahradily všechny vazby založené na řetězcích pomocí lambda.
- Ujistěte se, že všechny datové vazby XAML jsou opatřeny poznámkami
- Nahraďte všechna použití rozšíření značek XAML
OnPlatformimplementací, která používá třídu OnPlatform<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě platformy. - Nahraďte všechna použití rozšíření značek XAML
OnIdiomimplementací, která používá třídu OnIdiom<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě idiomu zařízení. - Nahraďte veškeré
[QueryProperty(...)]použití implementacíIQueryAttributablerozhraní. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody. - Nahraďte všechna použití
SearchHandler.DisplayMemberNameprvkem ItemTemplate. Další informace najdete v tématu Definování vzhledu položky výsledků hledání. - Nahraďte všechny implicitní převodní operátory pro typy používané v XAML za TypeConvertera připojte ho k vašemu typu pomocí .TypeConverterAttribute Pro více informací si přečtěte Jak definovat TypeConverter pro nahrazení implicitního převodního operátoru.
- Při převodu z typu
Ana typB, bude použita buď metodaConvertTou převaděče typů přidruženého kA, nebo metodaConvertFromu převaděče typů přidruženého kB. - Pokud zdrojový i cílový typ mají přidružený převaděč typů, lze použít některý z nich.
- Při převodu z typu
- Zkompilujte všechny regulární výrazy pomocí generátorů zdrojů. Další informace najdete v tématu Generátory zdrojů regulárních výrazů .NET.
- Ujistěte se, že serializace a deserializace JSON používá zdrojový vygenerovaný kontext. Další informace najdete v tématu Minimální rozhraní API a JSON payloady.
- Zkontrolujte a opravte všechna upozornění na oříznutí nebo upozornění AOT. Další informace naleznete v tématu Úvod do upozornění pro trim a Úvod do upozornění pro AOT.
- Důkladně otestujte aplikaci.
Nativní podpora diagnostiky AOT v systémech iOS a Mac Catalyst
Nativní AOT a Mono sdílejí podmnožinu možností diagnostiky a instrumentace. Vzhledem k rozsahu diagnostických nástrojů Mono může být užitečné diagnostikovat a ladit problémy v rámci Mono místo nativní AOT. Aplikace, které jsou optimalizovány a kompatibilní s AOT (Ahead of Time), by neměly mít rozdíly v chování, takže šetření se často vztahují na obě prostředí běhu aplikace.
Následující tabulka ukazuje podporu diagnostiky s nativní AOT na systémech iOS a Mac Catalyst:
| Funkce | Plně podporovaná | Částečně podporováno | Nepodporováno |
|---|---|---|---|
| Pozorovatelnost a telemetrie | Částečně podporovaná | ||
| Diagnostika v době vývoje | Plně podporovaná | ||
| Nativní ladění | Částečně podporovaná | ||
| Profilace procesoru | Částečně podporovaná | ||
| Analýza haldy | Nepodporováno |
Následující části obsahují další informace o této podpoře diagnostiky.
Pozorovatelnost a telemetrie
Trasování aplikací .NET MAUI na mobilních platformách je povolené prostřednictvím dotnet-dsrouter , který spojuje diagnostické nástroje s aplikacemi .NET běžícími v systémech iOS a Mac Catalyst přes PROTOKOL TCP/IP. Nativní AOT ale v současné době není kompatibilní s tímto scénářem, protože nepodporuje komponenty EventPipe/DiagnosticServer vytvořené se zásobníkem TCP/IP. Pozorovatelnost je stále dosažitelná explicitně v kódu.
Diagnostika v době vývoje
Nástroje .NET CLI poskytují samostatné příkazy pro build a publish.
dotnet build (nebo Start Debugging (F5) v editoru Visual Studio Code) ve výchozím nastavení používá mono při sestavování nebo spouštění aplikací .NET MAUI pro iOS nebo Mac Catalyst. Jenom dotnet publish vytvoří nativní aplikaci AOT, pokud je tento model nasazení povolen v souboru projektu .
Ne všechny diagnostické nástroje budou bez problémů fungovat s publikovanými nativními aplikacemi AOT. Všechny aplikace, které jsou kompatibilní s ořezáváním a AOT (to znamená, že nevygenerují žádná varování o ořezávání a AOT při sestavení), by ale neměly mít rozdíly v chování mezi Mono a nativní AOT. Proto jsou všechny diagnostické nástroje pro vývoj .NET, jako je například Hot Reload, stále k dispozici vývojářům během vývojového cyklu mobilních aplikací.
Tip
Aplikaci byste měli vyvíjet, ladit a testovat jako obvykle a publikovat finální aplikaci pomocí nativní AOT jako jeden z posledních kroků.
Nativní ladění
Při spuštění aplikace .NET MAUI iOS nebo Mac Catalyst během vývoje běží ve výchozím nastavení na Mono. Pokud je však v souboru projektu povolené nativní nasazení AOT, očekává se, že chování bude stejné pro Mono a Native AOT, pokud aplikace nevyvolá žádná upozornění na ořezání ani AOT v době sestavení. Za předpokladu, že vaše aplikace splňuje tento požadavek, můžete k vývoji a testování použít standardní ladicí modul spravovaný editorem Visual Studio Code.
Po publikování se z nativních aplikací AOT stanou skutečné nativní binární soubory, takže na nich spravovaný ladicí program nebude fungovat. Nativní kompilátor AOT však generuje plně nativní spustitelné soubory, které můžete ladit pomocí lldb. Ladění aplikace Mac Catalyst s lldb je jednoduché, protože je spuštěno na stejném systému. Ladění aplikací NativeAOT pro iOS ale vyžaduje další úsilí.
Ladění aplikací .NET MAUI pro iOS pomocí nativní AOT
Aplikace .NET MAUI pro iOS, které jsou kompatibilní s nativní AOT a které jsou správně nakonfigurované a publikované s tímto modelem nasazení, je možné ladit následujícím způsobem:
Publikujte svou aplikaci s cílením Native AOT
ios-arm64a poznamenejte si následující informace:- Název aplikace (odkazovaný níže jako
<app-name>). - Identifikátor svazku (odkazovaný níže jako
<bundle-identifier>). - Cesta k souboru .ipa publikované aplikace (na který se dále odkazuje jako na
<path-to-ipa>).
- Název aplikace (odkazovaný níže jako
Získejte ID fyzického zařízení (na které se odkazuje níže
<device-identifier>:xcrun devicectl list devicesNainstalujte aplikaci na fyzické zařízení:
xcrun devicectl device install app --device <device-identifier> <path-to-ipa>Spusťte aplikaci na fyzickém zařízení:
xcrun devicectl device process launch --device <device-identifier> --start-stopped <bundle-identifier>Otevřete
lldbfyzické zařízení a připojte se k němu:(lldb) device select <device-identifier> (lldb) device process attach -n <app-name>
Po úspěšném dokončení těchto kroků budete moci spustit ladění nativní AOT .NET MAUI iOS aplikace pomocí lldb.
Důležitost souboru symbolů
Ve výchozím nastavení jsou symboly ladění odebrány z binárního souboru aplikace a uloženy do souboru .dSYM. Tento soubor používají ladicí programy a nástroje pro analýzu po mortem k zobrazení informací o místních proměnných, zdrojových řádcích a k opětovnému vytvoření trasování zásobníku výpisů stavu systému. Proto je důležité před odesláním aplikace do App Storu zachovat soubor symbolů.
Profilace procesoru
Nástroje Xcode lze použít ke shromažďování vzorků procesoru nativní aplikace AOT.
Analýza haldy
Analýza haldy v nativní AOT není v současné době podporována.