Xamarin.iOS Uygulamalarını Bağlama

Uygulamanızı oluştururken, Mac için Visual Studio veya Visual Studio yönetilen kod için bağlayıcı içeren mtouch adlı bir aracı çağırır. Uygulamanın kullanmadığı özellikleri sınıf kitaplıklarından kaldırmak için kullanılır. Amaç, uygulamanın boyutunu küçültmektir ve bu boyut yalnızca gerekli bitlerle birlikte sunulur.

Bağlayıcı, uygulamanızın izlemeye açık olduğu farklı kod yollarını belirlemek için statik analiz kullanır. Bulunabilen hiçbir şeyin kaldırılmadığından emin olmak için her derlemenin tüm ayrıntılarına göz atmak zorunda olduğu için biraz ağırdır. Hata ayıklama sırasında derleme süresini hızlandırmak için simülatör derlemelerinde varsayılan olarak etkinleştirilmez. Ancak daha küçük uygulamalar ürettiğinden AOT derlemesini ve cihaza yüklemeyi hızlandırabilir, tüm cihazlar (Yayın) derlemeleri varsayılan olarak bağlayıcıyı kullanır.

Bağlayıcı statik bir araç olduğundan, yansıma aracılığıyla çağrılan veya dinamik olarak örneklenmiş ekleme türleri ve yöntemleri için işaretleyemeyebilir. Bu sınırlamaya geçici çözüm bulmak için çeşitli seçenekler vardır.

Bağlayıcı Davranışı

Bağlama işlemi, Proje Seçenekleri'ndeki bağlayıcı davranışı açılan listesi aracılığıyla özelleştirilebilir. Bu iOS projesine çift tıklamak ve aşağıda gösterildiği gibi iOS Derleme > BağlayıcıSı Seçenekleri'ne göz atmak için:

Linker Options

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

Bağlamayı devre dışı bırakmak, hiçbir derlemenin değiştirilmemesini sağlar. Performans nedenleriyle, IDE'niz iOS simülatörünü hedeflediğinde bu varsayılan ayardır. Cihazlar derlemeleri için bu yalnızca bağlayıcı uygulamanızın çalışmasını engelleyen bir hata içerdiğinde geçici çözüm olarak kullanılmalıdır. Uygulamanız yalnızca -nolink ile çalışıyorsa lütfen bir hata raporu gönderin.

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

Bu modda bağlayıcı derlemelerinizi dokunulmadan bırakır ve uygulamanızın kullanmadığı her şeyi kaldırarak SDK derlemelerinin boyutunu (Xamarin.iOS ile birlikte gelenler) azaltır. Bu, IDE'niz iOS cihazlarını hedeflediğinde varsayılan ayardır.

Bu, kodunuzda herhangi bir değişiklik gerektirmediğinden en basit seçenektir. Her şeyi bağlamanın farkı, bağlayıcının bu modda birkaç iyileştirme gerçekleştirememesidir, bu nedenle her şeyi bağlamak için gereken iş ile son uygulama boyutu arasında bir denge sağlar.

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

Bağlayıcı her şeyi bağlarken, uygulamayı mümkün olduğunca küçük hale getirmek için iyileştirmelerinin tamamını kullanabilir. Kod, bağlayıcının statik analizinin algılayamayacağı şekilde özellikleri kullandığında bozulabilen kullanıcı kodunu değiştirir. Web hizmetleri, yansıma veya serileştirme gibi durumlarda, her şeyi bağlamak için uygulamanızda bazı ayarlamalar gerekebilir.

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

Bağlayıcıyı Denetleme

Bağlayıcıyı kullandığınızda, bazen dolaylı bile olsa dinamik olarak çağırmış olabileceğiniz kodu kaldırır. Bu durumları ele almak için bağlayıcı, eylemleri üzerinde daha fazla denetime sahip olmanıza olanak sağlayan birkaç özellik ve seçenek sağlar.

Kodu Koruma

Bağlayıcıyı kullandığınızda bazen Sistem kullanarak dinamik olarak çağırmış olabileceğiniz kodu kaldırabilir. Düşünceler. MemberInfo.Invoke veya yöntemlerinizi Objective-C özniteliğini kullanarak [Export] dışarı aktarıp seçiciyi el ile çağırarak.

Bu gibi durumlarda, sınıf düzeyinde veya üye düzeyinde özniteliğini uygulayarak bağlayıcıya tüm sınıfların kullanılmasını veya tek tek üyelerin [Xamarin.iOS.Foundation.Preserve] korunmasını göz önünde bulundurmasını sağlayabilirsiniz. Uygulama tarafından statik olarak bağlı olmayan her üye kaldırılabilir. Bu nedenle bu öznitelik, statik olarak başvurulmayan ancak uygulamanız tarafından hala gerekli olan üyeleri işaretlemek için kullanılır.

Örneğin, türleri dinamik olarak başlatırsanız, türlerinizin varsayılan oluşturucusunun korunmasını isteyebilirsiniz. XML serileştirmesi kullanıyorsanız, türlerinizin özelliklerini korumak isteyebilirsiniz.

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

Bazen belirli üyeleri korumak istersiniz, ancak yalnızca içeren tür korunduysa. Bu gibi durumlarda [Preserve (Conditional=true)]

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

Bunu yapmak için bir PreserveAttribute sınıfı bildirmeniz ve bunu kodunuzda kullanmanız gerekir, örneğin:

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

Bunun hangi ad alanında tanımlandığı önemli değildir, bağlayıcı bu özniteliği tür adına göre arar.

Derlemeler Atlanıyor

Diğer derlemelerin normal şekilde bağlanmasına izin verirken bağlayıcı işleminden dışlanması gereken derlemeleri belirtmek mümkündür. Bazı derlemelerde kullanmak [Preserve] mümkün değilse (örneğin, üçüncü taraf kodu) veya bir hata için geçici bir geçici çözüm olarak bu yararlı olur.

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

Tüm Bütünleştirilmiş Kodları Bağla seçeneğini kullanırken bağlayıcıya bütün bütünleştirilmiş kodları atlamasını söylemek istiyorsanız, üst düzey derlemenizin Ek mtouch bağımsız değişkenleri seçeneklerine aşağıdakileri koyun:

--linkskip=NameOfAssemblyToSkipWithoutFileExtension

Bağlayıcının birden çok derlemeyi atlamasını istiyorsanız, birden çok linkskip bağımsız değişken eklersiniz:

--linkskip=NameOfFirstAssembly --linkskip=NameOfSecondAssembly

Bu seçeneği kullanacak kullanıcı arabirimi yoktur, ancak Mac için Visual Studio Proje Seçenekleri iletişim kutusunda veya Visual Studio proje Özellikleri bölmesinde, Ek mtouch bağımsız değişkenleri metin alanında sağlanabilir. (Örneğin -- linkskip=mscorlib mscorlib.dll bağlamaz ancak çözümdeki diğer derlemeleri bağlar).

Bağlayıcı, cihazlarda kullanılma olasılığı çok düşük olan kodu (örneğin, desteklenmeyen veya izin verilmeyen) kaldırır. Nadiren de olsa bir uygulama veya kitaplığın bu (çalışan veya olmayan) koda bağlı olması mümkündür. Xamarin.iOS 5.0.1'den bu yana bağlayıcıya bu iyileştirmeyi atlaması talimatı veilebilir.

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

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

Derlemenizi Bağlayıcı hazır olarak işaretleme

Kullanıcılar yalnızca SDK derlemelerini bağlamayı seçebilir ve kodlarına bağlanmayı seçemez. Bu, Xamarin'in temel SDK'sının parçası olmayan üçüncü taraf kitaplıkların da bağlanacağı anlamına gelir.

Bu durum genellikle kodlarına el ile öznitelik eklemek [Preserve] istemedikleri için gerçekleşir. Bunun yan etkisi, üçüncü taraf kitaplıklarının bağlanmayacağıdır ve bu genel olarak iyi bir varsayılandır, bir üçüncü taraf kitaplığının bağlayıcı dostu olup olmadığını bilmek mümkün değildir.

Projenizde bir kitaplığınız varsa veya yeniden kullanılabilir kitaplıkların geliştiricisiyseniz ve bağlayıcının derlemenize bağlanabilir olarak davranmasını istiyorsanız tek yapmanız gereken derleme düzeyi özniteliğini LinkerSafeeklemektir:

[assembly:LinkerSafe]

Kitaplığınızın bunun için Xamarin kitaplıklarına başvurması gerekmez. Örneğin, diğer platformlarda çalışacak bir Taşınabilir Sınıf Kitaplığı oluşturuyorsanız, yine de bir LinkerSafe öznitelik kullanabilirsiniz. Xamarin bağlayıcısı özniteliği gerçek türüne göre değil ada göre arar LinkerSafe . Bu, bu kodu yazabileceğiniz ve aynı zamanda çalışacağı anlamına gelir:

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

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

Bağlayıcı yapılandırma dosyası oluşturma yönergelerini izleyin.