import{_ as s,o,c as a,a as e}from"./app.fb8271cf.js";const n={},l=e(`
\u65E5\u5FD7\u662F\u8C03\u8BD5\u8FC7\u7A0B\u6700\u91CD\u8981\u7684\u4E00\u73AF\uFF0C
YukiHookAPI
\u4E3A\u5F00\u53D1\u8005\u5C01\u88C5\u4E86\u4E00\u5957\u7A33\u5B9A\u9AD8\u6548\u7684\u8C03\u8BD5\u65E5\u5FD7\u529F\u80FD\u3002
\u4F60\u53EF\u4EE5\u8C03\u7528 loggerD
\u3001loggerI
\u3001loggerW
\u6765\u5411\u63A7\u5236\u53F0\u6253\u5370\u666E\u901A\u65E5\u5FD7\u3002
\u4F7F\u7528\u65B9\u6CD5\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
loggerD(msg = "This is a log")
\u6B64\u65F6\uFF0CYukiHookAPI
\u4F1A\u8C03\u7528 android.util.Log
\u4E0E XposedBridge.log
\u540C\u65F6\u6253\u5370\u8FD9\u6761\u65E5\u5FD7\u3002
\u65E5\u5FD7\u9ED8\u8BA4\u7684 TAG
\u4E3A\u4F60\u5728 YukiHookLogger.Configs.tag
\u4E2D\u8BBE\u7F6E\u7684\u503C\u3002
\u4F60\u4E5F\u53EF\u4EE5\u52A8\u6001\u81EA\u5B9A\u4E49\u8FD9\u4E2A\u503C\uFF0C\u4F46\u662F\u4E0D\u5EFA\u8BAE\u8F7B\u6613\u4FEE\u6539 TAG
\u9632\u6B62\u8FC7\u6EE4\u4E0D\u5230\u65E5\u5FD7\u3002
\u793A\u4F8B\u5982\u4E0B
loggerD(tag = "YukiHookAPI", msg = "This is a log")
\u6253\u5370\u7684\u7ED3\u679C\u4E3A\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
[YukiHookAPI][D][\u5BBF\u4E3B\u5305\u540D]--> This is a log
\u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 LoggerType
\u81EA\u5B9A\u4E49\u65E5\u5FD7\u6253\u5370\u7684\u7C7B\u578B\uFF0C\u53EF\u9009\u62E9\u4F7F\u7528 android.util.Log
\u8FD8\u662F XposedBridge.log
\u6765\u6253\u5370\u65E5\u5FD7\u3002
\u9ED8\u8BA4\u7C7B\u578B\u4E3A LoggerType.BOTH
\uFF0C\u542B\u4E49\u4E3A\u540C\u65F6\u4F7F\u7528\u8FD9\u4E24\u4E2A\u65B9\u6CD5\u6765\u6253\u5370\u65E5\u5FD7\u3002
\u6BD4\u5982\u6211\u4EEC\u4EC5\u4F7F\u7528 android.util.Log
\u6765\u6253\u5370\u65E5\u5FD7\u3002
\u793A\u4F8B\u5982\u4E0B
loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD)
\u6216\u53C8\u4EC5\u4F7F\u7528 XposedBridge.log
\u6765\u6253\u5370\u65E5\u5FD7\uFF0C\u6B64\u65B9\u6CD5\u4EC5\u53EF\u5728 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4F7F\u7528\u3002
\u793A\u4F8B\u5982\u4E0B
loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE)
\u82E5\u4F60\u60F3\u667A\u80FD\u533A\u5206 (Xposed) \u5BBF\u4E3B\u73AF\u5883\u4E0E\u6A21\u5757\u73AF\u5883\uFF0C\u53EF\u4EE5\u5199\u4E3A\u5982\u4E0B\u5F62\u5F0F\u3002
\u793A\u4F8B\u5982\u4E0B
loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE)
\u8FD9\u6837 API \u5C31\u4F1A\u5728\u4E0D\u540C\u73AF\u5883\u667A\u80FD\u9009\u62E9\u6307\u5B9A\u7684\u65B9\u6CD5\u7C7B\u578B\u53BB\u6253\u5370\u8FD9\u6761\u65E5\u5FD7\u3002
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 loggerD\u3001loggerI \u53CA loggerW \u65B9\u6CD5\u3002
\u4F60\u53EF\u4EE5\u8C03\u7528 loggerE
\u6765\u5411\u63A7\u5236\u53F0\u6253\u5370 E
\u7EA7\u522B\u7684\u65E5\u5FD7\u3002
\u4F7F\u7528\u65B9\u6CD5\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
loggerE(msg = "This is an error")
\u9519\u8BEF\u65E5\u5FD7\u7684\u7EA7\u522B\u662F\u6700\u9AD8\u7684\uFF0C\u65E0\u8BBA\u4F60\u6709\u6CA1\u6709\u8FC7\u6EE4\u4EC5\u4E3A E
\u7EA7\u522B\u7684\u65E5\u5FD7\u3002
\u5BF9\u4E8E\u9519\u8BEF\u7EA7\u522B\u7684\u65E5\u5FD7\uFF0C\u4F60\u8FD8\u53EF\u4EE5\u5728\u540E\u9762\u52A0\u4E0A\u4E00\u4E2A\u5F02\u5E38\u5806\u6808\u3002
// \u5047\u8BBE\u8FD9\u5C31\u662F\u88AB\u629B\u51FA\u7684\u5F02\u5E38
val throwable = Throwable(...)
// \u6253\u5370\u65E5\u5FD7
loggerE(msg = "This is an error", e = throwable)
\u6253\u5370\u7684\u7ED3\u679C\u4E3A\u5982\u4E0B\u6240\u793A\u3002
\u793A\u4F8B\u5982\u4E0B
[YukiHookAPI][E][\u5BBF\u4E3B\u5305\u540D]--> This is an error
\u540C\u65F6\uFF0C\u65E5\u5FD7\u4F1A\u5E2E\u4F60\u6253\u5370\u6574\u4E2A\u5F02\u5E38\u5806\u6808\u3002
\u793A\u4F8B\u5982\u4E0B
java.lang.Throwable
at com.demo.Test.<init>(...)
at com.demo.Test.doTask(...)
at com.demo.Test.stop(...)
at com.demo.Test.init(...)
at a.a.a(...)
... 3 more
\u5728\u9519\u8BEF\u65E5\u5FD7\u4E2D\uFF0C\u4F60\u540C\u6837\u4E5F\u53EF\u4EE5\u4F7F\u7528 LoggerType
\u6765\u6307\u5B9A\u5F53\u524D\u6253\u5370\u65E5\u5FD7\u6240\u7528\u5230\u7684\u65B9\u6CD5\u7C7B\u578B\u3002
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 loggerE \u65B9\u6CD5\u3002
\u4F60\u53EF\u4EE5\u4F7F\u7528 YukiHookLogger.saveToFile
\u65B9\u6CD5\u76F4\u63A5\u4FDD\u5B58\u5F53\u524D\u5DF2\u6253\u5370\u7684\u5168\u90E8\u65E5\u5FD7\u5230\u6587\u4EF6\u3002
\u793A\u4F8B\u5982\u4E0B
// \u8BF7\u6CE8\u610F\u4FDD\u5B58\u7684\u6587\u4EF6\u8DEF\u5F84\u5FC5\u987B\u62E5\u6709\u8BFB\u5199\u6743\u9650\uFF0C\u5426\u5219\u4F1A\u629B\u51FA\u5F02\u5E38
YukiHookLogger.saveToFile("/sdcard/Documents/debug_log.log")
\u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 YukiHookLogger.contents
\u83B7\u53D6\u5F53\u524D\u5DF2\u6253\u5370\u7684\u5168\u90E8\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9\u3002
\u793A\u4F8B\u5982\u4E0B
// \u83B7\u53D6\u5F53\u524D\u5DF2\u6253\u5370\u7684\u5168\u90E8\u65E5\u5FD7\u6587\u4EF6\u5185\u5BB9
val fileContent = YukiHookLogger.contents
\u4EE5\u4E0A\u529F\u80FD\u9700\u8981\u542F\u7528 YukiHookLogger.Configs.isRecord
\u3002
\u4F60\u8FD8\u53EF\u4EE5\u4F7F\u7528 YukiHookLogger.Configs.elements
\u81EA\u5B9A\u4E49\u8C03\u8BD5\u65E5\u5FD7\u5BF9\u5916\u663E\u793A\u7684\u5143\u7D20\u3002
\u6B64\u529F\u80FD\u9700\u8981\u5728 Hook \u5165\u53E3\u7C7B\u7684 onInit
\u4E2D\u5BF9 YukiHookAPI.Configs
\u8FDB\u884C\u914D\u7F6E\u3002
\u793A\u4F8B\u5982\u4E0B
override fun onInit() = configs {
debugLog {
// ...
elements(TAG, PRIORITY, PACKAGE_NAME, USER_ID)
}
// ...
}
\u5C0F\u63D0\u793A
\u66F4\u591A\u529F\u80FD\u8BF7\u53C2\u8003 YukiHookLogger.contents\u3001YukiHookLogger.saveToFile \u65B9\u6CD5\u4EE5\u53CA YukiHookLogger.Configs\u3002