Propojení aplikací Xamarin.iOS

Při sestavování aplikace Visual Studio pro Mac nebo Visual Studio volá 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é vaše aplikace může sledovat. Je to trochu těžké, protože musí projít všemi podrobnostmi každého sestavení, aby se zajistilo, že se neodebere nic zjistitelného. Ve výchozím nastavení není v buildech simulátoru povolená, aby se zrychlil čas sestavení při ladění. Vzhledem k tomu, že vytváří menší aplikace, může zrychlit kompilaci AOT a nahrávat do zařízení, všechna zařízení (vydané verze) ve výchozím nastavení používají linker.

Protože linker je statický nástroj, nemůže označit pro typy zahrnutí a metody, které jsou volána reflexí, nebo dynamicky vytvořit instanci. Existuje několik možností, jak toto omezení obejít.

Chování linkeru

Proces propojení lze přizpůsobit pomocí rozevíracího seznamu chování linkeru v možnostech projektu. Pokud chcete získat přístup k tomuto poklikání na projekt iOS a přejděte na možnosti linkeru sestavení > 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í, když vaše integrované vývojové prostředí (IDE) cílí na simulátor iOS. U zařízení by se to mělo použít jenom jako alternativní řešení, když 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 ponechá 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 žádné změny v kódu. Rozdíl mezi 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 propojování všeho může linker použít celou sadu svých optimalizací, aby byla aplikace co nejmenší. Upraví uživatelský kód, který může přerušit pokaždé, když kód používá funkce tak, aby statická analýza linkeru nerozpoznala. V takových případech, například webové služby, reflexe nebo serializace, můžou být některé úpravy nutné v aplikaci k propojení všeho.

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

Řízení linkeru

Při použití linkeru někdy odebere kód, který byste mohli volat dynamicky, dokonce 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

Při použití linkeru může někdy odebrat kód, který jste mohli dynamicky volat pomocí systému. Reflexe ion. MemberInfo.Invoke nebo exportováním metod pomocí Objective-C atributu [Export] a ručním vyvoláním selektoru.

V takových případech můžete linkerovi dát pokyn, 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ů, které nejsou staticky odkazovány, ale které jsou stále potřeba vaší aplikací.

Pokud například vytváříte instance typů dynamicky, můžete chtít zachovat výchozí konstruktor vašich 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 zachován typ obsahující. V těchto případech použijte [Preserve (Conditional=true)]

Pokud nechcete závislost na knihovnách Xamarinu – například říkáte, že vytváříte knihovnu přenosných tříd pro různé platformy (PCL) – tento atribut můžete přesto použít.

K tomu byste měli deklarovat třídu PreserveAttribute a použít ji v 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] v některých sestaveních 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, aby linker při použití možnosti Propojit všechna sestavení přeskočil celá sestavení, vložte do možností Další argumenty mtouch sestavení nejvyšší úrovně následující:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

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

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

K použití této možnosti není žádné uživatelské rozhraní, ale můžete ho zadat v dialogovém okně Visual Studio pro Mac Možnosti projektu nebo v podokně Vlastnosti projektu sady Visual Studio v textovém poli Další argumenty mtouch. (Například --linkskip=mscorlib nebude propojit mscorlib.dll ale propojí jiná sestavení v řešení).

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

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

K použití této možnosti neexistuje žádné uživatelské rozhraní, ale můžete ho zadat v dialogovém okně možnosti projektu Visual Studio pro Mac nebo v podokně Vlastnosti projektu sady Visual Studio v textovém poli Další argumenty mtouch. (Např. --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í se svým kódem. To také znamená, že žádné 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 [Preserve] atributy ručně. Vedlejším účinkem je, že knihovny třetích stran nebudou propojeny a obecně je to dobré výchozí nastavení, protože není možné vědět, jestli je knihovna třetí strany popisná 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]

Vaše knihovna ve skutečnosti nemusí odkazovat na knihovny Xamarinu. Pokud například vytváříte knihovnu přenosných tříd, která se bude spouštět 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 tento kód můžete napsat a bude také fungovat:

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

Vlastní konfigurace linkeru

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