מאמר זה מכסה את תהליך הרישום, כולל תקני יומן, הנחיות רמות, מחלקות, מטרות וקירוב רב-ערימות.
תקני יומן
הכניסה לאנדרואיד היא מורכבת בשל תמהיל הסטנדרטים המשולבים ב- logcat
. התקנים העיקריים בהם נעשה שימוש מפורטים להלן:
מָקוֹר | דוגמאות | הדרכה ברמת הערימה |
---|---|---|
RFC 5424 (תקן syslog ) | ליבת לינוקס, יישומי יוניקס רבים | ליבה, דמוני מערכת |
android.util.Log | מסגרת אנדרואיד + רישום אפליקציות | מסגרת ואפליקציית מערכת של אנדרואיד |
java.util.logging.Level | התחברות כללית ב-Java | יישום שאינו מערכת |
איור 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
, Android ו-Java.
הנחיות ברמת יומן
קיימות הנחיות קיימות עבור כל תקן יומן. רמת היומן שנבחרה עוקבת אחר התקן המתאים בשימוש, כמו שימוש בתקן 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
משאירות עקבות יומן בקוד היישום. דגלי DEBUG
בוליאניים עוקפים מעקבי יומן באמצעות אופטימיזציות מהדר המוגדרות ל- false
, כפי שמוצג להלן:
private final static boolean DEBUG = false; |
---|
ניתן להסיר רישום על בסיס לכל 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) המתאים ל-logger של המערכת הכללי. אנדרואיד משתמש בספריית 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 | ספריית רישום המספקת ממשק זרם C++ לרישום, בדומה לרישום בסגנון גוגל (גלוג). 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: רמת שגיאה ברישום Java רגיל לעומת רישום אנדרואיד.
במקרים כאלה, השתמש בתקן האישי כדי לקבוע איזו רמה ליישם.
במהלך פיתוח מערכת עם מספר רכיבים ברמת מחסנית, עקוב אחר איור 1 כדי לקבוע באיזה תקן להשתמש לכל רכיב. לקבלת מדריך משוער להעברת הודעות בשכבות, עקוב אחר איור 2.
בטיחות ופרטיות
אין לרשום מידע אישי מזהה (PII). זה כולל פרטים כגון:
- כתובות דוא"ל
- מספרי טלפון
- שמות
באופן דומה, פרטים מסוימים נחשבים לרגישים גם אם אינם ניתנים לזיהוי אישי במפורש.
לדוגמה, למרות שמידע על אזור זמן אינו נחשב לזיהוי אישי, הוא נותן אינדיקציה למיקום המשוער של משתמש.
יש לטפל במדיניות היומן ובפרטים המקובלים כחלק מבדיקת האבטחה והפרטיות לפני השחרור.
יומני מכשיר
הגישה לכל יומני המכשירים, כולל שימוש android.permission.READ_LOGS
מוגבלת:
- אם אפליקציה ברקע מבקשת גישה לכל יומני המכשירים, הבקשה תידחה אוטומטית אלא אם האפליקציה:
- משתף את ה-UID של המערכת.
- משתמש בתהליך מערכת מקורי (
UID
<APP_UID
). - משתמש
DropBoxManager
. - ניגש רק למאגר יומן האירועים.
- משתמש ב-
EventLog
API. - משתמש בבדיקות מכשור.
- אם אפליקציה בחזית עם
READ_LOGS
מבקשת גישה ליומני המכשיר, המערכת מבקשת מהמשתמש לאשר או לדחות את בקשת הגישה.