diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/YukiHookXposedProcessor.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/YukiHookXposedProcessor.kt index 2c27c435..1aa81aff 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/YukiHookXposedProcessor.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/YukiHookXposedProcessor.kt @@ -275,6 +275,30 @@ class YukiHookXposedProcessor : SymbolProcessorProvider { packageName = PackageName.YukiXposedModuleStatus_Impl, content = data.sources()[ClassName.YukiXposedModuleStatus_Impl] ) + /** 插入 HandlerDelegateImpl_Impl 代码 */ + createCodeFile( + fileName = ClassName.HandlerDelegateImpl_Impl, + packageName = PackageName.HandlerDelegateImpl_Impl, + content = data.sources()[ClassName.HandlerDelegateImpl_Impl] + ) + /** 插入 HandlerDelegateClass 代码 */ + createCodeFile( + fileName = ClassName.HandlerDelegateClass, + packageName = PackageName.HandlerDelegateClass, + content = data.sources()[ClassName.HandlerDelegateClass] + ) + /** 插入 IActivityManagerProxyImpl_Impl 代码 */ + createCodeFile( + fileName = ClassName.IActivityManagerProxyImpl_Impl, + packageName = PackageName.IActivityManagerProxyImpl_Impl, + content = data.sources()[ClassName.IActivityManagerProxyImpl_Impl] + ) + /** 插入 IActivityManagerProxyClass 代码 */ + createCodeFile( + fileName = ClassName.IActivityManagerProxyClass, + packageName = PackageName.IActivityManagerProxyClass, + content = data.sources()[ClassName.IActivityManagerProxyClass] + ) /** 插入 xposed_init 代码 */ createCodeFile( fileName = data.xInitClassName, diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt index 4007905a..8636e18e 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/factory/CodeSourceFileFactory.kt @@ -38,6 +38,10 @@ object PackageName { const val YukiHookAPI_Impl = "com.highcapable.yukihookapi" const val ModuleApplication_Impl = "com.highcapable.yukihookapi.hook.xposed.application" const val YukiXposedModuleStatus_Impl = "com.highcapable.yukihookapi.hook.xposed.bridge.status" + const val HandlerDelegateImpl_Impl = "com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl" + const val HandlerDelegateClass = "com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate" + const val IActivityManagerProxyImpl_Impl = "com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl" + const val IActivityManagerProxyClass = "com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate" const val BootstrapReflectionClass = "com.highcapable.yukihookapi.thirdparty.me.weishu.reflection" } @@ -48,6 +52,10 @@ object ClassName { const val YukiHookAPI_Impl = "YukiHookAPI_Impl" const val ModuleApplication_Impl = "ModuleApplication_Impl" const val YukiXposedModuleStatus_Impl = "YukiXposedModuleStatus_Impl" + const val HandlerDelegateImpl_Impl = "HandlerDelegateImpl_Impl" + const val HandlerDelegateClass = "HandlerDelegate" + const val IActivityManagerProxyImpl_Impl = "IActivityManagerProxyImpl_Impl" + const val IActivityManagerProxyClass = "IActivityManagerProxy" const val XposedInit = "xposed_init" const val XposedInit_Impl = "xposed_init_Impl" const val BootstrapClass = "BootstrapClass" @@ -66,6 +74,13 @@ object YukiXposedModuleStatusJvmName { const val GET_EXECUTOR_VERSION_CODE_METHOD_NAME = "___-" } +/** + * 创建尾部包名名称 + * @param name 前置名称 + * @return [String] + */ +private fun GenerateData.tailPackageName(name: String) = "${name}_${modulePackageName.replace(".", "_")}" + /** * 创建文件注释 * @param entryClassName 入口类名 - 空则不生成 @@ -166,6 +181,74 @@ fun GenerateData.sources() = mapOf( " if (System.currentTimeMillis() == 0L) Log.d(\"${(1000..9999).random()}\", \"${(100000..999999).random()}\")\n" + " }\n" + "}"), + ClassName.HandlerDelegateImpl_Impl to ("@file:Suppress(\"ClassName\")\n" + + "\n" + + "package ${PackageName.HandlerDelegateImpl_Impl}\n" + + "\n" + + "import android.os.Handler\n" + + "import com.highcapable.yukihookapi.annotation.YukiGenerateApi\n" + + "import ${PackageName.HandlerDelegateClass}.${tailPackageName(ClassName.HandlerDelegateClass)}\n" + + "\n" + + createCommentContent(currrentClassTag = ClassName.HandlerDelegateImpl_Impl) + + "@YukiGenerateApi\n" + + "object ${ClassName.HandlerDelegateImpl_Impl} {\n" + + "\n" + + " val wrapperClassName get() = \"${PackageName.HandlerDelegateClass}.${tailPackageName(ClassName.HandlerDelegateClass)}\"\n" + + "\n" + + " fun createWrapper(baseInstance: Handler.Callback? = null): Handler.Callback = ${tailPackageName(ClassName.HandlerDelegateClass)}(baseInstance)\n" + + "}"), + ClassName.HandlerDelegateClass to ("@file:Suppress(\"ClassName\")\n" + + "\n" + + "package ${PackageName.HandlerDelegateClass}\n" + + "\n" + + "import android.os.Handler\n" + + "import android.os.Message\n" + + "import androidx.annotation.Keep\n" + + "import com.highcapable.yukihookapi.annotation.YukiGenerateApi\n" + + "import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller.HandlerDelegateCaller\n" + + "\n" + + createCommentContent(currrentClassTag = ClassName.HandlerDelegateClass) + + "@Keep\n" + + "@YukiGenerateApi\n" + + "class ${tailPackageName(ClassName.HandlerDelegateClass)}(private val baseInstance: Handler.Callback?) : Handler.Callback {\n" + + "\n" + + " override fun handleMessage(msg: Message) = HandlerDelegateCaller.callHandleMessage(baseInstance, msg)\n" + + "}"), + ClassName.IActivityManagerProxyImpl_Impl to ("@file:Suppress(\"ClassName\")\n" + + "\n" + + "package ${PackageName.IActivityManagerProxyImpl_Impl}\n" + + "\n" + + "import android.os.Handler\n" + + "import com.highcapable.yukihookapi.annotation.YukiGenerateApi\n" + + "import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller.IActivityManagerProxyCaller\n" + + "import ${PackageName.IActivityManagerProxyClass}.${tailPackageName(ClassName.IActivityManagerProxyClass)}\n" + + "import java.lang.reflect.Proxy\n" + + "\n" + + createCommentContent(currrentClassTag = ClassName.IActivityManagerProxyImpl_Impl) + + "@YukiGenerateApi\n" + + "object ${ClassName.IActivityManagerProxyImpl_Impl} {\n" + + "\n" + + " fun createWrapper(clazz: Class<*>?, instance: Any) = \n" + + " Proxy.newProxyInstance(IActivityManagerProxyCaller.currentClassLoader, arrayOf(clazz), ${tailPackageName(ClassName.IActivityManagerProxyClass)}(instance))\n" + + "}"), + ClassName.IActivityManagerProxyClass to ("@file:Suppress(\"ClassName\")\n" + + "\n" + + "package ${PackageName.IActivityManagerProxyClass}\n" + + "\n" + + "import androidx.annotation.Keep\n" + + "import com.highcapable.yukihookapi.annotation.YukiGenerateApi\n" + + "import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller.IActivityManagerProxyCaller\n" + + "import java.lang.reflect.InvocationHandler\n" + + "import java.lang.reflect.Method\n" + + "import java.lang.reflect.Proxy\n" + + "\n" + + createCommentContent(currrentClassTag = ClassName.IActivityManagerProxyClass) + + "@Keep\n" + + "@YukiGenerateApi\n" + + "class ${tailPackageName(ClassName.IActivityManagerProxyClass)}(private val baseInstance: Any) : InvocationHandler {\n" + + "\n" + + " override fun invoke(proxy: Any?, method: Method?, args: Array?) = IActivityManagerProxyCaller.callInvoke(baseInstance, method, args)\n" + + "}"), ClassName.XposedInit to ("@file:Suppress(\"ClassName\")\n" + "\n" + "package $entryPackageName\n" + diff --git a/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl_Impl.kt b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl_Impl.kt new file mode 100644 index 00000000..ff2026c7 --- /dev/null +++ b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl_Impl.kt @@ -0,0 +1,56 @@ +/* + * YukiHookAPI - An efficient Hook API and Xposed Module solution built in Kotlin. + * Copyright (C) 2019-2023 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2023/4/8. + * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java + */ +@file:Suppress("ClassName", "UNUSED_PARAMETER") + +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl + +import android.os.Handler + +/** + * HandlerDelegateImpl 注入 Stub + */ +object HandlerDelegateImpl_Impl { + + /** + * 获取 [Handler.Callback] 实例 [Class] 名称 + * + * 返回值将在每次编译时自动生成 + * @return [String] + */ + val wrapperClassName get(): String = error("Stub!") + + /** + * 从 [Handler.Callback] 创建实例 + * + * 方法内容将在每次编译时自动生成 + * @param baseInstance [Handler.Callback] 实例 - 可空 + * @return [Handler.Callback] + */ + fun createWrapper(baseInstance: Handler.Callback? = null): Handler.Callback = error("Stub!") +} \ No newline at end of file diff --git a/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl_Impl.kt b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl_Impl.kt new file mode 100644 index 00000000..9e2acf14 --- /dev/null +++ b/yukihookapi-stub/src/main/java/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl_Impl.kt @@ -0,0 +1,49 @@ +/* + * YukiHookAPI - An efficient Hook API and Xposed Module solution built in Kotlin. + * Copyright (C) 2019-2023 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2023/4/8. + * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java + */ +@file:Suppress("unused", "ClassName", "UNUSED_PARAMETER") + +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl + +import android.app.ActivityManager + +/** + * IActivityManagerProxyImpl 注入 Stub + */ +object IActivityManagerProxyImpl_Impl { + + /** + * 创建 [ActivityManager] 代理 + * + * 方法内容将在每次编译时自动生成 + * @param clazz 代理的目标 [Class] + * @param instance 代理的目标实例 + * @return [Any] 代理包装后的实例 + */ + fun createWrapper(clazz: Class<*>?, instance: Any): Any = error("Stub!") +} \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt index 6127fe85..5559d332 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/AppParasitics.kt @@ -55,9 +55,9 @@ import com.highcapable.yukihookapi.hook.xposed.bridge.status.YukiXposedModuleSta import com.highcapable.yukihookapi.hook.xposed.bridge.type.HookEntryType import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig -import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.HandlerDelegate -import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.IActivityManagerProxy import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.InstrumentationDelegate +import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl.HandlerDelegateImpl +import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl.IActivityManagerProxyImpl /** * 这是一个管理 APP 寄生功能的控制类 @@ -381,8 +381,8 @@ internal object AppParasitics { ?.also { field { name = "mInstrumentation" }.set(InstrumentationDelegate.wrapper(it)) } HandlerClass.field { name = "mCallback" }.get(field { name = "mH" }.any()).apply { cast()?.apply { - if (current().name != classOf().name) set(HandlerDelegate.wrapper(baseInstance = this)) - } ?: set(HandlerDelegate.wrapper()) + if (current().name != HandlerDelegateImpl.wrapperClassName) set(HandlerDelegateImpl.createWrapper(baseInstance = this)) + } ?: set(HandlerDelegateImpl.createWrapper()) } } /** Patched [ActivityManager] */ @@ -392,10 +392,10 @@ internal object AppParasitics { }.getOrNull() ?: ActivityManagerClass.field { name = "IActivityManagerSingleton" }.ignored().get().any() }.getOrNull()?.also { default -> SingletonClass.field { name = "mInstance" }.ignored().result { - get(default).apply { any()?.also { set(IActivityManagerProxy.wrapper(IActivityManagerClass, it)) } } + get(default).apply { any()?.also { set(IActivityManagerProxyImpl.createWrapper(IActivityManagerClass, it)) } } ActivityTaskManagerClass?.field { name = "IActivityTaskManagerSingleton" }?.ignored()?.get()?.any()?.also { singleton -> SingletonClass.method { name = "get" }.ignored().get(singleton).call() - get(singleton).apply { any()?.also { set(IActivityManagerProxy.wrapper(IActivityTaskManagerClass, it)) } } + get(singleton).apply { any()?.also { set(IActivityManagerProxyImpl.createWrapper(IActivityTaskManagerClass, it)) } } } } } diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/HandlerDelegate.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/HandlerDelegateCaller.kt similarity index 86% rename from yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/HandlerDelegate.kt rename to yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/HandlerDelegateCaller.kt index d1486ddc..a62a4a89 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/HandlerDelegate.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/HandlerDelegateCaller.kt @@ -23,10 +23,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * This file is Created by fankes on 2022/8/8. + * This file is Created by fankes on 2023/4/8. * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java */ -package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate +@file:Suppress("unused") + +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller import android.app.Activity import android.content.Intent @@ -34,6 +36,7 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Message +import com.highcapable.yukihookapi.annotation.YukiGenerateApi import com.highcapable.yukihookapi.hook.factory.current import com.highcapable.yukihookapi.hook.factory.field import com.highcapable.yukihookapi.hook.factory.method @@ -46,28 +49,29 @@ import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig /** - * 代理当前 [Handler.Callback] - * @param baseInstance 原始实例 + * 代理当前 [Handler.Callback] 调用类 + * + * - ❗装载代码将自动生成 - 请勿手动调用 */ -internal class HandlerDelegate private constructor(private val baseInstance: Handler.Callback?) : Handler.Callback { +@YukiGenerateApi +object HandlerDelegateCaller { - internal companion object { + /** 启动 [Activity] */ + private const val LAUNCH_ACTIVITY = 100 - /** 启动 [Activity] */ - private const val LAUNCH_ACTIVITY = 100 + /** 执行事务处理 */ + private const val EXECUTE_TRANSACTION = 159 - /** 执行事务处理 */ - private const val EXECUTE_TRANSACTION = 159 - - /** - * 从 [Handler.Callback] 创建 [HandlerDelegate] 实例 - * @param baseInstance [Handler.Callback] 实例 - 可空 - * @return [HandlerDelegate] - */ - internal fun wrapper(baseInstance: Handler.Callback? = null) = HandlerDelegate(baseInstance) - } - - override fun handleMessage(msg: Message): Boolean { + /** + * 调用代理的 [Handler.Callback.handleMessage] 方法 + * + * - ❗装载代码将自动生成 - 请勿手动调用 + * @param baseInstance 原始实例 + * @param msg 当前消息实例 + * @return [Boolean] + */ + @YukiGenerateApi + fun callHandleMessage(baseInstance: Handler.Callback?, msg: Message): Boolean { when (msg.what) { LAUNCH_ACTIVITY -> runCatching { msg.obj.current(ignored = true).field { name = "intent" }.apply { diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/IActivityManagerProxy.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt similarity index 73% rename from yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/IActivityManagerProxy.kt rename to yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt index b15750ea..df377235 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/IActivityManagerProxy.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/caller/IActivityManagerProxyCaller.kt @@ -23,39 +23,50 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * - * This file is Created by fankes on 2022/8/8. + * This file is Created by fankes on 2023/4/8. * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java */ -package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate +@file:Suppress("unused") + +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.caller import android.app.ActivityManager import android.content.Intent +import com.highcapable.yukihookapi.annotation.YukiGenerateApi import com.highcapable.yukihookapi.hook.xposed.bridge.YukiXposedModule import com.highcapable.yukihookapi.hook.xposed.parasitic.AppParasitics import com.highcapable.yukihookapi.hook.xposed.parasitic.activity.config.ActivityProxyConfig import java.lang.reflect.InvocationHandler import java.lang.reflect.Method -import java.lang.reflect.Proxy /** - * 代理当前 [ActivityManager] - * @param baseInstance 原始实例 + * 代理当前 [ActivityManager] 调用类 + * + * - ❗装载代码将自动生成 - 请勿手动调用 */ -internal class IActivityManagerProxy private constructor(private val baseInstance: Any) : InvocationHandler { +@YukiGenerateApi +object IActivityManagerProxyCaller { - internal companion object { + /** + * 获取当前使用的 [ClassLoader] + * + * - ❗装载代码将自动生成 - 请勿手动调用 + * @return [ClassLoader] + */ + @YukiGenerateApi + val currentClassLoader get() = AppParasitics.baseClassLoader - /** - * 创建 [IActivityManagerProxy] 代理 - * @param clazz 代理的目标 [Class] - * @param instance 代理的目标实例 - * @return [Any] 代理包装后的实例 - */ - internal fun wrapper(clazz: Class<*>?, instance: Any) = - Proxy.newProxyInstance(AppParasitics.baseClassLoader, arrayOf(clazz), IActivityManagerProxy(instance)) - } - - override fun invoke(proxy: Any?, method: Method?, args: Array?): Any? { + /** + * 调用代理的 [InvocationHandler.invoke] 方法 + * + * - ❗装载代码将自动生成 - 请勿手动调用 + * @param baseInstance 原始实例 + * @param method 被调用方法 + * @param args 被调用方法参数 + * @return [Any] or null + */ + @YukiGenerateApi + fun callInvoke(baseInstance: Any, method: Method?, args: Array?): Any? { if (method?.name == "startActivity") args?.indexOfFirst { it is Intent }?.also { index -> val argsInstance = (args[index] as? Intent) ?: return@also val component = argsInstance.component diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl.kt new file mode 100644 index 00000000..f3fb73ef --- /dev/null +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/HandlerDelegateImpl.kt @@ -0,0 +1,50 @@ +/* + * YukiHookAPI - An efficient Hook API and Xposed Module solution built in Kotlin. + * Copyright (C) 2019-2023 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2023/4/8. + * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java + */ +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl + +import android.os.Handler + +/** + * 代理当前 [Handler.Callback] 调用接口实现 + */ +internal object HandlerDelegateImpl { + + /** + * 获取 [Handler.Callback] 实例 [Class] 名称 + * @return [String] + */ + internal val wrapperClassName get() = HandlerDelegateImpl_Impl.wrapperClassName + + /** + * 从 [Handler.Callback] 创建实例 + * @param baseInstance [Handler.Callback] 实例 - 可空 + * @return [Handler.Callback] + */ + internal fun createWrapper(baseInstance: Handler.Callback? = null) = HandlerDelegateImpl_Impl.createWrapper(baseInstance) +} \ No newline at end of file diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl.kt new file mode 100644 index 00000000..24b4bb54 --- /dev/null +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/parasitic/activity/delegate/impl/IActivityManagerProxyImpl.kt @@ -0,0 +1,45 @@ +/* + * YukiHookAPI - An efficient Hook API and Xposed Module solution built in Kotlin. + * Copyright (C) 2019-2023 HighCapable + * https://github.com/fankes/YukiHookAPI + * + * MIT License + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + * This file is Created by fankes on 2023/4/8. + * Thanks for providing https://github.com/cinit/QAuxiliary/blob/main/app/src/main/java/io/github/qauxv/lifecycle/Parasitics.java + */ +package com.highcapable.yukihookapi.hook.xposed.parasitic.activity.delegate.impl + +import android.app.ActivityManager + +/** + * 代理当前 [ActivityManager] 调用接口实现 + */ +internal object IActivityManagerProxyImpl { + + /** + * 创建 [ActivityManager] 代理 + * @param clazz 代理的目标 [Class] + * @param instance 代理的目标实例 + * @return [Any] 代理包装后的实例 + */ + internal fun createWrapper(clazz: Class<*>?, instance: Any) = IActivityManagerProxyImpl_Impl.createWrapper(clazz, instance) +} \ No newline at end of file