Modify move package name to global host process name and set to current logger in LoggerFactory

This commit is contained in:
2022-08-08 01:18:47 +08:00
parent 36aa4a55c0
commit 9a2a86d8b4
11 changed files with 65 additions and 62 deletions

View File

@@ -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 的方法、构造方法。

View File

@@ -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 核心功能实现类。

View File

@@ -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 入口类

View File

@@ -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"
/**

View File

@@ -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 查找条件实现类
*/

View File

@@ -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"))

View File

@@ -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)
}
/**

View File

@@ -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)
}
/**

View File

@@ -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]

View File

@@ -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"
}

View File

@@ -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(