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 0362d072..6c4fe907 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 @@ -217,14 +217,25 @@ class YukiHookXposedProcessor : SymbolProcessorProvider { packageName.split(".hook")[0] else error("Cannot identify your Module App's package name, please manually configure the package name") } - val injectPackageName = "com.highcapable.yukihookapi.hook.xposed.application.inject" + val mdAppInjectPackageName = "com.highcapable.yukihookapi.hook.xposed.application.inject" + val ykBridgeInjectPackageName = "com.highcapable.yukihookapi.hook.xposed.bridge.inject" /** 插入 ModuleApplication_Injector 代码 */ codeGenerator.createNewFile( dependencies = Dependencies.ALL_FILES, - packageName = injectPackageName, + packageName = mdAppInjectPackageName, fileName = "ModuleApplication_Injector" ).apply { - write(CodeSourceFileTemplate.getModuleApplicationInjectorFileByteArray(injectPackageName, packageName, entryClassName)) + write(CodeSourceFileTemplate.getModuleApplicationInjectorFileByteArray(mdAppInjectPackageName, packageName, entryClassName)) + flush() + close() + } + /** 插入 YukiHookBridge_Injector 代码 */ + codeGenerator.createNewFile( + dependencies = Dependencies.ALL_FILES, + packageName = ykBridgeInjectPackageName, + fileName = "YukiHookBridge_Injector" + ).apply { + write(CodeSourceFileTemplate.getYukiHookBridgeInjectorFileByteArray(ykBridgeInjectPackageName, entryClassName)) flush() close() } diff --git a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/sources/CodeSourceFileTemplate.kt b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/sources/CodeSourceFileTemplate.kt index f7fe62af..aff173f3 100644 --- a/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/sources/CodeSourceFileTemplate.kt +++ b/yukihookapi-ksp-xposed/src/api/kotlin/com/highcapable/yukihookapi_ksp_xposed/sources/CodeSourceFileTemplate.kt @@ -80,6 +80,24 @@ object CodeSourceFileTemplate { " }\n" + "}").toByteArray() + /** + * 获得 YukiHookBridge_Injector 注入文件 + * @param packageName 包名 + * @param entryClassName 入口类名 + * @return [ByteArray] + */ + fun getYukiHookBridgeInjectorFileByteArray(packageName: String, entryClassName: String) = + ("@file:Suppress(\"ClassName\")\n" + + "\n" + + "package $packageName\n" + + "\n" + + getCommentContent(entryClassName, currrentClassTag = "YukiHookBridge") + + "object YukiHookBridge_Injector {\n" + + "\n" + + " @JvmStatic\n" + + " fun getModuleGeneratedVersion() = \"${System.currentTimeMillis()}\"\n" + + "}").toByteArray() + /** * 获得 xposed_init 注入文件 * @param packageName 包名 diff --git a/yukihookapi/libs/bridge-injector.jar b/yukihookapi/libs/bridge-injector.jar new file mode 100644 index 00000000..1a7a8383 Binary files /dev/null and b/yukihookapi/libs/bridge-injector.jar differ diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt index 8c2edd27..69bf15b8 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookBridge.kt @@ -25,7 +25,7 @@ * * This file is Created by fankes on 2022/4/3. */ -@file:Suppress("unused") +@file:Suppress("unused", "StaticFieldLeak") package com.highcapable.yukihookapi.hook.xposed.bridge @@ -41,7 +41,7 @@ import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper import com.highcapable.yukihookapi.hook.xposed.YukiHookModuleStatus import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiModuleResources import com.highcapable.yukihookapi.hook.xposed.bridge.dummy.YukiResources -import com.highcapable.yukihookapi.hook.xposed.channel.YukiHookDataChannel +import com.highcapable.yukihookapi.hook.xposed.bridge.inject.YukiHookBridge_Injector import de.robv.android.xposed.* import de.robv.android.xposed.callbacks.XC_InitPackageResources import de.robv.android.xposed.callbacks.XC_LoadPackage @@ -72,9 +72,6 @@ object YukiHookBridge { /** 当前 [PackageParamWrapper] 实例数组 */ private var packageParamWrappers = HashMap() - /** 已在 [YukiHookDataChannel] 注册的包名数组 */ - private val dataChannelRegisters = HashSet() - /** 当前 [PackageParam] 方法体回调 */ internal var packageParamCallback: (PackageParam.() -> Unit)? = null @@ -90,6 +87,12 @@ object YukiHookBridge { */ internal val dynamicModuleAppResources get() = runCatching { YukiModuleResources.createInstance(moduleAppFilePath) }.getOrNull() + /** + * 自动生成的 Xposed 模块构建版本号 + * @return [String] + */ + internal val moduleGeneratedVersion get() = YukiHookBridge_Injector.getModuleGeneratedVersion() + /** * 模块是否装载了 Xposed 回调方法 *