mirror of
https://github.com/HighCapable/YukiHookAPI.git
synced 2025-09-04 09:45:19 +08:00
Modify move package name to global host process name and set to current logger in LoggerFactory
This commit is contained in:
@@ -133,7 +133,7 @@ injectMember(priority = PRIORITY_HIGHEST) {
|
||||
### MemberHookCreater [class]
|
||||
|
||||
```kotlin
|
||||
inner class MemberHookCreater internal constructor(private val priority: Int, internal val tag: String, internal val packageName: String)
|
||||
inner class MemberHookCreater internal constructor(private val priority: Int, internal val tag: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
@@ -148,6 +148,10 @@ inner class MemberHookCreater internal constructor(private val priority: Int, in
|
||||
|
||||
增加 `packageName` 当前 Hook 的 APP 包名
|
||||
|
||||
`v1.0.93` `修改`
|
||||
|
||||
移除 `packageName`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> Hook 核心功能实现类,查找和处理需要 Hook 的方法、构造方法。
|
||||
|
@@ -51,13 +51,17 @@ injectResource(tag = "KuriharaYuki") {
|
||||
### ResourcesHookCreater [class]
|
||||
|
||||
```kotlin
|
||||
inner class ResourcesHookCreater internal constructor(private val tag: String, private val packageName: String)
|
||||
inner class ResourcesHookCreater internal constructor(private val tag: String)
|
||||
```
|
||||
|
||||
**变更记录**
|
||||
|
||||
`v1.0.80` `新增`
|
||||
|
||||
`v1.0.93` `修改`
|
||||
|
||||
移除 `packageName`
|
||||
|
||||
**功能描述**
|
||||
|
||||
> Hook 核心功能实现类。
|
||||
|
@@ -297,7 +297,7 @@ object YukiHookAPI {
|
||||
YukiHookBridge.packageParamCallback = {
|
||||
if (hooker.isNotEmpty())
|
||||
hooker.forEach { it.assignInstance(packageParam = this) }
|
||||
else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty")
|
||||
else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty", isShowProcessName = false)
|
||||
}
|
||||
else printNoXposedEnvLog()
|
||||
}
|
||||
@@ -344,7 +344,7 @@ object YukiHookAPI {
|
||||
if (hooker.isNotEmpty()) {
|
||||
printSplashLog()
|
||||
hooker.forEach { it.assignInstance(packageParam = baseContext.packageParam) }
|
||||
} else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty"))
|
||||
} else yLoggerE(msg = "Failed to passing \"encase\" method because your hooker param is empty", isShowProcessName = false))
|
||||
else printNoXposedEnvLog()
|
||||
}
|
||||
|
||||
@@ -352,11 +352,14 @@ object YukiHookAPI {
|
||||
private fun printSplashLog() {
|
||||
if (Configs.isDebug.not() || isShowSplashLogOnceTime.not()) return
|
||||
isShowSplashLogOnceTime = false
|
||||
yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using ${Status.executorName} API ${Status.executorVersion}")
|
||||
yLoggerI(
|
||||
msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using ${Status.executorName} API ${Status.executorVersion}",
|
||||
isShowProcessName = false
|
||||
)
|
||||
}
|
||||
|
||||
/** 输出找不到 [XposedBridge] 的错误日志 */
|
||||
private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted")
|
||||
private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted", isShowProcessName = false)
|
||||
|
||||
/**
|
||||
* 通过 baseContext 创建 Hook 入口类
|
||||
|
@@ -102,7 +102,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
* @return [MemberHookCreater.Result]
|
||||
*/
|
||||
inline fun injectMember(priority: Int = PRIORITY_DEFAULT, tag: String = "Default", initiate: MemberHookCreater.() -> Unit) =
|
||||
MemberHookCreater(priority, tag, packageParam.exhibitName).apply(initiate).apply { preHookMembers[toString()] = this }.build()
|
||||
MemberHookCreater(priority, tag).apply(initiate).apply { preHookMembers[toString()] = this }.build()
|
||||
|
||||
/**
|
||||
* Hook 执行入口
|
||||
@@ -127,7 +127,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
}
|
||||
isDisableCreaterRunHook.not() && hookClass.instance == null ->
|
||||
if (onHookClassNotFoundFailureCallback == null)
|
||||
yLoggerE(msg = "[${packageParam.exhibitName}] HookClass [${hookClass.name}] not found", e = hookClass.throwable)
|
||||
yLoggerE(msg = "HookClass [${hookClass.name}] not found", e = hookClass.throwable)
|
||||
else onHookClassNotFoundFailureCallback?.invoke(hookClass.throwable ?: Throwable("[${hookClass.name}] not found"))
|
||||
}
|
||||
}.start()
|
||||
@@ -159,11 +159,8 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
* 查找和处理需要 Hook 的方法、构造方法
|
||||
* @param priority Hook 优先级
|
||||
* @param tag 当前设置的标签
|
||||
* @param packageName 当前 Hook 的 APP 包名
|
||||
*/
|
||||
inner class MemberHookCreater @PublishedApi internal constructor(
|
||||
private val priority: Int, internal val tag: String, internal val packageName: String
|
||||
) {
|
||||
inner class MemberHookCreater @PublishedApi internal constructor(private val priority: Int, internal val tag: String) {
|
||||
|
||||
/** Hook 结果实例 */
|
||||
private var result: Result? = null
|
||||
@@ -493,7 +490,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
onHookingFailureCallback?.invoke(it)
|
||||
onAllFailureCallback?.invoke(it)
|
||||
if (isNotIgnoredNoSuchMemberFailure) yLoggerE(
|
||||
msg = "$hostTagName " + (if (isHookMemberSetup)
|
||||
msg = (if (isHookMemberSetup)
|
||||
"Hooked Member with a finding error by $hookClass [$tag]"
|
||||
else "Hooked Member cannot be non-null by $hookClass [$tag]"),
|
||||
e = findingThrowable ?: it
|
||||
@@ -587,7 +584,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
* @param msg 调试日志内容
|
||||
*/
|
||||
private fun onHookLogMsg(msg: String) {
|
||||
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "$hostTagName $msg")
|
||||
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = msg)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -596,7 +593,7 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
* @param member 异常 [Member] - 可空
|
||||
*/
|
||||
private fun onHookFailureMsg(throwable: Throwable, member: Member? = null) = yLoggerE(
|
||||
msg = "$hostTagName Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception [$tag]",
|
||||
msg = "Try to hook [${hookClass.instance ?: hookClass.name}]${member?.let { "[$it]" } ?: ""} got an Exception [$tag]",
|
||||
e = throwable
|
||||
)
|
||||
|
||||
@@ -612,12 +609,6 @@ class YukiMemberHookCreater(@PublishedApi internal val packageParam: PackagePara
|
||||
*/
|
||||
internal val isNotIgnoredNoSuchMemberFailure get() = onNoSuchMemberFailureCallback == null && isNotIgnoredHookingFailure
|
||||
|
||||
/**
|
||||
* 获取 Hook APP (宿主) 标签
|
||||
* @return [String]
|
||||
*/
|
||||
internal val hostTagName get() = if (packageParam.appUserId != 0) "[$packageName][${packageParam.appUserId}]" else "[$packageName]"
|
||||
|
||||
override fun toString() = "[tag] $tag [priority] $priority [class] $hookClass [members] $members"
|
||||
|
||||
/**
|
||||
|
@@ -58,7 +58,7 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP
|
||||
* @return [ResourcesHookCreater.Result]
|
||||
*/
|
||||
inline fun injectResource(tag: String = "Default", initiate: ResourcesHookCreater.() -> Unit) =
|
||||
ResourcesHookCreater(tag, packageParam.exhibitName).apply(initiate).apply { preHookResources[toString()] = this }.build()
|
||||
ResourcesHookCreater(tag).apply(initiate).apply { preHookResources[toString()] = this }.build()
|
||||
|
||||
/**
|
||||
* Hook 执行入口
|
||||
@@ -78,9 +78,8 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP
|
||||
*
|
||||
* 查找和处理需要 Hook 的 Resources
|
||||
* @param tag 当前设置的标签
|
||||
* @param packageName 当前 Hook 的 APP 包名
|
||||
*/
|
||||
inner class ResourcesHookCreater @PublishedApi internal constructor(private val tag: String, private val packageName: String) {
|
||||
inner class ResourcesHookCreater @PublishedApi internal constructor(private val tag: String) {
|
||||
|
||||
/** 是否已经执行 Hook */
|
||||
private var isHooked = false
|
||||
@@ -232,15 +231,9 @@ class YukiResourcesHookCreater(@PublishedApi internal val packageParam: PackageP
|
||||
* @param msg 调试日志内容
|
||||
*/
|
||||
private fun onHookLogMsg(msg: String) {
|
||||
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = "$hostTagName $msg")
|
||||
if (YukiHookAPI.Configs.isDebug) yLoggerI(msg = msg)
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取 Hook APP (宿主) 标签
|
||||
* @return [String]
|
||||
*/
|
||||
private val hostTagName get() = if (packageParam.appUserId != 0) "[$packageName][${packageParam.appUserId}]" else "[$packageName]"
|
||||
|
||||
/**
|
||||
* Resources 查找条件实现类
|
||||
*/
|
||||
|
@@ -197,8 +197,8 @@ class FieldFinder @PublishedApi internal constructor(
|
||||
if (classSet != null) {
|
||||
runBlocking {
|
||||
setInstance(result)
|
||||
}.result {
|
||||
memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Field [$it] takes ${it}ms [${hookTag}]") }
|
||||
}.result { ms ->
|
||||
memberInstances.takeIf { it.isNotEmpty() }?.forEach { onHookLogMsg(msg = "Find Field [$it] takes ${ms}ms [${hookTag}]") }
|
||||
}
|
||||
Result()
|
||||
} else Result(isNoSuch = true, Throwable("classSet is null"))
|
||||
|
@@ -211,7 +211,7 @@ abstract class BaseFinder internal constructor(
|
||||
/** 存在日志时输出日志 */
|
||||
internal fun printLogIfExist() {
|
||||
if (loggingContent != null) yLoggerE(
|
||||
msg = "${hookInstance?.hostTagName?.let { "$it " } ?: ""}NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]",
|
||||
msg = "NoSuch$tag happend in [$classSet] ${loggingContent?.first} [${hookTag}]",
|
||||
e = loggingContent?.second
|
||||
)
|
||||
/** 仅输出一次 - 然后清掉日志 */
|
||||
@@ -223,8 +223,7 @@ abstract class BaseFinder internal constructor(
|
||||
* @param msg 调试日志内容
|
||||
*/
|
||||
internal fun onHookLogMsg(msg: String) {
|
||||
if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge)
|
||||
hookInstance?.also { yLoggerI(msg = "${it.hostTagName} $msg") } ?: yLoggerI(msg = msg)
|
||||
if (YukiHookAPI.Configs.isDebug && YukiHookBridge.hasXposedBridge) yLoggerI(msg = msg)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -76,8 +76,9 @@ enum class LoggerType {
|
||||
* @param tag 日志打印的标签
|
||||
* @param msg 日志打印的内容
|
||||
* @param e 异常堆栈信息
|
||||
* @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log]
|
||||
*/
|
||||
private fun baseLogger(format: String, type: LoggerType, tag: String, msg: String, e: Throwable? = null) {
|
||||
private fun baseLogger(format: String, type: LoggerType, tag: String, msg: String, e: Throwable? = null, isShowProcessName: Boolean = true) {
|
||||
/** 打印到 [Log] */
|
||||
fun loggerInLogd() = when (format) {
|
||||
"D" -> Log.d(tag, msg)
|
||||
@@ -89,8 +90,11 @@ private fun baseLogger(format: String, type: LoggerType, tag: String, msg: Strin
|
||||
|
||||
/** 打印到 [XposedBridge.log] */
|
||||
fun loggerInXposed() = runCatching {
|
||||
XposedBridge.log("[$tag][$format]--> $msg")
|
||||
e?.also { XposedBridge.log(it) }
|
||||
YukiHookBridge.hostProcessName.also {
|
||||
val appUserId = YukiHookBridge.findUserId(it)
|
||||
XposedBridge.log("[$tag][$format]${if (isShowProcessName) (if (appUserId != 0) "[$it][$appUserId]" else "[$it]") else ""}--> $msg")
|
||||
e?.also { e -> XposedBridge.log(e) }
|
||||
}
|
||||
}
|
||||
when (type) {
|
||||
LoggerType.LOGD -> loggerInLogd()
|
||||
@@ -106,38 +110,46 @@ private fun baseLogger(format: String, type: LoggerType, tag: String, msg: Strin
|
||||
/**
|
||||
* [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - D
|
||||
* @param msg 日志打印的内容
|
||||
* @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log]
|
||||
* @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false
|
||||
*/
|
||||
internal fun yLoggerD(msg: String, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerD(msg = msg)
|
||||
internal fun yLoggerD(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return
|
||||
baseLogger(format = "D", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName)
|
||||
}
|
||||
|
||||
/**
|
||||
* [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - I
|
||||
* @param msg 日志打印的内容
|
||||
* @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log]
|
||||
* @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false
|
||||
*/
|
||||
internal fun yLoggerI(msg: String, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerI(msg = msg)
|
||||
internal fun yLoggerI(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return
|
||||
baseLogger(format = "I", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName)
|
||||
}
|
||||
|
||||
/**
|
||||
* [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - W
|
||||
* @param msg 日志打印的内容
|
||||
* @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log]
|
||||
* @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false
|
||||
*/
|
||||
internal fun yLoggerW(msg: String, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerW(msg = msg)
|
||||
internal fun yLoggerW(msg: String, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return
|
||||
baseLogger(format = "W", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, isShowProcessName = isShowProcessName)
|
||||
}
|
||||
|
||||
/**
|
||||
* [YukiHookAPI] 向控制台和 [XposedBridge] 打印日志 - E
|
||||
* @param msg 日志打印的内容
|
||||
* @param e 可填入异常堆栈信息 - 将自动完整打印到控制台
|
||||
* @param isShowProcessName 是否显示当前进程名称 - 仅限 [XposedBridge.log]
|
||||
* @param isDisableLog 禁止打印日志 - 标识后将什么也不做 - 默认为 false
|
||||
*/
|
||||
internal fun yLoggerE(msg: String, e: Throwable? = null, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs) if (isDisableLog.not()) loggerE(msg = msg, e = e)
|
||||
internal fun yLoggerE(msg: String, e: Throwable? = null, isShowProcessName: Boolean = true, isDisableLog: Boolean = false) {
|
||||
if (YukiHookAPI.Configs.isAllowPrintingLogs.not() || isDisableLog) return
|
||||
baseLogger(format = "E", LoggerType.BOTH, YukiHookAPI.Configs.debugTag, msg, e, isShowProcessName)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -61,14 +61,6 @@ import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs
|
||||
*/
|
||||
open class PackageParam internal constructor(@PublishedApi internal var wrapper: PackageParamWrapper? = null) {
|
||||
|
||||
/**
|
||||
* 用于展示的 APP 包名
|
||||
* @return [String]
|
||||
*/
|
||||
@PublishedApi
|
||||
internal val exhibitName
|
||||
get() = wrapper?.exhibitName ?: "unknown"
|
||||
|
||||
/**
|
||||
* 获取当前 Hook APP 的 [ClassLoader]
|
||||
* @return [ClassLoader]
|
||||
|
@@ -56,12 +56,6 @@ class PackageParamWrapper internal constructor(
|
||||
var appResources: YukiResources? = null
|
||||
) {
|
||||
|
||||
/**
|
||||
* 用于展示的 APP 包名
|
||||
* @return [String]
|
||||
*/
|
||||
internal val exhibitName get() = if (type == HookEntryType.ZYGOTE) "android-zygote" else packageName
|
||||
|
||||
override fun toString() =
|
||||
"PackageParamWrapper [type] $type [packageName] $exhibitName [processName] $processName [appInfo] $appInfo [appResources] $appResources"
|
||||
"PackageParamWrapper [type] $type [packageName] $packageName [processName] $processName [appInfo] $appInfo [appResources] $appResources"
|
||||
}
|
@@ -60,6 +60,7 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.factory.YukiMemberReplacem
|
||||
import com.highcapable.yukihookapi.hook.xposed.bridge.inject.YukiHookBridge_Injector
|
||||
import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiHookModuleStatus
|
||||
import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel
|
||||
import com.highcapable.yukihookapi.hook.xposed.helper.YukiHookAppHelper
|
||||
import dalvik.system.PathClassLoader
|
||||
import de.robv.android.xposed.IXposedHookInitPackageResources
|
||||
import de.robv.android.xposed.IXposedHookLoadPackage
|
||||
@@ -88,6 +89,9 @@ object YukiHookBridge {
|
||||
/** [YukiHookDataChannel] 是否已经注册 */
|
||||
private var isDataChannelRegister = false
|
||||
|
||||
/** 当前 Hook 进程是否正处于 [IXposedHookZygoteInit.initZygote] */
|
||||
private var isInitializingZygote = false
|
||||
|
||||
/** 已在 [PackageParam] 中被装载的 APP 包名 */
|
||||
private val loadedPackageNames = HashSet<String>()
|
||||
|
||||
@@ -128,6 +132,12 @@ object YukiHookBridge {
|
||||
*/
|
||||
internal val moduleGeneratedVersion get() = YukiHookBridge_Injector.getModuleGeneratedVersion()
|
||||
|
||||
/**
|
||||
* 当前宿主正在进行的 Hook 进程标识名称
|
||||
* @return [String]
|
||||
*/
|
||||
internal val hostProcessName get() = if (isInitializingZygote) "android-zygote" else YukiHookAppHelper.currentPackageName() ?: "unknown"
|
||||
|
||||
/**
|
||||
* 获取当前系统框架的 [Context]
|
||||
* @return [Context] ContextImpl 实例对象
|
||||
@@ -235,6 +245,7 @@ object YukiHookBridge {
|
||||
appInfo: ApplicationInfo? = null,
|
||||
appResources: YukiResources? = null
|
||||
) = run {
|
||||
isInitializingZygote = type == HookEntryType.ZYGOTE
|
||||
if (packageParamWrappers[packageName] == null)
|
||||
if (type == HookEntryType.ZYGOTE || appClassLoader != null)
|
||||
PackageParamWrapper(
|
||||
|
Reference in New Issue
Block a user