本文說明記錄程序,包括記錄標準、等級規範、 類別、用途和多重堆疊近似值。
記錄標準
登入 Android 的程序相當複雜,
合併於 logcat
。主要標準詳細說明如下:
Source | 範例 | 堆疊層級指南 |
---|---|---|
RFC 5424 (syslog 標準) |
Linux kernel,許多 Unix 應用程式 | 核心、系統 Daemon |
android.util.Log |
Android 架構 + 應用程式記錄 | Android 架構和系統應用程式 |
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。
應用程式記錄功能
系統會使用 Log#isLoggable
,依 android.util.Log
類別的 TAG
執行選擇性記錄作業,
如下所示:
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; |
---|
R8
前,您可以透過 ProGuard 規則集移除每個 APK 的記錄功能。
也就是編譯時間以下範例會移除 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 |
---|
這有助於處理多種應用程式建構類型 (例如 會比較基礎程式碼 預期會相同,但允許的記錄層級不同。煽情露骨內容 必須為應用程式 (尤其是系統) 設定及遵循政策 應用程式),決定建構類型和版本預期對記錄的影響 輸出內容
Android 執行階段 (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) 會對應至
控制 printk
緩衝區的 Linux 核心 syslog
,以及 syslog
(3)
則對應至一般系統記錄器Android 會使用 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
包裝函式。
Android 提供更高層級的記錄介面,最受直接歡迎
liblog
用量,如下所示:
程式庫 | 用量 |
---|---|
async_safe |
僅適用於從非同步信號安全環境記錄的程式庫 |
libbase |
提供 C++ 串流介面記錄的 Logging 程式庫,類似
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:標準 Java 記錄與 Android 中的錯誤等級 。
在這種情況下,請使用個別標準來決定
申請。
進行多個堆疊層級的系統開發期間,請遵循 圖 1 判斷每個元件要使用何種標準。如為約略值 分層訊息指南,請按照圖 2 的指示操作。
安全性和隱私權
請勿記錄個人識別資訊 (PII)。這個 包含詳細資料,例如:
- 電子郵件地址
- 電話號碼
- 名稱
同樣地,即使 可明確識別個人身分
舉例來說,雖然時區資訊不屬於個人識別資訊
但能指出使用者的約略位置。
唯有基於安全考量,處理記錄政策和可接受的詳細資料 產品上市前,我們會進行隱私權審查
裝置記錄
存取所有裝置記錄,包括使用
android.permission.READ_LOGS
敬上
受到限制:
- 如果背景的應用程式要求存取所有裝置記錄,系統會自動提出要求 拒絕,除非以下應用程式:
- 共用系統 UID。
- 使用原生系統程序 (
UID
<APP_UID
)。 - 使用
DropBoxManager
。 - 僅存取事件記錄緩衝區。
- 使用
EventLog
API。 - 使用檢測設備測試。
- 如果前景中具有「
READ_LOGS
」的應用程式要求存取裝置記錄, 系統會提示使用者核准或拒絕存取權要求。