API 异常处理

异常是在开发过程经常遇到的主要问题,这里介绍了 YukiHookAPI 在使用过程中可能遇到的常见异常以及处理方式。

这里的异常说明只会同步最新的 API 版本,较旧的 API 版本的异常将不会再进行说明,请始终保持 API 版本为最新。

非阻断异常

这些异常不会导致 APP 停止运行 (FC),但是会在控制台打印 E 级别的日志,也可能会停止继续执行相关功能。

exception

loggerE

Could not found any available Hook APIs in current environment! Aborted

异常原因

你的 Hook Framework 未在工作或并未成功装载当前 Hook API。

解决方案

请确认你在正确的地方装载了 YukiHookAPIencase 方法,详情请参考 作为 Xposed 模块使用的相关配置 以及 作为 Hook API 使用的相关配置

exception

loggerE

You cannot load a hooker in "onInit" or "onXposedEvent" method! Aborted

异常原因

你尝试在继承 IYukiHookXposedInit 的 Hook 入口类的 onInitonXposedEvent 方法中装载了 encase 方法。

示例如下

object HookEntry : IYukiHookXposedInit {

    override fun onInit() {
        // 错误的使用方法
        YukiHookAPI.encase {
            // Your code here.
        }
    }

    override fun onXposedEvent() {
        // 错误的使用方法
        YukiHookAPI.encase {
            // Your code here.
        }
    }

    override fun onHook() {
        // Your code here.
    }
}

解决方案

请在 onHook 方法中装载 encase 方法。

示例如下

object HookEntry : IYukiHookXposedInit {

    override fun onInit() {
        // 这里只能装载 configs 方法
        YukiHookAPI.configs {
            // Your code here.
        }
    }

    override fun onHook() {
        // ✅ 正确的使用方法
        YukiHookAPI.encase {
            // Your code here.
        }
    }
}
exception

loggerE

An exception occurred in the Hooking Process of YukiHookAPI

异常原因

YukiHookAPI 在装载 Xposed 入口方法时发生异常。

解决方案

这是一个异常汇总,如果你当前的 Hook 进程中发生了任何异常 (Hook 进程崩溃),都会使用此方式打印到控制台,请追溯异常发生的堆栈以定位你的代码问题位置。

exception

loggerE

An exception occurred when hooking internal function

异常原因

YukiHookAPI 在进行自身初始化 Hook 过程中发生异常。

解决方案

通常情况下这种错误不会轻易发生,若一旦发生此错误,可直接提交日志进行反馈。

exception

loggerE

YukiHookAPI try to load hook entry class failed

异常原因

YukiHookAPI 在尝试装载 Hook 入口类 onInitonHook 方法时发生了不能处理的异常或找不到入口类。

解决方案

通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

exception

loggerE

An exception occurred when YukiHookAPI loading Xposed Module

异常原因

YukiHookAPI 在尝试使用 Xposed 原生接口装载 Xposed 模块时发生了不能处理的异常。

解决方案

通常情况下这种错误不会轻易发生,若一旦发生此错误,请自行查看控制台打印的日志定位问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

exception

loggerE

Failed to execute method "NAME", maybe your Hook Framework not support Resources Hook

异常原因

YukiHookAPI 在尝试进行 Resources Hook 时发生错误。

解决方案

请仔细检查错误日志的详细信息。

若发生 Resources$NotFoundException 则可能为你查找的 Resources Id 不正确。

若发生 ClassNotFoundNoClassDefFoundError 可能是 Hook Framework 不支持 Resources Hook(资源钩子)。

exception

loggerE

HookClass [NAME] not found

异常原因

当前被 Hook 的 Class 没有被找到。

解决方案

请检查目标 Class 是否存在,若想忽略此错误请使用 ignoredHookClassNotFoundFailure 方法。

exception

loggerE

Hook Member [NAME] failed

异常原因

Hook 目标方法、构造方法时发生错误。

解决方案

此问题通常由 Hook Framework 产生,请检查对应的日志内容,若问题持续出现请携带详细日志进行反馈。

exception

loggerE

Hooked Member with a finding error / by CLASS

异常原因

在 Hook 执行后被 Hook 的 membernull 且已经设置目标 Hook 方法、构造类。

解决方案

请检查此错误发生前的上一个错误日志,或许在查找方法、构造方法的时候发生了找不到方法、构造方法的错误。

exception

loggerE

Hooked Member cannot be null / by CLASS

异常原因

在 Hook 执行后被 Hook 的 membernull 且没有设置目标 Hook 方法、构造类。

示例如下

injectMember {
    // 这里并没有设置需要 Hook 的方法、构造方法的查找条件
    after {
        // ...
    }
}

解决方案

请确认你已经在 Hook 之前正确设置了要 Hook 的方法、构造方法的查找方式。

示例如下

injectMember {
    // ✅ 正确的使用方法举例
    method {
        // Your code here.
    }
    after {
        // ...
    }
}
exception

loggerE

Hooked method return type match failed, required [TYPE] but got [TYPE]

异常原因

在 Hook 回调方法体中设置了 HookParam.result 或使用了 replaceHook 但是被 Hook 的方法返回值类型与原返回值类型不匹配。

示例如下

假设这个是被 Hook 的方法。

private boolean test()

下面是一个错误的案列。

method {
    name = "test"
    emptyParam()
}.hook {
    // <情景1> 设置了错误的类型,原类型为 Boolean
    before {
        result = 0
    }
    // <情景2> 返回了错误的类型,原类型为 Boolean
    replaceAny {
        0
    }
    // <情景3> 直接使用了错误的类型,原类型为 Boolean
    replaceTo(any = 0)
}

注意

若上述场景在 beforeafter 中发生,则会造成被 Hook 的 APP (宿主) 由 XposedBridge 抛出异常 (会对其暴露被 Hook 的事实)。

解决方案

请确认当前被 Hook 方法的正确返回值类型,修改后再试一次。

exception

loggerE

Hook initialization failed because got an exception

异常原因

在准备 Hook 时发生了任意的异常。

解决方案

这是一个准备 Hook 阶段就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

exception

loggerE

Try to hook NAME[NAME] got an exception

异常原因

在 Hook 开始时发生了任意的异常。

解决方案

这是一个 Hook 开始就发生异常的提醒,请仔细查看具体的异常是什么以重新确定问题。

exception

loggerE

Method/Constructor/Field match type "TYPE" not allowed

异常原因

在查找方法、构造方法以及变量时设置了不允许的参数类型。

示例如下

// 查找一个方法
method {
    // 设置了无效的类型举例
    param(false, 1, 0)
    // 设置了无效的类型举例
    returnType = false
}

// 查找一个变量
field {
    // 设置了无效的类型举例
    type = false
}

解决方案

在查找中 paramreturnTypetype 中仅接受 ClassStringVariousClass 类型的传值,不可传入参数实例。

示例如下

// 查找一个方法
method {
    // ✅ 正确的使用方法举例
    param(BooleanType, IntType, IntType)
    // ✅ 正确的使用方法举例
    returnType = BooleanType
    // ✅ 以下方案也是正确的
    returnType = "java.lang.Boolean"
}

// 查找一个变量
field {
    // ✅ 正确的使用方法举例
    type = BooleanType
}
exception

loggerE

NoSuchMethod/NoSuchConstructor/NoSuchField happend in [NAME]

异常原因

在查找方法、构造方法以及变量时并未找到目标方法、构造方法以及变量。

解决方案

请确认你的查找条件是否能正确匹配到目标 Class 中的指定方法、构造方法以及变量。

exception

loggerE

Trying COUNT times and all failure by RemedyPlan

异常原因

使用 RemedyPlan 重新查找方法、构造方法、变量时依然没有找到方法、构造方法、变量。

解决方案

请确认你设置的 RemedyPlan 参数以及宿主内存在的 Class,再试一次。

exception

loggerE

Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

异常原因

通过 ClassLoader.searchClassPackageParam.searchClass 找不到需要查找的 Class 对象。

示例如下

customClassLoader?.searchClass {
    from(...)
    // ...
}.get()

解决方案

这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Dex 中的 Class 以及字节码对象特征,并再试一次。

exception

loggerE

Can't find this Method/Constructor/Field in [CLASS]: CONTENT Generated by YukiHookAPI#ReflectionTool

异常原因

通过指定条件找不到需要查找的方法、构造方法以及变量。

示例如下

TargetClass.method {
    name = "test"
    param(BooleanType)
}

解决方案

这是一个安全异常,请检查你设置的条件,使用相关工具查看所在 Class 中的字节码对象特征,并再试一次。

exception

loggerE

The number of VagueType must be at least less than the count of paramTypes

异常原因

MethodConstructor 查找条件中错误地使用了 VagueType

示例如下

TargetClass.method {
    name = "test"
    // <情景1>
    param(VagueType)
    // <情景2>
    param(VagueType, VagueType ...)
}

解决方案

VagueType 不能在方法、构造方法参数中完全填充,若存在这样的需求请使用 paramCount

exception

loggerE

Field match type class is not found

异常原因

在查找变量时所设置的查找条件中 typeClass 实例未被找到。

示例如下

field {
    name = "test"
    // 假设这里设置的 type 的 Class 并不存在
    type = "com.example.TestClass"
}

解决方案

请检查查找条件中 typeClass 是否存在,然后再试一次。

exception

loggerE

Method match returnType class is not found

异常原因

在查找方法时所设置的查找条件中 returnTypeClass 实例未被找到。

示例如下

method {
    name = "test"
    // 假设这里设置的 returnType 的 Class 并不存在
    returnType = "com.example.TestClass"
}

解决方案

请检查查找条件中 returnTypeClass 是否存在,然后再试一次。

exception

loggerE

Method/Constructor match paramType[INDEX] class is not found

异常原因

在查找方法、构造方法时所设置的查找条件中 paramindex 号下标的 Class 实例未被找到。

method {
    name = "test"
    // 假设这里设置的 1 号下标的 Class 并不存在
    param(StringClass, "com.example.TestClass", BooleanType)
}

解决方案

请检查查找条件中 paramindex 号下标的 Class 是否存在,然后再试一次。

exception

loggerE

Invoke original Member [MEMBER] failed

异常原因

在使用 HookParam.callOriginalHookParam.invokeOriginalmethod { ... }.get(...).original() 调用未经 Hook 的原始方法时发生错误。

解决方案

一般情况下,此错误基本上不会发生,若发生此错误,可能为当前使用的 Hook Framework 问题,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

Failed to got Host Resources

异常原因

在查找 Resources 时使用 replaceTo { ... }replaceToModuleResource { ... } 时未能获取到宿主的原始 Resources 实例对象。

示例如下

conditions {
    name = "test"
    string()
}
replaceTo { "${it}_some_text" }

解决方案

一般情况下,此错误基本上不会发生,若发生此错误,可能为当前使用的 Hook Framework 问题,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

Resources Hook condition name/type cannot be empty [TAG]

异常原因

在查找 Resources 时并未设置任何条件。

示例如下

// 情况 1
conditions {
    // 这里没有设置任何条件
}
// 情况 2
conditions {
    name = "test"
    // 这里缺少了 type 条件
}

解决方案

Resources 的 Hook 并非类似方法的 Hook,其必须拥有完整的名称和类型描述才能查找成功,请将查找条件补充完整并再试一次。

exception

loggerE

Resources Hook type is invalid [TAG]

异常原因

在 Hook Resources 时发生了类型错误的异常。

解决方案

YukiHookAPI 会尝试在 initZygotehandleInitPackageResources 中装载 Resources Hook,若全部装载失败可能会发生此异常,当前 Hook Framework 需要支持并启用资源钩子 (Resources Hook) 功能,请检查后再试一次。

exception

loggerE

Resources Hook got an exception [TAG]

异常原因

在 Hook Resources 时发生了任意的异常。

解决方案

这是一个异常汇总,请自行向下查看日志具体的异常是什么,例如找不到 Resources Id 的问题。

exception

loggerE

Received action "ACTION" failed

异常原因

使用 YukiHookDataChannel 时回调广播事件异常。

解决方案

此异常多为一些关联性异常引发,请检查自身代码是否存在问题,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

Received data type TYPE is not a vailed YukiHookDataChannel's data

异常原因

使用 YukiHookDataChannel 时回调广播收到了不属于 YukiHookDataChannel 的数据。

解决方案

为了确保数据安全性,YukiHookDataChannel 会对发送的数据进行包装,任何第三方广播事件均不能被 YukiHookDataChannel 接收,请检查你的代码是否正确。

exception

loggerE

Unsupported segments data key of "KEY"'s type

异常原因

使用 YukiHookDataChannel 时回调广播收到了不支持的分段数据类型。

解决方案

一般情况下,此错误不可能发生,因为 YukiHookDataChannel 所支持的分段数据类型是固定的,不会动态改变,若发生这种情况,请检查是否改动了 API 相关代码。

exception

loggerE

YukiHookDataChannel cannot merge this segments data key of "KEY"

异常原因

使用 YukiHookDataChannel 时回调广播收到了无法处理的分段数据导致无法合并分段数据。

解决方案

一般情况下,此错误基本上不会发生,除非收到连续发送或重复发送的广播 (时序异常) 或在接收数据时设置了错误的泛型类型,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

YukiHookDataChannel cannot calculate the byte size of the data key of "KEY" to be sent, so this data cannot be sent

If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

异常原因

使用 YukiHookDataChannel 发送广播数据时计算数据大小失败。

解决方案

一般情况下,此错误基本上不会发生,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

YukiHookDataChannel cannot send this data key of "KEY" type TYPE, because it is too large (total TOTAL KB, limit LIMIT KB) and cannot be segmented

SUGGESTION_MESSAGE

If you want to lift this restriction, use the allowSendTooLargeData function when calling, but this may cause the app crash

异常原因

使用 YukiHookDataChannel 发送广播数据时数据过大,但是此数据类型并不支持被分段发送。

解决方案

当你发送的数据超出系统广播的上限时,YukiHookDataChannel 默认情况下会将此数据分段后依次发送,但仅支持处理 ListMapSetString 常见类型的自动分段功能。

小提示

若你仍要使用此功能,请参考 YukiHookDataChannel.NameSpace.allowSendTooLargeData 方法。

但是强烈建议不要这样做这有可能会导致系统不允许过大的数据发送而造成应用崩溃

exception

loggerE

Failed to sendBroadcast like "KEY", because got null context in "PACKAGENAME"

异常原因

使用 YukiHookDataChannel 时发送广播取到了空的上下文实例。

解决方案

一般情况下,此错误基本上不会发生,在最新版本中已经修复宿主使用时可能发生的问题,若最新版本依然发生错误,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

Failed to inject module resources into [RESOURCES]

异常原因

在 (Xposed) 宿主环境中使用 injectModuleAppResources 注入模块资源时发生异常。

解决方案

一般情况下,此错误基本上不会发生,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

You cannot inject module resources into yourself

异常原因

在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 injectModuleAppResources 将模块自身的资源注入自身。

解决方案

由于模块自身也可以被自身 Hook,但你并不可以在模块自身注入自己 (不能递归自身的资源),若你一定要获取模块自身的资源,请直接使用即可,无需任何其它操作。

exception

loggerE

Activity Proxy initialization failed because got an exception

异常原因

在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

解决方案

请检查此错误发生后的下一个错误日志,或许在配置参数上可能发生了一些问题,若找不到相关错误日志的说明,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

Activity Proxy got an exception in msg.what [WHAT]

异常原因

在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时发生异常。

解决方案

一般情况下,此错误基本上不会发生,但根据系统版本差异性并未做详细测试,排除自身代码的问题后,请携带详细日志进行反馈。

exception

loggerE

This proxy [TYPE] type is not allowed

异常原因

在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时填入了无效的参数。

示例如下

//  这里填入的内容仅为举例,其中 proxy 填入了不能理解的无效参数
registerModuleAppActivities(proxy = false)

解决方案

方法中的 proxy 参数只接受 StringCharSequenceClass 类型,请查看相关使用方法正确填入方法参数。

exception

loggerE

Cound not got launch intent for package "NAME"

异常原因

在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时找不到宿主的启动 Activity

示例如下

// 使用了默认参数直接进行注册
registerModuleAppActivities()

解决方案

默认参数 (无参) 只能用于可被启动的 APP,若 APP 并未声明启动入口 Activity,你就需要手动指定方法的 proxy 参数。

exception

loggerE

Could not found "NAME" or Class is not a type of Activity

异常原因

在 (Xposed) 宿主环境中使用 registerModuleAppActivities 注入模块 Activity 时无法找到被填入参数 proxyActivity

示例如下

registerModuleAppActivities(proxy = "com.demo.test.TestActivity")

解决方案

请确认你填入的 Activity 名称真实有效地存在于宿主中,且目标 Class 继承于 Activity

exception

loggerE

You cannot register Activity Proxy into yourself

异常原因

在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 registerModuleAppActivities 将模块自身 Activity 注入自身。

解决方案

由于模块自身也可以被自身 Hook,但你并不可以在模块自身注入自己 (不能递归自身的资源),若你一定要获取模块自身的资源,请直接使用即可,无需任何其它操作。

exception

loggerE

Activity Proxy only support for Android 7.0 (API 24) or higher

异常原因

在 (Xposed) 宿主环境 (模块自身的 Xposed 环境) 中使用 registerModuleAppActivities 但是当前系统版本不满足 Android 7.0 (API 24) 最低要求。

解决方案

Activity Proxy 仅支持高于或等于 Android 7.0 (API 24) 的系统,请尝试升级你的系统或对模块 APP 最低系统版本兼容性做出要求,例如设置 Min API 为 24。

exception

loggerE

An exception occurred during AppLifecycle event

异常原因

在 (Xposed) 宿主环境中使用 onAppLifecycle 监听宿主生命周期期间发生异常。

解决方案

此异常为 onAppLifecycle 中抛出,由于你设置了参数 isOnFailureThrowToApp = false,异常没有在宿主中被抛出而是在 (Xposed) 宿主环境中进行打印,这不属于 API 的异常,请仔细检查自身代码的问题。

阻断异常

这些异常会直接导致 APP 停止运行 (FC),同时会在控制台打印 E 级别的日志,还会造成 Hook 进程“死掉”。

exception

IllegalStateException

YukiHookAPI cannot support current Hook API or cannot found any available Hook APIs in current environment

异常原因

YukiHookAPI 不支持当前环境使用的 Hook API 或不存在 Hook API 可被调用。

解决方案

请确认你在正确的地方装载了 YukiHookAPIencase 方法,详情请参考 作为 Xposed 模块使用的相关配置 以及 作为 Hook API 使用的相关配置

exception

NoClassDefFoundError

Can't find this Class in [CLASSLOADER]: CONTENT Generated by YukiHookAPI#ReflectionTool

异常原因

通过 String.toClass(...)classOf<...>() 找不到需要查找的 Class 对象。

示例如下

"com.demo.Test".toClass()

解决方案

请检查当前字符串或实体匹配到的 Class 是否存在于当前 ClassLoader,并再试一次。

exception

IllegalStateException

ClassLoader [CLASSLOADER] is not a DexClassLoader

异常原因

使用 ClassLoader.searchClassPackageParam.searchClass 查找 Class 但是当前 ClassLoader 并不继承于 BaseDexClassLoader

解决方案

这种情况基本不存在,除非当前 APP 引用了非 ART 平台的可执行文件 (但是这种情况还是不会存在) 或当前 ClassLoader 为空。

exception

IllegalStateException

Failed to got SystemContext

异常原因

在被 Hook 的宿主内调用了 systemContext 但并未成功获取到实例对象。

示例如下

encase {
    // 调用了此变量
    systemContext...
}

解决方案

这种情况不应该存在,由于 systemContext 通过反射从 ActivityThread 中得到,除非系统进程发生异常,否则获取到的对象不会为空。

exception

IllegalStateException

App is dead, You cannot call to appContext

异常原因

第一种情况

在被 Hook 的宿主内调用了 ModuleApplicationappContext

示例如下

encase {
    // 调用了此变量
    ModuleApplication.appContext...
}

第二种情况

使用 ModuleApplication 时调用了 appContext 但是 APP 可能已经被销毁或没有正确启动。

示例如下

// 调用了此变量但是 APP 可能已被销毁或没有正确启动
ModuleApplication.appContext...

解决方案

第一种情况

你只能在模块内使用 ModuleApplicationappContext,在宿主内请使用 PackageParam 中的 appContext,请确认你使用的是否正确。

第二种情况

这种情况基本不存在,由于 appContext 是在 onCreate 中被赋值的,除非遇到多进程并发启动或 APP 没有启动完成前被反射调用了父类的 onCreate 方法。

exception

IllegalStateException

YukiHookPrefsBridge not allowed in Custom Hook API

异常原因

在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookPrefsBridge

示例如下

class MyApplication : Application() {

    override fun attachBaseContext(base: Context?) {
        YukiHookAPI.encase(base) {
            // 不能在这种情况下使用 prefs
            prefs.getBoolean("test_data")
        }
        super.attachBaseContext(base)
    }
}

解决方案

你只能在 作为 Xposed 模块使用 时使用 YukiHookPrefsBridge,在 Hook 自身 APP 中请使用原生的 Sp 存储。

exception

IllegalStateException

Cannot load the XSharedPreferences, maybe is your Hook Framework not support it

异常原因

在 (Xposed) 宿主环境使用了 YukiHookPrefsBridge 但是无法得到 XSharedPreferences 对象。

示例如下

encase {
    // 调用了此变量
    prefs...
}

解决方案

一般情况下不会发生此问题,若持续无法获取 XSharedPreferences 对象则可能是你使用的 Hook Framework 不支持此功能或自身存在错误。

exception

IllegalStateException

YukiHookDataChannel not allowed in Custom Hook API

异常原因

在 Hook 自身 APP(非 Xposed 模块) 中使用了 YukiHookDataChannel

示例如下

class MyApplication : Application() {

    override fun attachBaseContext(base: Context?) {
        YukiHookAPI.encase(base) {
            // 不能在这种情况下使用 dataChannel
            dataChannel.wait(key = "test_data") {
                // ...
            }
        }
        super.attachBaseContext(base)
    }
}

解决方案

你只能在 作为 Xposed 模块使用 时使用 YukiHookDataChannel

exception

IllegalStateException

Xposed modulePackageName load failed, please reset and rebuild it

异常原因

在 Hook 过程中使用 YukiHookPrefsBridgeYukiHookDataChannel 时无法读取装载时的 modulePackageName 导致不能确定自身模块的包名。

解决方案

请仔细阅读 这里 的帮助文档,正确配置模块的 Hook 入口类包名。

exception

IllegalStateException

YukiHookPrefsBridge missing Context instance

异常原因

在模块中使用了 YukiHookPrefsBridge 存储数据但并未传入 Context 实例。

示例如下

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 错误的使用方法
        // 构造方法已在 API 1.0.88 及以后的版本中设置为 private
        YukiHookPrefsBridge().getBoolean("test_data")
    }
}

解决方案

Activity 中推荐使用 prefs(...) 方法来装载 YukiHookPrefsBridge

示例如下

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ✅ 正确的使用方法
        prefs().getBoolean("test_data")
    }
}
exception

IllegalStateException

The Host App's Context has not yet initialized successfully, the native function cannot be used at this time

异常原因

在 (Xposed) 宿主环境 PackageParam 中使用了 YukiHookPrefsBridge 并调用了 native 方法但此时宿主的生命周期并未初始化。

示例如下

encase {
    // 调用了此方法
    prefs.native()
}

解决方案

native 方法需要一个存在的 Context 对象用于存储数据,你可以在监听宿主生命周期状态中使用此方法。

exception

IllegalStateException

Key-Value type TYPE is not allowed

异常原因

在使用 YukiHookPrefsBridgegetput 方法或 YukiHookDataChannelwaitput 方法时传入了不支持的存储类型。

解决方案

YukiHookPrefsBridge 支持的类型只有 StringSet<String>IntFloatLongBoolean,请传入支持的类型。

YukiHookDataChannel 支持的类型为 Intent.putExtra 限制的类型,请传入支持的类型。

exception

IllegalStateException

loadApp/loadZygote/loadSystem/withProcess method need a "NAME" param

异常原因

loadApploadZygoteloadSystemwithProcess 中缺少了需要填写的可变数组变量参数。

示例如下

// <情景 1>
loadApp()
// <情景 2> 
loadZygote()
// <情景 3>
loadSystem()
// <情景 4>
withProcess()

解决方案

请查看 PackageParam 中的用法正确地使用此功能。

exception

IllegalStateException

YukiHookDataChannel cannot used in zygote

异常原因

loadZygote 中使用了 YukiHookDataChannel

示例如下

loadZygote {
    // 调用了此变量
    dataChannel...
}

解决方案

YukiHookDataChannel 只能在 loadSystemloadApp 中使用。

exception

IllegalStateException

Custom Hooking Members is empty

异常原因

MemberHookCreator 中调用 members() 但是未设置需要 Hook 的 Member 实例。

示例如下

injectMember {
    // 括号里的方法参数被留空了
    members()
    after {
        // ...
    }
}

解决方案

若要使用 members() 设置自定义 Hook 方法,你必须保证其方法参数里的 Member 数组对象不能为空。

exception

IllegalStateException

HookParam Method args index must be >= 0

异常原因

HookParam 中调用 args().last() 但是目标 param 为空或 args 中的 index 设置了小于 0 的数值。

示例如下

injectMember {
    // ...
    after {
        // 假设 param 是空的
        args().last()...
        // 设置了小于 0 的 index
        args(index = -5)...
    }
}

解决方案

请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,且不能对 args 的下标设置小于 0 的数值。

exception

IllegalStateException

HookParam instance got null! Is this a static member?

异常原因

HookParam 中调用 instance 变量或 instance 方法但获取不到当前实例的对象。

示例如下

injectMember {
    // ...
    after {
        // 调用了此变量
        instance...
        // 调用了此方法
        instance<Any>()...
    }
}

解决方案

请确认你 Hook 的方法是否为静态类型,静态类型的方法没有实例,不能使用此功能,若非静态方法,请检查实例是否已经销毁。

exception

IllegalStateException

Current hooked Member args is null

异常原因

HookParam 中调用 args 变量但获取不到当前实例方法、构造方法的参数数组。

示例如下

injectMember {
    // ...
    after {
        // 调用了此变量
        args...
    }
}

解决方案

这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

exception

IllegalStateException

Current hooked Member is null

异常原因

HookParam 中调用 member 变量但获取不到当前实例的方法、构造方法实例。

示例如下

injectMember {
    // ...
    after {
        // 调用了此变量
        member...
    }
}

解决方案

这种问题一般不会发生,真的发生了此问题,请携带详细日志进行反馈。

exception

IllegalStateException

Current hooked Member is not a Method

异常原因

HookParam 中调用 method 变量但获取不到当前实例的方法实例。

示例如下

injectMember {
    // ...
    after {
        // 调用了此变量
        method...
    }
}

解决方案

请确认你 Hook 的方法是构造方法还是普通方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

exception

IllegalStateException

Current hooked Member is not a Constructor

异常原因

HookParam 中调用 constructor 变量但获取不到当前实例的方法实例。

示例如下

injectMember {
    // ...
    after {
        // 调用了此变量
        constructor...
    }
}

解决方案

请确认你 Hook 的方法是普通方法还是构造方法并使用对应类型的方法获取指定的实例,若不知道字节码的类型可以直接使用 member 来获取。

exception

IllegalStateException

HookParam instance cannot cast to TYPE

异常原因

HookParam 中调用 instance 方法指定了错误的类型。

示例如下

injectMember {
    // ...
    after {
        // 类型被 cast 为 Activity 但假设当前实例的类型并非此类型
        instance<Activity>()...
    }
}

解决方案

请确认当前 Hook 实例的正确类型并重新填写泛型中的类型,若不能确定请使用 Any 或直接使用 instance 变量。

exception

IllegalStateException

HookParam Method args is empty, mabe not has args

异常原因

HookParam 中调用 ArgsModifyer.set 方法但是当前实例的方法参数数组为空。

示例如下

injectMember {
    // ...
    after {
        // 调用了此方法
        args(...).set(...)
    }
}

解决方案

请确认你 Hook 的目标方法、构造方法的方法参数数量是否不为空,否则你无法使用此功能。

exception

IllegalStateException

HookParam Method args index out of bounds, max is NUMBER

异常原因

HookParam 中调用 ArgsModifyer.set 方法指定了超出方法参数下标的数组序号。

示例如下

injectMember {
    // ...
    after {
        // 下标从 0 开始,假设原始的参数下标是 5 个,但是这里填写了 6
        args(index = 6).set(...)
    }
}

解决方案

请确认你 Hook 的目标方法、构造方法的方法参数个数,并重新设置数组下标。

exception

IllegalStateException

Current Hook Framework not support moduleAppResources

异常原因

PackageParam 中调用了 moduleAppResources 变量但是无法获取到实例对象。

示例如下

encase {
    // 调用了此变量
    moduleAppResources...
}

解决方案

这种情况几乎不存在,除非目标 Hook Framework 自身存在问题,若真的发生了此问题,请携带详细日志进行反馈。

exception

IllegalStateException

VariousClass match failed of those CLASSES

异常原因

在使用 VariousClass 创建不确定的 Class 对象时全部的 Class 都没有被找到。

解决方案

检查当前 Hook 的宿主内是否存在其中能够匹配的 Class 后,再试一次。

exception

IllegalStateException

Cannot get hook class "NAME" cause THROWABLE

异常原因

hook 方法体非 onPrepareHook 方法内调用了 instanceClass 变量且当前 Hook 的 Class 不存在。

示例如下

TargetClass.hook {
    // 可能的情况为在非 onPrepareHook 方法体内调用了 instanceClass 变量用于打印日志
    loggerD(msg = "$instanceClass hook start")
}

解决方案

hook 内直接使用 instanceClass 是很危险的,若 Class 不存在则会直接导致 Hook 进程“死掉”。

详情请参考 状态监听

exception

IllegalStateException

Use of searchClass { ... }.hook { ... } is an error, please use like searchClass { ... }.get()?.hook { ... }

异常原因

使用 searchClass { ... }.hook { ... } 方式直接创建了 Hook 实例。

解决方案

请使用 searchClass { ... }.get()?.hook { ... } 方式创建 Hook 实例。

exception

IllegalStateException

This type [TYPE] not support to hook, supported are Constructors and Methods

异常原因

使用 Member.hook { ... } 时创建了不支持 Hook 的成员对象,例如 Field

解决方案

你只能 Hook ConstructorMethod

exception

IllegalStateException

LayoutInflatedParam View instance got null

异常原因

在布局 Hook 回调中调用了 currentView 但没取到实例对象。

示例如下

injectResource {
    conditions {
        name = "activity_main"
        layout()
    }
    injectAsLayout {
        // 调用了此变量
        currentView...
    }
}

解决方案

这种情况基本上不存在,除非被 Hook 的宿主当前 Activity 已经销毁或 Hook Framework 自身存在问题。

exception

IllegalStateException

XResForwarder is invalid

异常原因

YukiResForwarder 中调用了 resources 但没取到实例对象。

示例如下

// 调用了此变量
moduleAppResources.fwd(...).resources

解决方案

这种情况基本上不存在,除非 Hook Framework 自身存在问题。

exception

IllegalStateException

paramTypes is empty, please use emptyParam() instead

异常原因

在查找方法、构造方法时保留了空的 param 方法。

示例如下

method {
    name = "test"
    // 括号内没有填写任何参数
    param()
}

解决方案

若要标识此方法、构造方法没有参数,你可以有如下设置方法。

第一种,设置 emptyParam (推荐)

示例如下

method {
    name = "test"
    emptyParam()
}

第二种,设置 paramCount = 0

示例如下

method {
    name = "test"
    paramCount = 0
}
exception

IllegalStateException

Invalid YukiHookCallback type

异常原因

YukiHookAPI 的核心 Hook 功能发生故障。

解决方案

这种情况基本上不存在,若发生上述问题,确定并非自己的代码发生的问题后,可提交日志进行反馈。

exception

IllegalStateException

ModuleContextThemeWrapper already loaded

异常原因

Context 中使用 applyModuleTheme 方法时重复进行调用。

示例如下

// 假设这就是当前的 Context 对象
context.applyModuleTheme(R.style.Theme_AppCompat).applyModuleTheme(R.style.Theme_AppCompat)

解决方案

Context 中只能创建一次 ModuleContextThemeWrapper,请检查代码是否有循环调用问题。

exception

IllegalStateException

Cannot create classes cache for "android", please remove "name" param

异常原因

在系统框架 (android) 宿主使用了 DexClassFinder 的缓存功能 searchClass(name = ...)

示例如下

loadSystem {
    searchClass(name = "test") {
        from(...)
        // ...
    }.get()
}

解决方案

由于缓存会将找到的 Class 名称存入 SharedPreferences,但是系统框架不存在 data 目录,所以请不要在系统框架中使用此功能。

exception

IllegalStateException

Target Class type cannot cast to TYPE

异常原因

使用 Class.toClassClass.toClassOrNullGenericClass.argument 方法将字符串类名转换为目标 Class 时声明了错误的类型。

以下使用 Class.toClass 方法来进行示例。

示例如下

// 假设目标类型是 Activity 但是被错误地转换为了 WrongClass 类型
val clazz = "android.app.Activity".toClass<WrongClass>()

解决方案

示例如下

// <解决方案 1> 填写正确的类型
val clazz1 = "android.app.Activity".toClass<Activity>()
// <解决方案 2> 不填写泛型声明
val clazz2 = "android.app.Activity".toClass()

请确保执行方法后声明的泛型是指定的目标 Class 类型,在不确定目标类型的情况下你可以不需要填写泛型声明。