ورود به سیستم را درک کنید

این مقاله فرآیند ورود به سیستم را شامل استانداردهای گزارش، دستورالعمل‌های سطح، کلاس‌ها، اهداف و تقریب‌های چند پشته‌ای را پوشش می‌دهد.

استانداردهای لاگ

ورود به سیستم اندروید به دلیل ترکیبی از استانداردهای استفاده شده که در logcat ترکیب شده اند، پیچیده است. استانداردهای اصلی مورد استفاده به تفصیل در زیر آمده است:

منبع نمونه ها راهنمایی سطح پشته
RFC 5424 ( syslog استاندارد) هسته لینوکس، بسیاری از برنامه های یونیکس هسته، دیمون های سیستم
android.util.Log چارچوب اندروید + ثبت برنامه فریم ورک اندروید و اپلیکیشن سیستم
java.util.logging.Level ورود عمومی به جاوا برنامه غیر سیستمی

شکل 1: استانداردهای سطح گزارش.

اگرچه هر یک از این استانداردها ساختار مشابهی دارند، اما از نظر دانه بندی متفاوت هستند. معادل های تقریبی در سراسر استانداردها به شرح زیر است:

سطح RFC 5424 RFC 5424 شدت توضیحات RFC 5424 android.util.Log java.util.logging.Level
0 اورژانس سیستم غیر قابل استفاده است Log.e / Log.wtf SEVERE
1 هشدار باید فورا اقدام شود Log.e / Log.wtf SEVERE
2 انتقادی شرایط بحرانی Log.e / Log.wtf SEVERE
3 خطا شرایط خطا Log.e SEVERE
4 هشدار شرایط هشدار Log.w WARNING
5 توجه کنید عادی اما قابل توجه Log.w WARNING
6 اطلاعات پیام رسانی اطلاعاتی Log.i INFO
7 اشکال زدایی پیام های سطح اشکال زدایی Log.d CONFIG ، FINE
- - پیام رسانی پرمخاطب Log.v FINER / FINEST

شکل 2: سطوح ثبت syslog ، اندروید و جاوا.

دستورالعمل های سطح ورود به سیستم

دستورالعمل های موجود برای هر استاندارد ورود به سیستم وجود دارد. سطح گزارش انتخاب شده از استاندارد مناسبی که استفاده می شود، مانند استفاده از استاندارد syslog برای توسعه هسته پیروی می کند.

ترتیبات سطح گزارش، از حداقل به بیشترین، در سه شکل زیر نشان داده شده است:

ERROR این سیاههها همیشه نگهداری می شوند.
WARN این سیاههها همیشه نگهداری می شوند.
INFO این سیاههها همیشه نگهداری می شوند.
DEBUG این لاگ ها کامپایل می شوند اما در زمان اجرا پاک می شوند.
VERBOSE این گزارش‌ها به جز در زمان توسعه هرگز در یک برنامه کامپایل نمی‌شوند.

شکل 3: android.util.Log

CONFIG سطح پیام برای پیام های پیکربندی ایستا
FINE سطح پیام ارائه اطلاعات ردیابی
FINER یک پیام ردیابی نسبتاً دقیق را نشان می دهد
FINEST پیام ردیابی بسیار دقیق را نشان می دهد
INFO سطح پیام برای پیام های اطلاعاتی
SEVERE سطح پیام نشان دهنده یک شکست جدی است
WARNING سطح پیام نشان دهنده یک مشکل احتمالی است

شکل 4: java.util.Logging.Level .

0 اورژانس سیستم غیر قابل استفاده است
1 هشدار باید فورا اقدام شود
2 انتقادی شرایط بحرانی
3 خطا شرایط خطا
4 هشدار شرایط هشدار
5 توجه کنید شرایط عادی اما قابل توجه
6 اطلاعاتی پیام های اطلاعاتی
7 اشکال زدایی پیام های سطح اشکال زدایی

شکل 5: RFC 5424 - بخش 6.2.1 .

ثبت برنامه

گزارش گیری انتخابی با TAG توسط کلاس android.util.Log با استفاده از Log#isLoggable انجام می شود، همانطور که در زیر نشان داده شده است:

if (Log.isLoggable("FOO_TAG", Log.VERBOSE)) {
 Log.v("FOO_TAG", "Message for logging.");
}

گزارش‌ها را می‌توان در زمان اجرا تنظیم کرد تا سطح انتخابی از ورود به سیستم را مطابق شکل زیر ارائه کند:

adb shell setprop log.tag.FOO_TAG VERBOSE

ویژگی های log.tag.* در راه اندازی مجدد بازنشانی می شوند. انواع دائمی وجود دارد که در راه اندازی مجدد نیز باقی می مانند. زیر را ببینید:

adb shell setprop persist.log.tag.FOO_TAG VERBOSE

بررسی های Log#isLoggable ردی از گزارش در کد برنامه باقی می گذارد. پرچم‌های Boolean DEBUG با استفاده از بهینه‌سازی‌های کامپایلر که روی false تنظیم شده‌اند، ردهای گزارش را دور می‌زنند، همانطور که در زیر نشان داده شده است:

private final static boolean DEBUG = false;

… If (DEBUG) { Log.v("FOO_TAG", "Extra debug logging."); }

ورود به سیستم را می توان بر اساس هر APK از طریق قوانین ProGuard توسط R8 در زمان کامپایل حذف کرد. مثال زیر همه موارد زیر ثبت سطح INFO را برای android.util.Log حذف می کند:

# This allows proguard to strip isLoggable() blocks containing only <=INFO log
# code from release builds.
-assumenosideeffects class android.util.Log {
  static *** i(...);
  static *** d(...);
  static *** v(...);
  static *** isLoggable(...);
}
-maximumremovedandroidloglevel 4

این برای مدیریت چندین نوع ساخت برنامه (به عنوان مثال، ساخت‌های توسعه در مقابل نسخه‌های انتشار) که انتظار می‌رود کد اصلی یکسان باشد، اما سطوح گزارش مجاز متفاوت است، مفید است. باید یک خط مشی صریح برای برنامه‌ها (به ویژه برنامه‌های سیستمی) تنظیم و دنبال شود تا تصمیم بگیرند که چگونه انواع ساخت و انتظارات انتشار بر خروجی گزارش تأثیر می‌گذارند.

ورود سیستم در زمان اجرا اندروید (ART)

چندین کلاس موجود برای برنامه ها و سرویس های سیستم موجود است:

کلاس هدف
android.telephony.Rlog گزارش رادیویی
android.util.Log ثبت برنامه عمومی
android.util.EventLog ثبت رویدادهای تشخیصی یکپارچه سیستم
android.util.Slog ورود به سیستم چارچوب پلت فرم

شکل 6: کلاس ها و اهداف ثبت سیستم موجود.

اگرچه android.util.Log و android.util.Slog از استانداردهای سطح گزارش یکسانی استفاده می کنند، Slog یک کلاس @hide است که فقط توسط پلتفرم قابل استفاده است. سطوح EventLog به ورودی های فایل event.logtags در /system/etc/event-log-tags نگاشت می شوند.

چوب بری بومی

ورود به سیستم C/C++ از استاندارد syslog پیروی می کند که syslog (2) مربوط به syslog هسته لینوکس است که بافر printk کنترل می کند و syslog (3) مربوط به سیستم ثبت کننده عمومی است. اندروید از کتابخانه liblog برای ورود به سیستم عمومی استفاده می کند.

liblog با استفاده از فرم ماکرو زیر، بسته‌بندی‌هایی را برای گروه‌های زیرلاگ‌ها فراهم می‌کند:

[Sublog Buffer ID] LOG [Log Level ID]

برای مثال، RLOGD با [Radio log buffer ID] LOG [Debug Level] مطابقت دارد. بسته‌بندی‌های اصلی liblog به شرح زیر است:

کلاس لفاف توابع نمونه
log_main.h ALOGV ، ALOGW
log_radio.h RLOGD ، RLOGE
log_system.h SLOGI ، SLOGW

شکل 7: بسته بندی های liblog .

اندروید دارای رابط های سطح بالاتری برای ورود به سیستم است که نسبت به استفاده مستقیم liblog ترجیح داده می شود، همانطور که در زیر مشاهده می کنید:

کتابخانه استفاده
async_safe کتابخانه فقط برای ورود به سیستم از محیط‌های ایمن سیگنال غیرهمگام
libbase کتابخانه Logging که یک رابط جریان C++ را برای ورود به سیستم فراهم می‌کند، شبیه به گزارش‌گیری به سبک Google (glog). libbase در هر دو پروژه خارجی قابل استفاده است و در برنامه هایی با استفاده از libbase_ndk در دسترس است.

شکل 8: کتابخانه های ثبتی سطح بالاتر.

تقریب های چند پشته ای

به دلیل تفاوت در جزئیات و هدف سطح، هیچ تطبیق واضح یا دقیقی از استانداردهای مختلف گزارش وجود ندارد. به عنوان مثال، سطوح java.util.logging.Level و android.util.Log برای گزارش‌های خطا مطابق 1:1 نیستند:

java.util.Logging.Level android.util.Log
شدید Log.wtf
شدید Log.e

شکل 9: سطح خطا در لاگ استاندارد جاوا در مقابل لاگ اندروید.

در مواردی مانند این، از استاندارد فردی برای تعیین سطح مورد استفاده استفاده کنید.

در طول توسعه سیستم با چندین مؤلفه در سطح پشته، شکل 1 را دنبال کنید تا تعیین کنید از کدام استاندارد برای هر جزء استفاده کنید. برای راهنمای تقریبی پیام‌رسانی ردیف، شکل 2 را دنبال کنید.

امنیت و حریم خصوصی

اطلاعات شناسایی شخصی (PII) را وارد نکنید. این شامل جزئیاتی مانند:

  • آدرس های ایمیل
  • شماره های تلفن
  • نام ها

به طور مشابه، برخی از جزئیات حساس تلقی می شوند، حتی اگر به طور صریح و شخصی قابل شناسایی نباشند.

برای مثال، اگرچه اطلاعات منطقه زمانی قابل شناسایی شخصی در نظر گرفته نمی شود، اما نشانی از مکان تقریبی یک کاربر را نشان می دهد.

خط مشی گزارش و جزئیات قابل قبول باید به عنوان بخشی از بررسی امنیت و حریم خصوصی قبل از انتشار بررسی شود.

گزارش های دستگاه

دسترسی به همه گزارش‌های دستگاه، از جمله استفاده از android.permission.READ_LOGS محدود شده است:

  • اگر برنامه‌ای در پس‌زمینه درخواست دسترسی به همه گزارش‌های دستگاه را داشته باشد، درخواست به‌طور خودکار رد می‌شود، مگر اینکه برنامه:
    • UID سیستم را به اشتراک می گذارد.
    • از یک فرآیند سیستمی بومی ( UID < APP_UID ) استفاده می کند.
    • از DropBoxManager استفاده می کند.
    • فقط به بافر گزارش رویداد دسترسی دارد.
    • از EventLog API استفاده می کند.
    • از تست های ابزاری استفاده می کند.
  • اگر برنامه‌ای در پیش‌زمینه با READ_LOGS درخواست دسترسی به گزارش‌های دستگاه کند، سیستم از کاربر می‌خواهد درخواست دسترسی را تأیید یا رد کند.