Natív AOT-üzembe helyezés iOS és Mac Catalyst rendszeren
A natív AOT-telepítési folyamat egy olyan .NET többplatformos alkalmazás felhasználói felületet (.NET MAUI) hoz létre iOS-en és Mac Catalyston, amely előzetesen natív kódra lett fordítva. A natív AOT statikus programelemzést, az alkalmazás teljes csökkentését végzi, ami agresszív a nem statikusan hivatkozott kódok eltávolításában és az előzetes kódgenerálásban.
Natív AOT-alkalmazás közzététele és üzembe helyezése a következő előnyökkel jár:
- Az alkalmazáscsomag méretének csökkentése.
- Gyorsabb indítási idő.
- Gyorsabb létrehozási idő.
A natív AOT korlátozásokat vezet be a .NET-futtatókörnyezet bizonyos aspektusainak használatára vonatkozóan, és csak olyan helyzetekben használható, ahol az alkalmazás mérete és teljesítménye fontos. Ehhez az alkalmazásokat hozzá kell igazítania a natív AOT-követelményekhez, ami azt jelenti, hogy biztosítani kell, hogy teljes mértékben támogassák a méretcsökkentést és AOT-kompatibilisek legyenek. A natív AOT-korlátozásokról további információt natív AOT-korlátozásokcímű témakörben talál.
Ha a natív AOT-telepítés engedélyezve van, a buildrendszer elemzi a kódot és annak minden függőségét, hogy ellenőrizze, hogy alkalmas-e a teljes vágásra és az AOT-fordításra. Inkompatibilitások észlelése esetén a rendszer vágási és AOT-figyelmeztetéseket hoz létre. Egyetlen vágási vagy AOT-figyelmeztetés azt jelenti, hogy az alkalmazás nem kompatibilis a natív AOT-telepítéssel, és lehet, hogy nem működik megfelelően. Ezért a natív AOT-telepítéshez készült alkalmazás létrehozásakor érdemes áttekinteni és kijavítani az összes vágási és AOT-figyelmeztetést. Ennek elmulasztása futásidőben kivételeket eredményezhet, mivel a szükséges kódot el lehetett volna távolítani. Ha letiltja a figyelmeztetéseket, az üzembe helyezett AOT-alkalmazást alaposan tesztelni kell annak ellenőrzéséhez, hogy a funkció nem változott-e a nem ellenőrzött alkalmazásról. További információért lásd: Bevezetés a metszési figyelmeztetésekhez és Bevezetés az AOT-figyelmeztetésekhez.
Jegyzet
Előfordulhat, hogy a vágási és AOT-figyelmeztetések javítása nem lehetséges, például külső kódtárak esetében. Ilyen esetekben a külső kódtárakat frissíteni kell, hogy teljes mértékben kompatibilisek legyenek.
Natív AOT-teljesítménybeli előnyök
A Natív AOT-alkalmazások közzététele és üzembe helyezése általában akár 2,5-szer kisebb alkalmazásokat és általában akár 2-szer gyorsabban elinduló alkalmazást is eredményez. A pontos teljesítménybeli előnyök azonban több tényezőtől függenek, például a használt platformtól, az eszköztől, amelyen az alkalmazás fut, és magát az alkalmazást is.
Fontos
Az alábbi diagramok az iOS-en és Mac Catalysten futó dotnet new maui
alkalmazások natív AOT-telepítésének jellemző teljesítménybeli előnyeit mutatják be. A pontos adatok azonban hardverfüggőek, és a jövőbeli kiadásokban változhatnak.
Az alábbi diagram egy dotnet new maui
-alkalmazás alkalmazáscsomagjának méretét mutatja be iOS-en és Mac Catalyston különböző üzemi modelleken:
Az előző diagram azt mutatja, hogy a Natív AOT általában több mint 2x kisebb alkalmazásokat állít elő iOS és Mac Catalyst rendszerhez az alapértelmezett üzemi modellhez képest.
Az alábbi diagram az iOS-en és Mac Catalyston futó dotnet new maui
-alkalmazások átlagos indítási idejét mutatja be egy adott hardveren mono- és natív AOT-környezetben:
Az előző diagram azt mutatja, hogy a natív AOT általában legfeljebb 2x gyorsabb indítási idővel rendelkezik iOS-eszközökön, és 1,2-szer gyorsabb indítási időt a Mac Catalyston, mint a Mono üzembe helyezés.
Az alábbi diagram az iOS- és Mac Catalyst-alapú dotnet new maui
-alkalmazások átlagos buildelési idejét mutatja be a különböző üzemi modelleken:
Az előző diagram azt mutatja, hogy a natív AOT általában legfeljebb 2,8-szoros gyorsabb buildelési idővel rendelkezik iOS-eszközökön az alapértelmezett üzemi modellhez képest. A Mac Catalyst esetében a buildelési idők összehasonlíthatók az arm64-alapú önálló RID-alkalmazásokhoz, de az univerzális alkalmazások esetében kissé lassabbak a Mono-telepítéshez képest.
Fontos
A natív AOT számos esetben kisebb és gyorsabb alkalmazásokat fog létrehozni. Bizonyos esetekben azonban előfordulhat, hogy a natív AOT nem hoz létre kisebb és gyorsabb alkalmazásokat. Ezért fontos, hogy tesztelje és profilozza az alkalmazást a natív AOT-telepítés engedélyezésének eredményének meghatározásához.
Közzététel natív AOT használatával
A natív AOT üzemi modell engedélyezve van a $(PublishAot)
buildtulajdonság és a dotnet publish
parancs használatával. Az alábbi példa bemutatja, hogyan módosíthat egy projektfájlt a natív AOT-telepítés engedélyezéséhez iOS és Mac Catalyst rendszeren:
<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>
A $(IsAotCompatible)
build tulajdonság true
beállítása minden platformon aktiválja a csökkentést és az AOT-elemzőket. Ezek az elemzők segítenek azonosítani a vágással vagy az AOT-val nem kompatibilis kódot.
A $(PublishAot)
feltételes beállítása true
, iOS és Mac Catalyst esetén, lehetővé teszi a dinamikus kódhasználat elemzését az építéskor, valamint a natív AOT-fordítást a közzététel idején. A natív AOT-elemzés tartalmazza az alkalmazás összes kódját és az alkalmazástól függő kódtárakat.
Figyelmeztetés
A $(PublishAot)
build tulajdonság nem függhet a buildkonfigurációtól. Ennek az az oka, hogy a vágási funkciók kapcsolói a $(PublishAot)
buildtulajdonság értéke alapján vannak engedélyezve vagy letiltva, és minden buildkonfigurációban engedélyezni vagy letiltani kell ugyanazokat a funkciókat, hogy a kód azonos módon viselkedjen. A funkciókapcsolók vágásáról további információt a A funkciókapcsolók vágásacímű témakörben talál.
A natív AOT-alkalmazások megfelelő működésének ellenőrzéséhez csak úgy lehet azt ellenőrizni, ha dotnet publish
használatával közzéteszik, és ellenőrzik, hogy a kód és a függőségei nem okoznak-e vágási vagy AOT-figyelmeztetéseket. A dotnet build -t:Publish
nem egyenértékű dotnet publish
.
Az alábbi dotnet publish
paranccsal teheti közzé alkalmazását iOS és Mac Catalyst rendszeren natív AOT-telepítéssel:
# 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
Borravaló
Gyakran közzéteheti az alkalmazásokat a vágási vagy AOT-problémák felderítéséhez a fejlesztési életciklus korai szakaszában.
Natív AOT-korlátozások
A natív AOT korlátozásokat vezet be a .NET-futtatókörnyezet bizonyos aspektusainak használatára vonatkozóan, és csak olyan helyzetekben használható, ahol az alkalmazás mérete és teljesítménye fontos. Ehhez hozzá kell igazítania az alkalmazásokat a natív AOT-követelményekhez, ami azt jelenti, hogy az alkalmazások teljes mértékben levághatók és AOT-kompatibilisek, és ez sok munkát igényelhet. A natív AOT-telepítés
Előfordulhat, hogy az alkalmazások külső kódtárai nem kompatibilisek az AOT-sal. A kódtárak kivágásának és az AOT-kompatibilisségének egyetlen módja az alkalmazás natív AOT-telepítéssel és a dotnet publish
paranccsal való közzététele, valamint annak ellenőrzése, hogy a natív AOT-fordító figyelmeztetéseket állít-e elő a kódtárhoz. További információért a saját könyvtárak natív AOT-kompatibilissé tételéről lásd: Hogyan tegyük a könyvtárakat kompatibilissé a natív AOT-tal?.
Tükröződés és dinamikus kód
A natív AOT-üzembe helyezés korlátozza a kódban és annak függőségeiben a tükröződés használatát, és szükség lehet széljegyzetek használatára, hogy segítsen a natív AOT-fordítónak megérteni a tükröződési mintákat. Amikor a fordító tükröződési mintával találkozik, nem tudja statikusan elemezni, ezért nem tudja létrehozni az alkalmazást, vágási figyelmeztetéseket hoz létre. A natív AOT azt is megakadályozza, hogy dinamikus kódot használjon az alkalmazásban. Például, a System.Linq.Expressions fordítása nem működik a vártnak megfelelően, és futásidőben nem lehet assembly-ket betölteni és futtatni. Ha a fordító olyan dinamikus mintával találkozik, amely nem tud előre lefordítani, AOT-figyelmeztetést fog generálni.
A .NET MAUI alkalmazásban ez a következőt jelenti:
- Minden XAML-t előzetesen le kell fordítani. Ezért győződjön meg arról, hogy nem tiltotta le az XAML-fordítást, és hogy az összes kötés lefordítva van. További információ: XAML fordítási és Lefordított kötések.
- Minden kötési kifejezésnek lefordított kötéseket kell használnia, nem pedig egy sztringre beállított kötési útvonalat. További információ: Összeállított kötések.
- Előfordulhat, hogy az implicit konverziós operátorok nem hívhatók meg, ha inkompatibilis típusú értéket rendelnek egy XAML-tulajdonsághoz, vagy ha két különböző típusú tulajdonság adatkötést használ. Ehelyett meg kell adnia egy TypeConverter-t a típushoz, és a TypeConverterAttributehasználatával csatolnia kell a típushoz. További információért lásd: Hogyan definiáljunk egy TypeConverter-t az implicit konverziós operátorok kezeléséhez.
- Az XAML futásidőben nem elemezhető a LoadFromXaml metódussal. Bár ez biztonságossá tehető az összes olyan típus megjegyzésével, amely betölthető lehet futásidőben a
DynamicallyAccessedMembers
attribútummal vagy aDynamicDependency
attribútummal, ez nagyon hibás lehetőségekkel jár, és nem ajánlott. - A QueryPropertyAttribute számú eszközzel a navigációs adatok fogadása nem fog működni. Ehelyett a IQueryAttributable felületet olyan típusokra kell implementálnia, amelyeknek el kell fogadniuk a lekérdezési paramétereket. További információ: Navigációs adatok feldolgozása egyetlen metódussal.
- Előfordulhat, hogy a
SearchHandler.DisplayMemberName
tulajdonság nem működik. Ehelyett meg kell adnia egy ItemTemplate adattípust a SearchHandler eredmények megjelenésének meghatározásához. További információ: Keresési eredmények elem megjelenésének meghatározása. - A felhasználói felület megjelenésének testreszabása az
OnPlatform
XAML jelölőbővítménnyel nem lehetséges. Ehelyett a OnPlatform<T> osztályt kell használnia. További információ: Felhasználói felület megjelenésének testreszabása a platformalapján. - A felhasználói felület megjelenésének testreszabása az
OnIdiom
XAML jelölőbővítménnyel nem lehetséges. Ehelyett a OnIdiom<T> osztályt kell használnia. További információért lásd: Felhasználói felület megjelenésének testreszabása az eszköz típusaalapján.
Fontos
A Mono-értelmező nem kompatibilis a natív AOT-telepítéssel, ezért az MSBuild $(UseInterpreter)
és $(MtouchInterpreter)
tulajdonságainak nincs hatása a natív AOT használatakor. További információkért a Mono értelmezőről, lásd: Mono értelmező iOS-on és Mac Catalyst-on.
További információ a vágási figyelmeztetésekről a vágási figyelmeztetések bemutatásarészben található. További információ az AOT-figyelmeztetésekről: lásd Bevezetés az AOT-figyelmeztetésekbe.
Alkalmazás adaptálása natív AOT-üzembe helyezéshez
Az alábbi ellenőrzőlista segít az alkalmazás natív AOT-telepítési követelményekhez való igazításában:
- Győződjön meg arról, hogy az összes XAML lefordítva van:
- Távolítsa el az összes
[XamlCompilation(XamlCompilationOptions.Skip)]
használatot. - Távolítsa el az összes
<?xaml-comp compile="false" ?>
használatot.
- Távolítsa el az összes
- Távolítsa el a LoadFromXaml metódus összes hívását.
- Győződjön meg arról, hogy az összes adatkötés össze van állítva. További információ: Kompilált kötés.
- Győződjön meg arról, hogy az összes XAML-adatkötés jegyzetelve legyen a(z)
x:DataType
-al. - Győződjön meg arról, hogy minden kódadat-kötés lecseréli az összes sztringalapú kötést lambdaalapú kötésekre.
- Győződjön meg arról, hogy az összes XAML-adatkötés jegyzetelve legyen a(z)
- Cserélje le az összes
OnPlatform
XAML-jelölőbővítmény használatát a OnPlatform<T> osztályt használó implementációra. További információ: Felhasználói felület megjelenésének testreszabása a platformalapján. - Cserélje le az összes
OnIdiom
XAML-jelölőbővítmény használatát a OnIdiom<T> osztályt használó implementációra. További információkért lásd: A felhasználói felület megjelenésének testreszabása az eszköz típusának megfelelően. - Cserélje le az összes
[QueryProperty(...)]
használatot aIQueryAttributable
felület implementációjára. További információ: Navigációs adatok feldolgozása egyetlen metódussal. - Cserélje le minden
SearchHandler.DisplayMemberName
használatot ItemTemplate-re. További információ: Keresési eredmények elem megjelenésének meghatározása. - Cserélje le az XAML-ben használt összes implicit konverziós operátort egy TypeConverter-ra, és a TypeConverterAttributehasználatával csatolja a típusához. További információért tekintse meg a TypeConverter definícióját az implicit konverziós operátorhelyettesítésére.
- Amikor
A
típusrólB
típusra konvertálja, aA
társított típuskonverterConvertTo
metódusát fogja használni, vagy aB
társított típuskonverterConvertFrom
metódusát fogja használni. - Ha a forrás- és céltípusok is rendelkeznek társított típuskonverterrel, bármelyik használható.
- Amikor
- Az összes reguláris kifejezés fordítása forrásgenerátorokkal. További információ: .NET reguláris kifejezésforrás-generátorok.
- Győződjön meg arról, hogy a JSON szerializálása és deszerializálása forrás által létrehozott környezetet használ. További információ: Minimális API-k és JSON adatok.
- Vizsgálja át az esetleges vágási vagy AOT-figyelmeztetéseket, és javítsa ki azokat. További információért lásd: Bevezetés a vágási figyelmeztetésekbe és Bevezetés az AOT-figyelmeztetésekbe.
- Alaposan tesztelje az alkalmazást.
Natív AOT diagnosztikai támogatás iOS és Mac Catalyst rendszeren
A natív AOT és a Mono a diagnosztikai és műszeres ellenőrzési lehetőségek közös részhalmazát birtokolják. A Mono diagnosztikai eszközeinek köszönhetően előnyös lehet a problémák diagnosztizálása és hibakeresése a Monoban a natív AOT helyett. Az optimalizált és AOT-kompatibilis alkalmazásoknak nem szabad viselkedésbeli különbségeiknek lenniük, ezért a vizsgálatok gyakran mindkét futtatókörnyezetre vonatkoznak.
Az alábbi táblázat az iOS és Mac Catalyst natív AOT-beli diagnosztikai támogatását mutatja be:
Funkció | Teljes mértékben támogatott | Részben támogatott | Nem támogatott |
---|---|---|---|
Megfigyelhetőség és telemetria | ✔️ részben támogatott | ||
Diagnosztikák fejlesztési időben | ✔️ Teljes mértékben támogatott | ||
natív hibakeresés | ✔️ részben támogatott | ||
CPU-profilozás | ✔️ részben támogatott | ||
halom elemzés | Nem támogatott |
A következő szakaszok további információkat nyújtanak a diagnosztikai támogatásról.
Megfigyelhetőség és telemetria
A .NET MAUI-alkalmazások mobilplatformokon való nyomon követése dotnet-dsrouter keresztül érhető el, amely tcp/IP-en keresztül csatlakoztatja a diagnosztikai eszközöket az iOS-en és Mac Catalyston futó .NET-alkalmazásokkal. A natív AOT azonban jelenleg nem kompatibilis ezzel a forgatókönyvvel, mivel nem támogatja a TCP/IP-veremhez készült EventPipe/DiagnosticServer-összetevőket. A megfigyelhetőség továbbra is elérhető kifejezetten a kódban.
Fejlesztési idő diagnosztikái
A .NET CLI eszközök külön parancsokat biztosítanak build
és publish
számára.
dotnet build
(vagy a Visual Studio Code-ban Start Debugging (F5)
) alapértelmezés szerint a Mono-t használja .NET MAUI iOS- vagy Mac Catalyst-alkalmazások létrehozásakor vagy indításakor. Csak dotnet publish
fog natív AOT-alkalmazást létrehozni, ha ez az üzemi modell engedélyezve van a projektfájlban.
Nem minden diagnosztikai eszköz fog zökkenőmentesen működni a közzétett Natív AOT-alkalmazásokkal. Azonban az összes levágott és AOT-kompatibilis alkalmazásnak (vagyis azoknak, amelyek nem hoznak létre vágást és AOT-figyelmeztetéseket a buildeléskor) nem kell viselkedésbeli különbségekkel rendelkezniük a Mono és a Natív AOT között. Ezért a mobilalkalmazás-fejlesztési ciklus során az összes .NET fejlesztési idő diagnosztikai eszköz, például a Hot Reload továbbra is elérhető a fejlesztők számára.
Borravaló
A szokásos módon kell fejlesztenie, hibakeresést végeznie és tesztelnie kell az alkalmazást, és az utolsó lépések egyikeként közzé kell tennie a végleges alkalmazást a Natív AOT használatával.
Natív hibakeresés
Amikor a fejlesztés során futtatja a .NET MAUI iOS- vagy Mac Catalyst-alkalmazást, az alapértelmezés szerint Mono-n fut. Ha azonban a natív AOT-telepítés engedélyezve van a projektfájlban, a viselkedés várhatóan megegyezik a Mono és a Natív AOT között, ha az alkalmazás nem hoz létre vágási és AOT-figyelmeztetéseket a létrehozáskor. Feltéve, hogy az alkalmazás megfelel ennek a követelménynek, a standard Visual Studio Code által felügyelt hibakeresési motort használhatja a fejlesztéshez és teszteléshez,
A közzététel után a natív AOT-alkalmazások valódi natív bináris fájlok, így a felügyelt hibakereső nem fog rajtuk működni. A natív AOT fordítóprogram azonban teljesen natív végrehajtható fájlokat hoz létre, amelyeket hibakereséshez használhat lldb
. A Mac Catalyst-alkalmazás lldb
hibakeresése egyszerű, mivel ugyanazon a rendszeren fut. A NativeAOT iOS-alkalmazások hibakeresése azonban további erőfeszítést igényel.
.NET MAUI iOS-alkalmazások hibakeresése natív AOT használatával
A natív AOT-kompatibilis, és az ezzel az üzembe helyezési modellel megfelelően konfigurált és közzétett .NET MAUI iOS-alkalmazások az alábbiak szerint hibakeresést végezhetnek:
Tegye közzé alkalmazását natív AOT célozva
ios-arm64
-val, és jegyezze fel a következő információkat:- Alkalmazás neve (az alábbiakban
<app-name>
). - Csomagazonosító (az alábbiakban
<bundle-identifier>
). - A közzétett alkalmazás archívumának elérési útja az alábbiakban
<path-to-ipa>
-ként hivatkozott .ipa fájlhoz.
- Alkalmazás neve (az alábbiakban
Szerezze be a fizikai eszköz azonosítóját (az alábbiakban
<device-identifier>
):xcrun devicectl list devices
Telepítse az alkalmazást a fizikai eszközére:
xcrun devicectl device install app --device <device-identifier> <path-to-ipa>
Indítsa el az alkalmazást a fizikai eszközön:
xcrun devicectl device process launch --device <device-identifier> --start-stopped <bundle-identifier>
Nyissa meg
lldb
, és csatlakozzon a fizikai eszközhöz:(lldb) device select <device-identifier> (lldb) device process attach -n <app-name>
A lépések sikeres elvégzése után megkezdheti az AOT .NET MAUI iOS natív alkalmazás hibakeresését a lldb
segítségével.
A szimbólumfájl fontossága
Alapértelmezés szerint a hibakeresési szimbólumok az alkalmazás bináris fájljából egy .dSYM fájlba lesznek eltávolítva. Ezt a fájlt a hibakeresők és a post mortem analysis tools használják a helyi változókra, a forrássorszámokra vonatkozó információk megjelenítésére, valamint az összeomlási memóriaképek veremnyomainak újbóli létrehozására. Ezért fontos megőrizni a szimbólumfájlt, mielőtt beküldené az alkalmazást az App Store-ba.
CPU-profilkészítés
Xcode Instruments használható a natív AOT-alkalmazások cpu-mintáinak gyűjtésére.
Halomelemzés
A halomelemzés jelenleg nem támogatott natív AOT környezetben.