illinkanalyzer(1) General Commands Manual illinkanalyzer(1)

illinkanalyzer - تحلیل‌گر وابستگی‌ها و بهینه‌ساز اسمبلی‌های باینری IL در Mono

illinkanalyzer [گزینه‌ها] <linker-dependency-file.xml.gz>

ابزار تحلیل‌گر لینکر (linker analyzer) یک ابزار خط فرمان برای تحلیل وابستگی‌هایی است که هنگام پردازش توسط لینکر ثبت شده‌اند؛ فرآیندی که در آن لینکر آیتم‌هایی را نشانه‌گذاری می‌کند تا در اسمبلی پیوندخورده نهایی باقی بمانند.

این ابزار بر روی یک گراف جهت‌دار از وابستگی‌ها کار می‌کند که در حین اجرای لینکر جمع‌آوری و استخراج (Dump) شده‌اند. رأس‌های این گراف آیتم‌های مورد نظر مانند اسمبلی‌ها، نوع‌ها، متدها، فیلدها، مراحل لینکر و غیره هستند. یال‌ها نیز نشان‌دهنده وابستگی‌ها میان این موارد می‌باشند.

تحلیل‌گر لینکر به عنوان ورودی به یک پرونده وابستگی‌های لینکر نیاز دارد. این پرونده را می‌توان با فعال‌سازی استخراج وابستگی‌ها حین پیوند زدن یک پروژه Xamarin.Android یا Xamarin.iOS به دست آورد.

این کار را می‌توان از طریق خط فرمان با تنظیم ویژگی LinkerDumpDependencies روی مقدار true و سپس بیلد پروژه انجام داد. (اطمینان حاصل کنید که تسک LinkAssemblies فراخوانی شود؛ گاهی اوقات ممکن است نیاز به پاک‌سازی و Clean کردن پروژه باشد). معمولاً بیلد پروژه به شکل زیر کافی است:

rm -f obj/Release/link.flag
msbuild /p:LinkerDumpDependencies=true /p:Configuration=Release YourAppProject.csproj

پس از یک بیلد موفق، یک پرونده به نام linker-dependencies.xml.gz ایجاد می‌شود که شامل اطلاعات مورد نیاز برای تحلیل‌گر است.

نمایش تمام وابستگی‌ها.
خروجی نوع‌ها و در صورت تمایل تحلیل اندازه در پرونده CSV.
نمایش این پیام راهنما و خروج.
تنظیم مسیر دایرکتوری اسمبلی‌های پیوندخورده (لینک‌شده). امکان نمایش تخمین اندازه را فعال می‌کند.
نمایش وابستگی‌های خام رأس (گره). مقدار خام رأس در همان قالبی است که لینکر در پرونده XML وابستگی ثبت کرده است. مقدار می‌تواند یک عبارت باقاعده (Regex) باشد.
نمایش وابستگی‌های ریشه.
نمایش آمار وابستگی‌های بارگذاری‌شده.
کاهش و تبدیل گراف وابستگی به یک درخت.
نمایش وابستگی‌های تمام نوع‌ها.
نمایش وابستگی‌های نوع. مقدار می‌تواند یک عبارت باقاعده (Regex) باشد.
نمایش تمام وابستگی‌ها به ازای هر رأس به همراه فاصله آن‌ها.
نمایش با جزئیات بیشتر. گزینه‌های --stat و --roots را نیز فعال می‌کند.

فرض کنید می‌خواهید بدانید چرا یک نوع مشخص، به عنوان مثال Android.App.Activity، توسط لینکر نشانه‌گذاری شده است. تحلیل‌گر را به این صورت اجرا کنید:

illinkanalyzer -t Android.App.Activity linker-dependencies.xml.gz

خروجی:

Loading dependency tree from: linker-dependencies.xml.gz
--- Type dependencies: 'Android.App.Activity' -----------------------
--- TypeDef:Android.App.Activity dependencies -----------------------
Dependency #1
	TypeDef:Android.App.Activity
	| TypeDef:XA.App.MainActivity [2 deps]
	| Assembly:XA.App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null [3 deps]
	| Other:Mono.Linker.Steps.ResolveFromAssemblyStep

خروجی شامل رشته(های) وابستگی است که با نوع مورد نظر آغاز شده و با آیتم‌هایی که به آن نوع وابسته‌اند ادامه می‌یابد. یک وابستگی می‌تواند به دلایل متعددی رخ دهد؛ به عنوان مثال نوع در یک متد ارجاع داده شده باشد، یا نام آن نوع در پرونده xml لینکر برای محافظت و نگهداری ثبت شده باشد.

در این مثال، تنها یک زنجیره وابستگی به نام Dependency #1 وجود دارد. این زنجیره نشان می‌دهد که نوع Android.App.Activity در حین پردازش نوع XA.App.MainActivity توسط لینکر نشانه‌گذاری شده است. در این مورد خاص، به این دلیل که نوع MainActivity از نوع Activity ارث‌بری کرده و در نتیجه لینکر آن را علامت‌گذاری نموده و در اسمبلی نهایی نگه داشته است. همچنین می‌توان مشاهده کرد که ۲ وابستگی برای کلاس MainActivity وجود دارد. توجه داشته باشید که در رشته وابستگی بالا فقط اولین وابستگی از این دو (وابستگی به اسمبلی XA.App) نشان داده شده است. در نهایت، رأس اسمبلی به رأس ResolveFromAssemblyStep وابسته است. بنابراین مشاهده می‌کنیم که این اسمبلی در مرحله لینکر ResolveFromAssembly پردازش شده است.

حال ممکن است بخواهیم وابستگی‌های MainActivity را مشاهده کنیم. این کار با اجرای دستور زیر در تحلیل‌گر انجام می‌شود:

illinkanalyzer -r TypeDef:XA.App.MainActivity linker-dependencies.xml.gz

خروجی:

Loading dependency tree from: linker-dependencies.xml.gz
--- Raw dependencies: 'TypeDef:XA.App.MainActivity' -----------------
--- TypeDef:XA.App.MainActivity dependencies ------------------------
Dependency #1
	TypeDef:XA.App.MainActivity
	| Assembly:XA.App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null [3 deps]
	| Other:Mono.Linker.Steps.ResolveFromAssemblyStep
Dependency #2
	TypeDef:XA.App.MainActivity
	| TypeDef:XA.App.MainActivity/<>c__DisplayClass1_0 [2 deps]
	| TypeDef:XA.App.MainActivity [2 deps]
	| Assembly:XA.App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null [3 deps]
	| Other:Mono.Linker.Steps.ResolveFromAssemblyStep

msbuild(1)