Nativní nasazení AOT v systémech iOS a Mac Catalyst
Nativní nasazení AOT vytvoří aplikaci .NET Pro víceplatformní aplikace (.NET MAUI) v iOSu a Mac Catalystu, která byla předem zkompilována do nativního kódu. Nativní AOT provádí statickou analýzu programu, úplné oříznutí aplikace, což je agresivní při odebírání kódu, na který se staticky neodkazuje, a před generováním 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 aplikace nativním požadavkům AOT, což znamená, že jsou plně oříznuty a kompatibilní s AOT. Další informace o omezeních nativní AOT najdete v tématu Nativní omezení AOT.
Pokud je povolené nativní nasazení AOT, systém sestavení analyzuje váš kód a všechny jeho závislosti a ověří, jestli je vhodný pro úplné oříznutí a kompilaci AOT. Pokud jsou zjištěny nekompatibility, vygenerují se upozornění na oříznutí a AOT. Jedno oříznutí nebo upozornění AOT znamená, že aplikace není kompatibilní s nativním nasazením AOT a že nemusí správně fungovat. Proto při vytváření aplikace pro nativní nasazení AOT byste měli zkontrolovat a opravit všechna upozornění oříznutí 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í nasazené aplikace AOT, musíte důkladně otestovat, abyste ověřili, že se funkce nezměnily z nepotřebné aplikace. Další informace naleznete v tématu Úvod k oříznutí upozornění a Úvod do upozornění AOT.
Poznámka:
Můžou nastat případy, kdy není možné opravit oříznutí a upozornění AOT, například když se objeví 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í konkrétního dotnet new maui
hardwaru pro aplikaci v systémech iOS a Mac Catalyst v mono a nativním nasazení 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 zařízeních s iOSem až 2,8krát rychlejší sestavení než výchozí model 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.
Publikování pomocí nativní AOT
Nativní model nasazení AOT je povolený 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>
$(IsAotCompatible)
Nastavení vlastnosti sestavení na true
, pro všechny platformy, umožňuje oříznutí a analyzátory AOT. Tyto analyzátory vám pomůžou identifikovat kód, který není kompatibilní s oříznutím nebo AOT.
Podmíněné nastavení $(PublishAot)
pro true
iOS a Mac Catalyst umožňuje dynamickou analýzu využití kódu během sestavování a nativní kompilace AOT během publikování. Nativní analýza AOT zahrnuje veškerý kód aplikace a všechny knihovny, na které aplikace závisí.
Upozorňující
$(PublishAot)
Vlastnost sestavení 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
Publikování aplikací často kvůli zjišťování problémů s oříznutím nebo AOT v rané fázi životního cyklu vývoje
Nativní omezení 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 vyžadovat přizpůsobení aplikací nativním požadavkům AOT, což znamená, že jsou plně oříznuté a kompatibilní s AOT, což může vyžadovat spoustu práce. Kromě omezení rozhraní .NET pro nativní nasazení AOT má nativní nasazení AOT pro .NET MAUI další 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 knihovna ořízla a kompatibilní SOT, je publikovat aplikaci pomocí nativního dotnet publish
nasazení AOT a příkazu a zjistit, jestli nativní kompilátor AOT vytvoří pro knihovnu 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 vzor odrazu, nemůže staticky analyzovat, a proto nemůže sestavit aplikaci, vytvoří upozornění 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, nemůže předem provést kompilaci, vytvoří upozorně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ána při přiřazování hodnoty nekompatibilního typu vlastnosti v XAML nebo když dvě vlastnosti různých typů používají datovou vazbu. Místo toho byste měli definovat TypeConverter typ a připojit ho k typu pomocí .TypeConverterAttribute Další informace naleznete v tématu Definice TypeConverter nahradit implicitní převodní operátor.
- Xaml za běhu není možné parsovat pomocí LoadFromXaml metody. I když je to možné zabezpečit oříznutím poznámek všech typů, které je možné načíst za běhu pomocí atributu
DynamicallyAccessedMembers
nebo 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.DisplayMemberName
nemusí fungovat. Místo toho byste měli poskytnout ItemTemplate definici 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
OnPlatform
není 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 s využitím
OnIdiom
není 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 Mono není kompatibilní s nativním nasazením AOT, a proto $(UseInterpreter)
vlastnosti MSBuild $(MtouchInterpreter)
nemají při použití nativní 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 oříznutí najdete v tématu Úvod k oříznutí upozornění. 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" ?>
využ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
OnPlatform
implementací, 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ší použití rozšíření značek XAML
OnIdiom
implementací, která využívá třídu OnIdiom<T>. Další informace naleznete v tématu Přizpůsobení vzhledu uživatelského rozhraní na základě typu zařízení. - Nahraďte veškeré
[QueryProperty(...)]
použití implementacíIQueryAttributable
rozhraní. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody. - Nahraďte všechna
SearchHandler.DisplayMemberName
použití sadou 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 Další informace naleznete v tématu Definice TypeConverter nahradit implicitní převodní operátor.
- Při převodu z typu na typ
A
B
, buďConvertTo
metoda u převaděče typů přidruženýA
k bude použita, neboConvertFrom
metoda u převaděče typů asociované sB
bude použita. - 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 na typ
- 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 datové části JSON.
- Zkontrolujte a opravte všechna upozornění na oříznutí nebo upozornění AOT. Další informace naleznete v tématu Úvod k oříznutí upozornění a Úvod do upozornění AOT.
- Důkladně otestujte aplikaci.
Nativní podpora diagnostiky AOT v systémech iOS a Mac Catalyst
Nativní funkce 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 oříznuty a kompatibilní s AOT, by neměly mít rozdíly v chování, takže šetření se často vztahují na oba moduly runtime.
Následující tabulka ukazuje podporu diagnostiky nativní AOT v 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. Pokud je dotnet publish
projektu povolený, vytvoří se pouze nativní aplikace AOT.
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 AOT (to znamená, že ty, které nevygenerují žádné oříznutí a upozornění AOT v době 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 v době vývoje .NET, jako je například Opětovné načítání za provozu, stále dostupné 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é mezi Mono a Native AOT, pokud aplikace nevytvoří žádné oříznutí a upozornění 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í jsou nativní binární soubory nativních aplikací AOT, 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 je lldb
rovnou vpřed, protože se provádí ve 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 aplikaci s nativním cílením
ios-arm64
AOT a 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ý odkazujeme níže).
<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 devices
Nainstalujte 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
lldb
fyzické 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í aplikace AOT .NET MAUI iOS pomocí lldb
aplikace .
Důležitost souboru symbolů
Ve výchozím nastavení jsou symboly ladění odebrány z binárního souboru aplikace 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 se v současné době nepodporuje v nativní AOT.