diff --git a/docs/api/public/LoggerFactory.md b/docs/api/public/LoggerFactory.md index a7cee009..420b453c 100644 --- a/docs/api/public/LoggerFactory.md +++ b/docs/api/public/LoggerFactory.md @@ -8,16 +8,102 @@ > 这是 `YukiHookAPI` 的日志封装类,可实现同时向 `Logcat` 和 `XposedBridge.log` 打印日志的功能。 +### LoggerType [class] + +```kotlin +enum class LoggerType +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 需要打印的日志类型。 + +决定于模块与 (Xposed) 宿主环境使用的打印方式。 + +#### LOGD [enum] + +```kotlin +LOGD +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 仅使用 `android.util.Log`。 + +#### XPOSEDBRIDGE [enum] + +```kotlin +XPOSEDBRIDGE +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 仅使用 `XposedBridge.log`。 + +!> 只能在 (Xposed) 宿主环境中使用,模块环境将不生效。 + +#### SCOPE [enum] + +```kotlin +SCOPE +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 分区使用。 + +(Xposed) 宿主环境仅使用 `XPOSEDBRIDGE`。 + +模块环境仅使用 `LOGD`。 + +#### BOTH [enum] + +```kotlin +BOTH +``` + +**变更记录** + +`v1.0.93` `新增` + +**功能描述** + +> 同时使用。 + +(Xposed) 宿主环境使用 `LOGD` 与 `XPOSEDBRIDGE`。 + +模块环境仅使用 `LOGD`。 + ### loggerD [method] ```kotlin -fun loggerD(tag: String, msg: String) +fun loggerD(tag: String, msg: String, type: LoggerType) ``` **变更记录** `v1.0` `添加` +`v1.0.93` `修改` + +新增 `type` 参数 + **功能描述** > 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `D`。 @@ -27,13 +113,17 @@ fun loggerD(tag: String, msg: String) ### loggerI [method] ```kotlin -fun loggerI(tag: String, msg: String) +fun loggerI(tag: String, msg: String, type: LoggerType) ``` **变更记录** `v1.0` `添加` +`v1.0.93` `修改` + +新增 `type` 参数 + **功能描述** > 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `I`。 @@ -43,13 +133,17 @@ fun loggerI(tag: String, msg: String) ### loggerW [method] ```kotlin -fun loggerW(tag: String, msg: String) +fun loggerW(tag: String, msg: String, type: LoggerType) ``` **变更记录** `v1.0` `添加` +`v1.0.93` `修改` + +新增 `type` 参数 + **功能描述** > 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `W`。 @@ -59,13 +153,17 @@ fun loggerW(tag: String, msg: String) ### loggerE [method] ```kotlin -fun loggerE(tag: String, msg: String, e: Throwable?) +fun loggerE(tag: String, msg: String, e: Throwable?, type: LoggerType) ``` **变更记录** `v1.0` `添加` +`v1.0.93` `修改` + +新增 `type` 参数 + **功能描述** > 向 `Logcat` 和 `XposedBridge` 打印日志,级别 `E`,可携带 `e` 异常信息,将打印异常堆栈。 diff --git a/docs/guide/special-feature.md b/docs/guide/special-feature.md index ca3d11fa..510ba2aa 100644 --- a/docs/guide/special-feature.md +++ b/docs/guide/special-feature.md @@ -949,6 +949,36 @@ loggerD(tag = "YukiHookAPI", msg = "This is a log") [YukiHookAPI][D]--> This is a log ``` +你还可以使用 `LoggerType` 自定义日志打印的类型,可选择使用 `android.util.Log` 还是 `XposedBridge.log` 来打印日志。 + +默认类型为 `LoggerType.BOTH`,含义为同时使用这两个方法来打印日志。 + +比如我们仅使用 `android.util.Log` 来打印日志。 + +> 示例如下 + +```kotlin +loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.LOGD) +``` + +或又仅使用 `XposedBridge.log` 来打印日志,此方法仅可在 (Xposed) 宿主环境使用。 + +> 示例如下 + +```kotlin +loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.XPOSEDBRIDGE) +``` + +若你想智能区分 (Xposed) 宿主环境与模块环境,可以写为如下形式。 + +> 示例如下 + +```kotlin +loggerD(tag = "YukiHookAPI", msg = "This is a log", type = LoggerType.SCOPE) +``` + +这样 API 就会在不同环境智能选择指定的方法类型去打印这条日志。 + 更多用法可参考 [loggerD](api/document?id=loggerd-method)、[loggerI](api/document?id=loggeri-method) 及 [loggerW](api/document?id=loggerw-method) 方法。 ### 错误日志 @@ -996,6 +1026,8 @@ java.lang.Throwable ... 3 more ``` +在错误日志中,你同样也可以使用 `LoggerType` 来指定当前打印日志所用到的方法类型。 + 更多用法可参考 [loggerE](api/document?id=loggere-method) 方法。 ## Xposed 模块数据存储功能 diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt index c33be2d3..72334e1d 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/log/LoggerFactory.kt @@ -31,8 +31,78 @@ package com.highcapable.yukihookapi.hook.log import android.util.Log import com.highcapable.yukihookapi.YukiHookAPI +import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookBridge import de.robv.android.xposed.XposedBridge +/** + * 需要打印的日志类型 + * + * 决定于模块与 (Xposed) 宿主环境使用的打印方式 + */ +enum class LoggerType { + /** 仅使用 [Log] */ + LOGD, + + /** + * 仅使用 [XposedBridge.log] + * + * - ❗只能在 (Xposed) 宿主环境中使用 - 模块环境将不生效 + */ + XPOSEDBRIDGE, + + /** + * 分区使用 + * + * (Xposed) 宿主环境仅使用 [XPOSEDBRIDGE] + * + * 模块环境仅使用 [LOGD] + */ + SCOPE, + + /** + * 同时使用 + * + * (Xposed) 宿主环境使用 [LOGD] 与 [XPOSEDBRIDGE] + * + * 模块环境仅使用 [LOGD] + */ + BOTH +} + +/** + * 向控制台和 [XposedBridge] 打印日志 - 最终实现方法 + * @param format 日志打印的格式 + * @param type 日志打印的类型 + * @param tag 日志打印的标签 + * @param msg 日志打印的内容 + * @param e 异常堆栈信息 + */ +private fun baseLogger(format: String, type: LoggerType, tag: String, msg: String, e: Throwable? = null) { + /** 打印到 [Log] */ + fun loggerInLogd() = when (format) { + "D" -> Log.d(tag, msg) + "I" -> Log.i(tag, msg) + "W" -> Log.w(tag, msg) + "E" -> Log.e(tag, msg, e) + else -> Log.wtf(tag, msg, e) + } + + /** 打印到 [XposedBridge.log] */ + fun loggerInXposed() = runCatching { + XposedBridge.log("[$tag][$format]--> $msg") + e?.also { XposedBridge.log(it) } + } + when (type) { + LoggerType.LOGD -> loggerInLogd() + LoggerType.XPOSEDBRIDGE -> loggerInXposed() + LoggerType.SCOPE -> if (YukiHookBridge.hasXposedBridge) loggerInXposed() else loggerInLogd() + LoggerType.BOTH -> { + loggerInLogd() + if (YukiHookBridge.hasXposedBridge) loggerInXposed() + } + } +} + /** * [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - D * @param msg 日志打印的内容 @@ -76,11 +146,10 @@ internal fun yLoggerE(msg: String, e: Throwable? = null, isDisableLog: Boolean = * [XposedBridge] 中的日志打印风格为 [[tag]]「类型」--> [msg] * @param tag 日志打印的标签 - 建议和自己的模块名称设置成一样的 - 默认为 [YukiHookAPI.Configs.debugTag] * @param msg 日志打印的内容 + * @param type 日志打印的类型 - 默认为 [LoggerType.BOTH] */ -fun loggerD(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatching { - Log.d(tag, msg) - XposedBridge.log("[$tag][D]--> $msg") -} +fun loggerD(tag: String = YukiHookAPI.Configs.debugTag, msg: String, type: LoggerType = LoggerType.BOTH) = + baseLogger(format = "D", type, tag, msg) /** * 向控制台和 [XposedBridge] 打印日志 - I @@ -88,11 +157,10 @@ fun loggerD(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatchi * [XposedBridge] 中的日志打印风格为 [[tag]]「类型」--> [msg] * @param tag 日志打印的标签 - 建议和自己的模块名称设置成一样的 - 默认为 [YukiHookAPI.Configs.debugTag] * @param msg 日志打印的内容 + * @param type 日志打印的类型 - 默认为 [LoggerType.BOTH] */ -fun loggerI(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatching { - Log.i(tag, msg) - XposedBridge.log("[$tag][I]--> $msg") -} +fun loggerI(tag: String = YukiHookAPI.Configs.debugTag, msg: String, type: LoggerType = LoggerType.BOTH) = + baseLogger(format = "I", type, tag, msg) /** * 向控制台和 [XposedBridge] 打印日志 - W @@ -100,11 +168,10 @@ fun loggerI(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatchi * [XposedBridge] 中的日志打印风格为 [[tag]]「类型」--> [msg] * @param tag 日志打印的标签 - 建议和自己的模块名称设置成一样的 - 默认为 [YukiHookAPI.Configs.debugTag] * @param msg 日志打印的内容 + * @param type 日志打印的类型 - 默认为 [LoggerType.BOTH] */ -fun loggerW(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatching { - Log.w(tag, msg) - XposedBridge.log("[$tag][W]--> $msg") -} +fun loggerW(tag: String = YukiHookAPI.Configs.debugTag, msg: String, type: LoggerType = LoggerType.BOTH) = + baseLogger(format = "W", type, tag, msg) /** * 向控制台和 [XposedBridge] 打印日志 - E @@ -113,9 +180,7 @@ fun loggerW(tag: String = YukiHookAPI.Configs.debugTag, msg: String) = runCatchi * @param tag 日志打印的标签 - 建议和自己的模块名称设置成一样的 - 默认为 [YukiHookAPI.Configs.debugTag] * @param msg 日志打印的内容 * @param e 可填入异常堆栈信息 - 将自动完整打印到控制台 + * @param type 日志打印的类型 - 默认为 [LoggerType.BOTH] */ -fun loggerE(tag: String = YukiHookAPI.Configs.debugTag, msg: String, e: Throwable? = null) = runCatching { - Log.e(tag, msg, e) - XposedBridge.log("[$tag][E]--> $msg") - e?.also { XposedBridge.log(it) } -} \ No newline at end of file +fun loggerE(tag: String = YukiHookAPI.Configs.debugTag, msg: String, e: Throwable? = null, type: LoggerType = LoggerType.BOTH) = + baseLogger(format = "E", type, tag, msg, e) \ No newline at end of file