Xamarin.iOS Uygulamalarını Bağlama

Uygulamanızı hazırlarken Mac için Visual Studio veya Visual Studio, yönetilen kod için bir linker içeren mtouch adlı bir aracı arar. Uygulamanın kullanmama özellikleri sınıf kitaplıklarından kaldırmak için kullanılır. Amaç, yalnızca gerekli bitlerle birlikte gelecek uygulamanın boyutunu azaltmaktır.

Bağlantıcı, statik analizi kullanarak, uygulamanın takip etmeye açık olduğu farklı kod yollarını belirler. Keşfedilebilir hiçbir şeyin kaldırılamay olduğundan emin olmak için her derlemenin her ayrıntısı boyunca devam etmek zorunda olduğundan biraz ağırdır. Hata ayıklama sırasında derleme zamanlarını hızlandırmak için simülatör derlemeleri üzerinde varsayılan olarak etkin değildir. Ancak daha küçük uygulamalar ürettiği için AOT derlemeyi hızlandırarak cihaza yükleme işlemi hızlandırabilirsiniz. Tüm cihazlar (Yayın) derlemeleri varsayılan olarak linker'ı kullanır.

Bağlantıcı statik bir araç olduğu için, yansıma aracılığıyla çağrılır veya dinamik olarak örneği oluşturulmuş dahil etme türlerini ve yöntemlerini işaretleyemez. Bu sınırlamaya geçici çözüm olarak çeşitli seçenekler mevcuttur.

Linker Davranışı

Bağlantı işlemi, Seçenekler'de yer alan bağlantı Project özelleştirilebilir. Bu iOS projesine çift tıklayarak erişmek için aşağıda gösterildiği gibi iOS Derleme Linker Seçenekleri'negöz atın:

Bağlayıcı Seçenekleri

Üç ana seçenek aşağıda açıklanmıştır:

Bağlamayı devre dışı bırakmak hiçbir derlemenin değiştirilmey olduğundan emin olur. Performans nedeniyle, IDE'niz iOS simülatörünü hedeflerken bu varsayılan ayardır. Cihaz derlemeleri için bu yalnızca, bağlantıcı, uygulamanın çalışmasına engel olan bir hata içerdiğinde geçici çözüm olarak kullanılmalıdır. Uygulamanız yalnızca -nolink ile çalışıyorsalütfen bir hata raporu gönderin.

Bu, komut satırı aracı mtouch kullanırken -nolink seçeneğine karşılık gelen bir seçenektir.

Bu modda, bağlantıcı derlemelerinizi olduğu gibi bırakır ve sdk derlemelerinin (Xamarin.iOS ile gönderilenler) boyutunu, uygulamanın kullanmaz her şeyi kaldırarak azaltır. Bu, IDE'niz iOS cihazlarını hedeflemektedir.

Bu en basit seçenektir çünkü kodunda herhangi bir değişiklik gerektirmez. Her şeyi bağlamanın farkı, bağlantıcının bu modda birkaç iyileştirme gerçekleştire çalışmasına izin ve dolayısıyla her şeyi ve son uygulama boyutunu bağlamaya yardımcı olmaktır.

Bu, komut satırı aracı mtouch kullanırken -linksdk seçeneğine karşılık gelen bir seçenektir.

Her şeyi bağlarken, bağlantıcı uygulamayı mümkün olduğunca küçük hale getirmesi için tüm iyileştirmelerini kullanabilir. Kod, özellikleri, bağlantıcının statik analizi tarafından algılanmayacak şekilde kullandığında bozan kullanıcı kodunu değiştirir. Web hizmetleri, yansıma veya serileştirme gibi durumlarda, her şeyi bağlamanız için uygulamanıza bazı ayarlamalar gerekebilir.

Bu, komut satırı aracı mtouch kullanırken -linkallseçeneğine karşılık geldi.

Linker'i denetleme

Bağlantıcıyı kullanırken, bazen dolaylı olarak bile dinamik olarak çağıryabiliyor olabileceğiniz kodu kaldırır. Bu gibi durumlara yer vermek için, bağlantıcı eylemleri üzerinde daha fazla denetime sahip olmak için birkaç özellik ve seçenek sağlar.

Kodu Koruma

Bazen, linker'ı kullanırken System.Reflection.MemberInfo.Invoke kullanarak veya yöntemlerinizi özniteliğini kullanarak dışarı aktararak ve ardından seçiciyi el ile çağırarak dinamik olarak çağırabilirsiniz Objective-C[Export] kodu kaldırabilir.

Bu gibi durumlarda, öznitelik sınıf düzeyinde veya üye düzeyinde uygulayarak, bağlantıcıya sınıfların tamamının veya tek tek üyelerin korunmasını göz önünde bulundurması [Xamarin.iOS.Foundation.Preserve] talimatını verilmektedir. Uygulama tarafından statik olarak bağlantılı olmayan her üye kaldırılabilir. Bu nedenle bu öznitelik, statik olarak başvurulmasa da, yine de uygulamanıza gereken üyeleri işaretlemek için kullanılır.

Örneğin, türleri dinamik olarak örneği oluşturursanız, türlerinizi varsayılan oluşturucusu korumak istiyor olabilir. XML serileştirme kullanıyorsanız, türlerinizin özelliklerini korumak istiyor olabilir.

Bu özniteliği bir türün her üyesine veya türün kendisine uygulayabilirsiniz. Türün tamamını korumak için söz dizimlerini [Preserve (AllMembers = true)] kullanabilirsiniz.

Bazen belirli üyeleri korumak, ancak yalnızca içeren türün korunarak korunmasını istiyor olursanız. Bu gibi durumlarda [Preserve (Conditional=true)]

Xamarin kitaplıklarına bağımlılık almak istemiyorsanız (örneğin, platformlar arası bir taşınabilir sınıf kitaplığı (PCL) derleyesiniz; yine de bu özniteliği kullanabilirsiniz.

Bunu yapmak için bir PreserveAttribute sınıfı bildirebilirsiniz ve bunu kodunda şu şekilde kullanabilirsiniz:

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

Bunun tanımlandığı ad alanı gerçekten önemli değildir, bağlantıcı bu özniteliği tür adına göre bakar.

Derlemeleri Atlama

Diğer derlemelerin normal şekilde bağlantı kurulmalarına izin verirken, diğer derlemelerin de bağlama işleminin dışında tutulacak derlemeleri belirtmek mümkündür. Bazı derlemelerde kullanmak imkansızsa (örneğin üçüncü taraf kodu) veya bir hata için geçici bir geçici çözüm olarak bu [Preserve] yararlı olur.

Bu, komut --linkskip satırı aracı mtouch kullanırken seçeneğine karşılık gelen bir seçenektir.

Tüm Derlemeleri Bağlama seçeneğini kullanırken, bağlantıcıya bütün derlemelerin tamamını atlasını söylemek için, üst düzey derlemenizin Ek mtouch bağımsız değişkenleri seçeneklerine aşağıdakini ekleyin:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

Linker'ın birden çok derlemeyi atlaması için birden çok bağımsız değişken linkskip ekleyin:

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

Bu seçeneği kullanmak için bir kullanıcı arabirimi yoktur, ancak Ek mtouch bağımsız değişkenleri metin alanı içinde Mac için Visual Studio Project Seçenekler iletişim kutusunda veya Visual Studio proje Özellikleri bölmesinde sağlanmıştır. (Ör. --linkskip=mscorlib, mscorlib.dll ancak çözümde diğer derlemeleri bağlar).

Bağlantıcı, cihazlarda kullanılma ihtimali çok düşük olan kodu (örneğin desteklenmeyen veya izin verilmeyen) kaldırır. Nadiren de olsa bir uygulama veya kitaplık bu (çalışıyor veya çalışmıyor) koda bağlı olabilir. Xamarin.iOS 5.0.1'den bu yana, bu iyileştirmeyi atlaması için bağlantıcıya talimat verin.

Bu, komut satırı aracı mtouch kullanırken -nolinkaway seçeneğine karşılık geldi.

Bu seçeneği kullanmak için bir kullanıcı arabirimi yoktur, ancak Ek mtouch bağımsız değişkenleri metin alanı içinde Mac için Visual Studio Project Seçenekler iletişim kutusunda veya Visual Studio proje Özellikleri bölmesinde sağlanmıştır. (Örn. --nolinkaway fazladan kodu (yaklaşık 100 kb) kaldırmaz).

Derlemenizi Linker'a hazır olarak işaretleme

Kullanıcılar yalnızca SDK derlemelerini bağlamayı ve kodlarına hiçbir bağlantı bağlamayı seçmez. Bu, Xamarin'in temel SDK'sı kapsamında yer alan üçüncü taraf kitaplıkların da bağlantı kurmayacakları anlamına gelir.

Bu durum genellikle kodlarına el ile öznitelik [Preserve] eklemek istemediklerinden gerçekleşir. Bunun yan etkisi, üçüncü taraf kitaplıkların bağlanmayacak olmasıdır ve bu genel olarak iyi bir varsayılan değerdir çünkü bir üçüncü taraf kitaplığının daha kolay olup olmadığını bilmek mümkün değildir.

Projeniz içinde bir kitaplığınız varsa veya yeniden kullanılabilir kitaplıklar geliştiricisiyseniz ve bağlantı kuranın derlemenizi bağlanabilir olarak kabul etmek istiyorsanız, tek yapmak istediğiniz derleme düzeyi özniteliğini LinkerSafe eklemektir:

[assembly:LinkerSafe]

Kitaplığınız bunun için aslında Xamarin kitaplıklarına başvurmayacak. Örneğin, diğer platformlarda çalıştıracak bir Taşınabilir Sınıf Kitaplığı inşa ediyorsanız yine de bir özniteliği LinkerSafe kullanabilirsiniz. Xamarin linker özniteliğini LinkerSafe gerçek türüne göre değil adıyla aramaz. Bu, bu kodu yazabilir ve şu şekilde çalışır:

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

Özel Bağlayıcı Yapılandırması

Bir linker yapılandırma dosyası oluşturmak için yönergeleri izleyin.