تقریبا تمام برنامه نویسها باید بدونن که چاپ کردن پیامهایی به کنسول/ترمینال یا همون محیط متنی خشک و خالی، توی برنامه نویسی برای دیباگ کردن چقدر مفیده، حتی موقعی که داریم برنامه های کاملا گرافیکی می نویسیم.
حالا درمورد اندروید ولی چطور میشه این کار رو کرد؟ چون اندروید اینطوری نیست که فرضا شما توی جاوا بصورت استاندارد یه چیزی رو بفرستید به stdout (با توابعی مثل print) و یه پنجرهء متنی باز بشه و پیام رو نشون بده.
بخصوص وقتی دارید مثل من با ابزارهای خط فرمان برنامه های اندروید رو توسعه میدید، بلد بودن روش انجام این کار خیلی مهمتره.
در اندروید باید اینطور عمل کرد:
- ابتدا در فایل سورس مورد نظر این رو اضافه کنید:
import android.util.Log;
- حالا هرجا که میخواید پیام دیباگ چاپ کنید به شکل این مثال عمل کنید:
Log.d("custom_tag", "your debug message");
این دستور پیام your debug message رو به سیستم لاگینگ اندروید ارسال میکنه که اونجا ثبت میشه. فرقی و مزیتی هم که نسبت به پرینت معمولی پیامها به stdout داره اینه که پیامها در سیستم لاگ اندروید ذخیره میشن و به این زودی از بین نمیرن (مگر اینکه خودتون پاک کنید) و میتونید بصورت ریل تایم یا بعدا هروقت که نیاز شد اونا رو بارها بررسی کنید.
custom_tag یک رشته ای هست که بعدا برای پیدا کردن پیامهای خاص برنامهء شما در بین انبوه پیامهای موجود برنامه های مختلف در سیستم لاگ اندروید، استفاده خواهید کرد.
خب حالا ما چطور پیامهای سیستم لاگ اندروید رو در خط فرمان مشاهده کنیم؟
وقتی دیوایس واقعی یا امولیتور اندروید مورد نظر به سیستم شما اتصال داره این دستور رو بزنید (البته من فرض کردم که فقط یک دیوایس در حال حاضر روی سیستم است):
adb.exe logcat
با اجرای این دستور مشاهده خواهید کرد که یک عالمه پیام لاگ روی صفحه رژه میرن که مربوط به تمام برنامه های اندروید هست که از قبل تولید شدن و حالا هم بعضیا همچنان در حال تولید این پیامها هستن. برای خارج شدن از این حالت، ctrl+c رو بزنید.
حالا ما فقط پیامهای برنامهء خودمون رو چطوری جدا کنیم؟
این دستور:
adb.exe logcat custom_tag:d *:s
این کار رو برامون انجام میده.
این دستور پیامهای دیباگ برنامه تاکنون رو که در سیستم لاگ ثبت شدن نشون میده، و ضمنا همینطور منتظر میمونه و اگر برنامهء ما پیام جدیدی ارسال کرد، اون رو بصورت ریل تایم نشون میده.
البته این دستور یکسری جزییات و امکانات بیشتری داره ولی من خلاصه مختصر و مفید موارد اصلی و بدردبخور رو گفتم. ولی با این حال بازم بیشتر توضیح میدم (نه کامل). برای اطلاعات کاملش به رفرنس های مربوطه مراجعه کنید.
راستی اونکه نوشتم adb.exe، خواستم مثال خلاصه و تمیز باشه، وگرنه من آیکون این فایل رو از پوشهء android-sdkplatform-tools درگ میکنم به پنجرهء خط فرمان، که اینطوری آدرس مطلقش در اونجا درج میشه و قابل اجرا است. همینطوری اگر بزنید adb یا adb.exe این برنامه اجرا نمیشه، مگر اینکه در مسیر دایرکتوری جاری خط فرمان شما باشه یا دایرکتوریش در متغییر path خط فرمان شما اضافه شده باشه (البته برای ویندوز رو میگم؛ درمورد لینوکس شاید از قبل در مسیر فایلهای اجرایی باشه).
برای اینکه امکانات و ساختار این فرمان دستتون بیاد بیشتر توضیح میدم:
اگر میخواید پیامهای لاگ اندروید رو بطور کلی پاک کنید این دستور رو بزنید:
adb.exe logcat -c
این دستور البته پیامهای تمام برنامه ها و سیستمهای اندروید رو پاک میکنه، نه فقط پیامهای برنامهء شما رو.
اگر میخواید فقط پیامهای لاگ دارای سطح Error (و بالاتر) رو مشاهده کنید این دستور رو میزنید:
adb.exe logcat *:s *:e
برای سطح debug و بالاتر:
adb.exe logcat *:s *:d
اون حروف e و d معرف همین سطوح ذکر شده هستن. سطوح دیگری هم داریم که توی رفرنس ها میتونید پیدا کنید.
توی برنامهء خودتون هم میتونید پیامهای لاگ در سطوح مختلف رو چاپ کنید (مثالی که من زدم سطح debug بود). مثلا برای چاپ پیام در سطح information از این دستور استفاده می کنید: Log.i برای سطح warning از Log.w و غیره.
اما باید توجه داشت دستور adb.exe logcat custom_tag:d *:s که برای نمایش پیامهای برنامهء خودمون تایپ کردیم، فقط پیامهای سطح debug رو نشون میده؛ به کاراکتر d بعد از تگ custom_tag دقت کنید. بنابراین شما برای نمایش هر سطح از پیامها باید کاراکتر مربوط به اون سطح یا پایین ترش رو مشخص کنید. مثلا اگر من بخوام تمام پیامها در هر سطحی نشون داده بشن، باید از کاراکتر v که معرف سطح verbose است استفاده کنم، چون سطح verbose پایین ترین سطح پیامهای لاگینگ اندروید می باشد.