Propojení aplikací Xamarin.iOS

Při sestavování aplikace Visual Studio pro Mac nebo Visual Studio zavolá nástroj s názvem mtouch, který obsahuje linker pro spravovaný kód. Používá se k odebrání z knihoven tříd funkce, které aplikace nepoužívá. Cílem je zmenšit velikost aplikace, která bude dodávána pouze s potřebnými bity.

Linker používá statickou analýzu k určení různých cest kódu, které je vaše aplikace náchylná k sledování. Je to trochu těžké, protože musí procházet všechny podrobnosti každého sestavení, aby se zajistilo, že se neodebere nic zjistitelného. Ve výchozím nastavení není na sestavení simulátoru povolené, aby se urychlila doba sestavení při ladění. Vzhledem k tomu, že vytváří menší aplikace, může urychlit kompilaci AOT a nahrát do zařízení, ve výchozím nastavení používají všechna zařízení (Release) linker .

Vzhledem k tomu, že linker je statický nástroj, nemůže označit pro typy zahrnutí a metody, které se volají prostřednictvím reflexe, nebo dynamicky vytvořit instanci. Existuje několik možností, jak toto omezení obejít.

Chování linkeru

Proces propojení lze přizpůsobit prostřednictvím rozevíracího seznamu chování linkeru v Project Možnosti. Pokud chcete získat přístup k tomuto dvojitému kliknutí na projekt iOS a přejděte na možnosti buildového > linkeru pro iOS, jak je znázorněno níže:

Linker Options

Níže jsou popsány tři hlavní možnosti:

Zakázáním propojení se ujistěte, že nejsou upravena žádná sestavení. Z důvodů výkonu se jedná o výchozí nastavení, pokud cílíte integrovaného vývojového prostředí pro simulátor iOS. U zařízení by se to mělo použít jenom jako alternativní řešení, kdykoli linker obsahuje chybu, která brání spuštění vaší aplikace. Pokud vaše aplikace funguje jenom s -nolinkem, odešlete zprávu o chybě.

To odpovídá možnosti -nolink při použití nástroje příkazového řádku mtouch.

V tomto režimu linker opustí vaše sestavení nedotčená a zmenší velikost sestavení sady SDK (tj. co je dodáváno s Xamarin.iOS) odebráním všeho, co vaše aplikace nepoužívá. Toto je výchozí nastavení, když vaše integrované vývojové prostředí cílí na zařízení s iOSem.

Jedná se o nejjednodušší možnost, protože nevyžaduje žádnou změnu v kódu. Rozdíl s propojením všeho spočívá v tom, že linker nemůže v tomto režimu provádět několik optimalizací, takže je to kompromis mezi prací potřebnou k propojení všeho a konečné velikosti aplikace.

To odpovídá možnosti -linksdk při použití nástroje příkazového řádku mtouch.

Při propojení všeho může linker použít celou sadu jeho optimalizací, aby byla aplikace co nejmenší. Upraví uživatelský kód, který se může přerušit pokaždé, když kód používá funkce způsobem, který statická analýza linkeru nedokáže rozpoznat. V takových případech, například webové služby, reflexe nebo serializace, můžou být některé úpravy nutné ve vaší aplikaci k propojení všeho.

To odpovídá možnosti -linkall při použití nástroje příkazového řádku mtouch.

Řízení linkeru

Když použijete linker, někdy odebere kód, který byste mohli volat dynamicky, i nepřímo. Pro pokrytí těchto případů linker nabízí několik funkcí a možností, které vám umožní větší kontrolu nad jeho akcemi.

Zachování kódu

Když použijete linker, může někdy odebrat kód, který jste mohli volat dynamicky pomocí System.Reflection.MemberInfo.Invoke, nebo exportem metod pomocí Objective-C atributu [Export] a následného vyvolání selektoru ručně.

V těchto případech můžete linkeru instruovat, aby zvážil použití celých tříd nebo zachování jednotlivých členů použitím [Xamarin.iOS.Foundation.Preserve] atributu na úrovni třídy nebo na úrovni člena. Každý člen, který není staticky propojený aplikací, se může odebrat. Tento atribut se proto používá k označení členů, na které nejsou staticky odkazovány, ale které vaše aplikace stále potřebuje.

Pokud například vytváříte instance typů dynamicky, můžete chtít zachovat výchozí konstruktor typů. Pokud používáte serializaci XML, můžete chtít zachovat vlastnosti vašich typů.

Tento atribut můžete použít u každého člena typu nebo u samotného typu. Pokud chcete zachovat celý typ, můžete použít syntaxi [Preserve (AllMembers = true)] typu.

Někdy chcete zachovat určité členy, ale pouze v případě, že byl typ obsahující zachován. V těchto případech použijte [Preserve (Conditional=true)]

Pokud například nechcete využívat závislost na knihovnách Xamarinu – například že vytváříte knihovnu tříd pro různé platformy (PCL) – tento atribut můžete stále používat.

Uděláte to tak, že byste měli deklarovat třídu PreserveAttribute a použít ji ve svém kódu, například takto:

public sealed class PreserveAttribute : System.Attribute {
    public bool AllMembers;
    public bool Conditional;
}

Nezáleží na tom, ve kterém oboru názvů je definován, linker vypadá tento atribut podle názvu typu.

Přeskočení sestavení

Je možné určit sestavení, která by měla být vyloučena z procesu linkeru, a zároveň umožnit normální propojení jiných sestavení. To je užitečné, pokud použití [Preserve] u některých sestavení není možné (např. kód třetí strany) nebo jako dočasné alternativní řešení chyby.

To odpovídá --linkskip možnosti při použití nástroje příkazového řádku mtouch.

Pokud chcete linkeru oznámit, že při použití možnosti Propojit všechna sestavení přeskočí celá sestavení, vložte do možností Další argumenty mtouch sestavení nejvyšší úrovně:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

Pokud chcete, aby linker přeskočí více sestavení, zahrnete více linkskip argumentů:

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

Tuto možnost nelze použít, ale dá se zadat v dialogovém okně Visual Studio pro Mac Project Možnosti nebo podokně vlastností projektu Visual Studio v textovém poli Další argumenty mtouch. (Například --linkskip=mscorlib by nepojilo mscorlib.dll ale propojí jiná sestavení v řešení).

Linker odebere kód, který se na zařízeních nedá použít, například nepodporovaný nebo nepovolený. Ve výjimečných případech je možné, že aplikace nebo knihovna závisí na tomto (pracovním nebo ne) kódu. Vzhledem k tomu, že Xamarin.iOS 5.0.1 linker může být instruován, aby tuto optimalizaci přeskočí.

To odpovídá možnosti -nolinkaway při použití nástroje příkazového řádku mtouch.

Tuto možnost nelze použít, ale dá se zadat v dialogovém okně Visual Studio pro Mac Project Možnosti nebo v podokně Vlastnosti projektu Visual Studio v textovém poli Další argumenty mtouch. (Například --nolinkaway neodebere dodatečný kód (asi 100 kB)).

Označení sestavení jako připravené linkeru

Uživatelé můžou vybrat, aby pouze propojili sestavení sady SDK a nedělali žádné propojení s kódem. To také znamená, že všechny knihovny třetích stran, které nejsou součástí základní sady SDK Xamarinu, nebudou propojeny.

K tomu obvykle dochází, protože nechtějí do kódu přidávat atributy ručně [Preserve] . Vedlejším účinkem je, že knihovny třetích stran nebudou propojeny a obecně je to dobrá výchozí hodnota, protože není možné zjistit, jestli je knihovna třetích stran přívětivá nebo ne.

Pokud máte v projektu knihovnu nebo jste vývojář opakovaně použitelných knihoven a chcete, aby linker zachází s sestavením jako s odkazovatelným, stačí přidat atribut LinkerSafena úrovni sestavení, například takto:

[assembly:LinkerSafe]

Knihovna ve skutečnosti nemusí odkazovat na knihovny Xamarinu. Pokud například vytváříte knihovnu přenosných tříd, která bude běžet na jiných platformách, můžete stále použít LinkerSafe atribut. Linker Xamarin vyhledá LinkerSafe atribut podle názvu, nikoli podle jeho skutečného typu. To znamená, že můžete napsat tento kód a bude fungovat také:

[assembly:LinkerSafe]
// ... assembly attribute should be at top, before source
class LinkerSafeAttribute : System.Attribute {}

Vlastní konfigurace linkeru

Postupujte podle pokynů k vytvoření konfiguračního souboru linkeru.