From a1ab3a5c9101412a461ab9889f8437d41fc10522 Mon Sep 17 00:00:00 2001 From: Fankesyooni Date: Sat, 9 Apr 2022 23:32:15 +0800 Subject: [PATCH] Fix a possible bug when Xposed loaded --- .../highcapable/yukihookapi/YukiHookAPI.kt | 25 ++++++------------- .../xposed/bridge/YukiHookXposedBridge.kt | 8 +++++- 2 files changed, 14 insertions(+), 19 deletions(-) diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt index 95077f48..7cc7f2aa 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/YukiHookAPI.kt @@ -45,7 +45,6 @@ import com.highcapable.yukihookapi.hook.store.MemberCacheStore import com.highcapable.yukihookapi.hook.xposed.bridge.YukiHookXposedBridge import com.highcapable.yukihookapi.hook.xposed.prefs.YukiHookModulePrefs import de.robv.android.xposed.XposedBridge -import de.robv.android.xposed.callbacks.XC_LoadPackage import java.lang.reflect.Constructor import java.lang.reflect.Field import java.lang.reflect.Member @@ -166,19 +165,10 @@ object YukiHookAPI { /** * 装载 Xposed API 回调核心实现方法 - * @param lpparam Xposed [XC_LoadPackage.LoadPackageParam] + * @param wrapper 代理包装 [PackageParamWrapper] */ - internal fun onXposedLoaded(lpparam: XC_LoadPackage.LoadPackageParam) = - YukiHookXposedBridge.packageParamCallback?.invoke( - PackageParam( - PackageParamWrapper( - packageName = lpparam.packageName, - processName = lpparam.processName, - appClassLoader = lpparam.classLoader, - appInfo = lpparam.appInfo - ) - ).apply { printSplashLog() } - ) + internal fun onXposedLoaded(wrapper: PackageParamWrapper) = + YukiHookXposedBridge.packageParamCallback?.invoke(PackageParam(wrapper)).apply { printSplashLog() } /** * 配置 [YukiHookAPI] 相关参数 @@ -269,9 +259,6 @@ object YukiHookAPI { else printNoXposedEnvLog() } - /** 输出找不到 [XposedBridge] 的错误日志 */ - private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted") - /** 输出欢迎信息调试日志 */ private fun printSplashLog() { if (Configs.isDebug.not() || isShowSplashLogOnceTime.not() || YukiHookXposedBridge.isModulePackageXposedEnv) return @@ -279,12 +266,14 @@ object YukiHookAPI { yLoggerI(msg = "Welcome to YukiHookAPI $API_VERSION_NAME($API_VERSION_CODE)! Using $executorName API $executorVersion") } + /** 输出找不到 [XposedBridge] 的错误日志 */ + private fun printNoXposedEnvLog() = yLoggerE(msg = "Could not found XposedBridge in current space! Aborted") + /** * 通过 baseContext 创建 Hook 入口类 * @return [PackageParam] */ - private val Context.packagePararm - get() = PackageParam(PackageParamWrapper(packageName, processName, classLoader, applicationInfo)) + private val Context.packagePararm get() = PackageParam(PackageParamWrapper(packageName, processName, classLoader, applicationInfo)) /** * 是否存在 [XposedBridge] diff --git a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookXposedBridge.kt b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookXposedBridge.kt index dcda3845..a55df25e 100644 --- a/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookXposedBridge.kt +++ b/yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiHookXposedBridge.kt @@ -32,6 +32,7 @@ package com.highcapable.yukihookapi.hook.xposed.bridge import com.highcapable.yukihookapi.YukiHookAPI import com.highcapable.yukihookapi.annotation.YukiGenerateApi import com.highcapable.yukihookapi.hook.param.PackageParam +import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper import de.robv.android.xposed.IXposedHookLoadPackage import de.robv.android.xposed.callbacks.XC_LoadPackage @@ -94,5 +95,10 @@ object YukiHookXposedBridge { * @param lpparam Xposed [XC_LoadPackage.LoadPackageParam] */ @YukiGenerateApi - fun callXposedLoaded(lpparam: XC_LoadPackage.LoadPackageParam) = YukiHookAPI.onXposedLoaded(lpparam) + fun callXposedLoaded(lpparam: XC_LoadPackage.LoadPackageParam) { + /** 判断基础 API 可能为空的情况 */ + if (lpparam.packageName == null || lpparam.processName == null || lpparam.appInfo == null || lpparam.classLoader == null) return + /** 回调 Xposed API 装载 */ + YukiHookAPI.onXposedLoaded(PackageParamWrapper(lpparam.packageName, lpparam.processName, lpparam.classLoader, lpparam.appInfo)) + } } \ No newline at end of file