آموزش B4A – چگونگی کارکرد Debugها با مثال

در قسمت قبل در مورد Debugger های rapid و legacy صحبت کردیم حال می خواهیم در مورد چگونگی کارکرد این دو با مثال صحبت کنیم.

چگونگی کارکرد Debuggerها

ابتدا با توضیحی در مورد کار debug legacy شروع می کنم. وقتی مد کامپایل را بر روی legacy می گذارید کامپایلر B4A یک برنامه اندرویدی منظمی می سازد. بنابراین علاوه بر کدهای برنامه (program code)، کامپایلر instrumented code هم تولید می کند. یعنی اینکه برای هر خط کد، کامپایلر بررسی runtime انجام می دهد و بررسی می کند که آیا در آن خط breakpointی وجود دارد یا خیر. اگر breakpoint وجود داشته باشد برنامه با نشان دادن یک پنجره پیغام متوقف شده و متغیرها برای IDE ارسال می شود.

کار rapid متفاوت است. زمانی که شما برنامه را کامپایل می کنید دو تا برنامه ساخته می شود. یکی device application (shell) و دیگری standard java application (debugger engine).

کد شما در داخل موتور debugger قرار می گیرد. موتور debugger بر روی desktop اجرا می شود ولی برنامه های shell مانند یک ماشین مجازی کوچک عمل می کنند. موتور debugger به برنامه shell وصل می شود و دستورالعمل هایی را برای برنامه shell ارسال می کند. بخش جالب این کار این است که کد شما سمت دستگاه اجرا نمی شود بلکه در Desktop اجرا می شود.

در اکثر مواقع برنامه shell قابل استفاده مجدد هستند به عنوان مثال شما یک فایلی را اضافه کردید یا فایل manifest را با استفاده از ویرایشگر manifest، تغییر داده اید سپس کامپایلر یک برنامه shell جدید می سازد و به صورت خودکار در طول عمل کامپایل، دوباره نصب خواهد کرد.

standard JVM بسیارقدرمندتر از ماشین Android Dalvik است. به عنوان مثال قادر است کلاس ها را در زمان اجرا، بارگذاری کند و همچنین به صورت آنلاین می توان در کد تغییری اعمال کرد.

برای بهتر متوجه شدن این بحث ها، با هم یک مثالی را کار خواهیم کرد. در زیر یک مثالی از یک برنامه آماده خواهم زد تا با کار این debugger ها بهتر آشنا شوید.

در این برنامه یک دکمه در صفحه وجود دارد که با کلیک بر روی آن یک خط قرمزی کشیده می شود:

Capture17

سورس برنامه را در انتهای مطلب برای دانلود گذاشتم و می توانید آن را دانلود کرده و گام به گام با هم پیش برویم.

برنامه را با مد rapid اجرا می کنیم. روی دکمه که کلیک کنید یک خطی رسم می شود. حال مقدار y1 در کد را از ۱۵۰dip به مثلا ۲۵۰dip تغییر می دهیم. همانطور که در تصویر پایین مشاهده می کنید با تغییر در کد از شما می خواهد که برنامه را ذخیره کنید و بعد از ذخیره کردن برنامه، نیاز به دوباره اجرا کردن آن ندارید فقط کافی است که روی دکمه دوباره کلیک کنید تا خطی با مختصات جدید ایجاد شود.

Capture18

Capture19

حتی می توانیم layout را تغییر دهیم به عنوان مثال در متد Activity_Resume مقدار ویژگی left مربوط به دکمه را تغییر بدید و برنامه را ذخیره کنید می بینید که محل دکمه عوض می شود. حال بر روی یک خطی breakpoint بگذارید و برنامه را اجرا کنید در پایین صفحه پنجره ای باز می شود که تمام متغیرها و مقادیر را نمایش می دهد.

Capture20

در این پنجره مقدار تمام متغیرها را می توانید ببینید و حتی مقادیرشان را با کلیک راست می توانید کپی کنید. حتی با کلیک کردن بر روی متغیری در کد می توانید مقدارش را در پنجره پایین مشاهده کنید. حتی با کلیک کردن بر روی ویوها به عنوام مثال btnDraw، می توانید تمام ویژگی های آن را مشاهده کنید.

ویژگی Watch Expression

در کنار دکمه های debugger یک textbox می بینید. با این textbox می توانیم کارهای جالبی انجام دهیم. به عنوان مثال می خواهیم مختصات دقیق btnDraw را ببینیم فقط کافیه دستور پایین را در داخل textbox بنویسید:

۱۰۰%x – (btnDraw.Left + btnDraw.Width)

سپس بر روی دکمه watch کلیک کنید یا مثلا می خواهیم طول خط ایجاد شده را به پیکسل محاسبه کنیم از دستور زیر استفاده می کنیم:

Sqrt(Power((x2 – x1), 2) + Power((x2 – x1), 2))

دانلود سورس برنامه

در مورد Debug ها و چگونگی کارکرد آنها صحبت کردیم حال نوبت به مد Release می رسد.

Release و Release (obfuscated)

برای توزیع برنامه یا نصب برنامه اندرویدی بر روی دستگاه باید در مدهای زیر کامپایل کنید:

  • Release: کد Debug که داخل فایل apk قرار نمی گیرد
  • Release (obfuscated): کد debug در داخل فایل apk قرار نمی گیرد ولی فایل برنامه قابل ویرایش می باشد

نسخه ۱٫۸ b4a شامل یک ویژگی با عنوان ابهام سازی کد یا code obfuscation می باشد. یعنی چی؟ وقتی برنامه شما کامپایل می شود b4a کد جاوا تولید می کند که با کامپایلر جاوا کامپایل می شود و سپس به dalvik تبدیل می شود (به فرمت کد android byte). یک سری ابزار هم وجود دارند که می توانید کدهای dalvik byte را به کدهای جاوا تبدیل کنید.

هدف از obfuscation یا ابهام سازی کد این است که تا حد امکان کدهای کامپایل شده را ناخوانا کند و فهمیدن و درک کدها را سخت کند تا به راحتی نتوان مقادیر رشته ای مهم مثلا رمز حساب کاربر را استخراج کرد.

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

  1. ابهام سازی رشته ها یا strings obfuscation: هر مقدار رشته ای که در داخل sub مربوط به Process_Globals هستند، ابهام سازی می شوند و این کار در زمان اجرا انجام می شود تا مقادیر رشته ای مهم را نتوان به راحتی استخراج کرد. به این نکته توجه داشته باشید که فقط رشته های کلیدی مانند package name, version name و version code مبهم می شوند و با تغییر این مقادیر از طریق ویرایشگر manifest، فرآیند ابهام سازی متوقف می شود.(فایل manifest شامل یک سری ویژگی های مربوط به برنامه از قبیل نام برنامه، permission هایی که برنامه نیاز دارد، نسخه برنامه و … است).
  2. تغییر نام متغیرها یا Variables renaming: نام متغیرهای عمومی و متدها تبدیل به یک رشته بی معنا می شود و متغیرهای محلی هیچ تغییری نمی کنند چون در زمان کامپایل مفقودالاثر می شوند 😉 . چندتا از شناسه ها هستند که تغییر نام نمی دهند:
    1. شناسه ای که شامل خط زیرین یا underscore است مانند رویدادها
    2. متدهایی که در دستور CallSub ظاهر می شوند. زمانی که یک متد static باشد هیچ تغییری نمی کند.
    3. نام ویوها

نکته: اگر، به دلایلی، بخواهید یک شناسه ای را از فرایند ابهام سازی حذف کنید در نام آن از یک زیرخط یا underscore استفاده کنید.

در پوشه Objects فایلی تحت عنوان ObfuscatorMap.txt قرار دارد که نام اصلی متغیرها و شناسه ها را به نام های مبهم شده آنها map کرده است. این فایل می تواند برای تحلیل گزارش های خرابی یا crash مفید واقع شود.

مشترک خبرنامه شوید

  • RSS
  • Delicious
  • Digg
  • Facebook
  • Twitter
  • Linkedin
  • Youtube

نقش مدیر تضمین کیفیت

نقش مدیر تضمین کیفیت در چابک چیست؟ آیا ما واقعا ...

چگونه وارد کار تست ن

مثل همه ی کارها، کار تست نرم افزار و انتخاب ...

ابزارهای مفید برای ت

امروزه افراد زیادی هستند که از موبایل خود برای وبگردی ...

BDD Best Practice

معرفی BDD BDD یا توسعه رفتار محور یک متدولوژی است برای ...

Agile Test Strategy

در محیط چابک یا agile، جایی که ما روی اسپرینت ...