Skip to content

Commit 3b56218

Browse files
committed
Fix Xposed Module load scope single process multiple package names problem and make PackageParam to multiple instances in YukiXposedModule
1 parent 3e55d61 commit 3b56218

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/PackageParam.kt

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import com.highcapable.yukihookapi.hook.core.finder.classes.DexClassFinder
4646
import com.highcapable.yukihookapi.hook.core.finder.tools.ReflectionTool
4747
import com.highcapable.yukihookapi.hook.core.finder.type.factory.ClassConditions
4848
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
49+
import com.highcapable.yukihookapi.hook.log.yLoggerW
4950
import com.highcapable.yukihookapi.hook.param.wrapper.PackageParamWrapper
5051
import com.highcapable.yukihookapi.hook.utils.value
5152
import com.highcapable.yukihookapi.hook.xposed.bridge.YukiXposedModule
@@ -427,7 +428,21 @@ open class PackageParam internal constructor(@PublishedApi internal var wrapper:
427428
* 你可以在 Hooker 中继续装载 Hooker
428429
* @param hooker Hook 子类
429430
*/
430-
fun loadHooker(hooker: YukiBaseHooker) = hooker.assignInstance(packageParam = this)
431+
fun loadHooker(hooker: YukiBaseHooker) {
432+
hooker.wrapper?.also {
433+
if (it.packageName.isNotBlank() && it.type != HookEntryType.ZYGOTE)
434+
if (it.packageName == wrapper?.packageName)
435+
hooker.assignInstance(packageParam = this)
436+
else yLoggerW(
437+
msg = "This Hooker \"${hooker::class.java.name}\" is singleton or reused, " +
438+
"but the current process has multiple package name \"${wrapper?.packageName}\", " +
439+
"the original is \"${it.packageName}\"\n" +
440+
"Make sure your Hooker supports multiple instances for this situation\n" +
441+
"The process with package name \"${wrapper?.packageName}\" will be ignored"
442+
)
443+
else hooker.assignInstance(packageParam = this)
444+
} ?: hooker.assignInstance(packageParam = this)
445+
}
431446

432447
/**
433448
* 通过 [appClassLoader] 按指定条件查找并得到当前 Hook APP Dex 中的 [Class]

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/param/wrapper/PackageParamWrapper.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ internal class PackageParamWrapper internal constructor(
5454
var appResources: YukiResources? = null
5555
) {
5656

57+
/**
58+
* 获取当前包装实例的名称 ID
59+
* @return [String]
60+
*/
61+
internal val wrapperNameId get() = if (type == HookEntryType.ZYGOTE) "android-zygote" else packageName
62+
5763
/**
5864
* 获取当前正在进行的 Hook 进程是否正确
5965
*

yukihookapi/src/api/kotlin/com/highcapable/yukihookapi/hook/xposed/bridge/YukiXposedModule.kt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ internal object YukiXposedModule : IYukiXposedModuleLifecycle {
5757
/** 当前 Hook 进程是否正处于 Zygote */
5858
private var isInitializingZygote = false
5959

60-
/** 当前 [PackageParam] 实例 */
61-
private val packageParam = PackageParam()
60+
/** 当前 [PackageParam] 实例数组 */
61+
private val packageParams = HashMap<String, PackageParam>()
6262

6363
/** 已在 [PackageParam] 中被装载的 APP 包名 */
6464
private val loadedPackageNames = HashSet<String>()
@@ -126,6 +126,14 @@ internal object YukiXposedModule : IYukiXposedModuleLifecycle {
126126
return false
127127
}
128128

129+
/**
130+
* 实例化当前 [PackageParamWrapper] 到 [PackageParam]
131+
*
132+
* 如果实例不存在将会自动创建一个新实例
133+
* @return [PackageParam]
134+
*/
135+
private fun PackageParamWrapper.instantiate() = packageParams[wrapperNameId] ?: PackageParam().apply { packageParams[wrapperNameId] = this }
136+
129137
/**
130138
* 创建、修改 [PackageParamWrapper]
131139
*
@@ -206,7 +214,7 @@ internal object YukiXposedModule : IYukiXposedModuleLifecycle {
206214
else null
207215
}?.also {
208216
runCatching {
209-
if (it.isCorrectProcess) packageParamCallback?.invoke(packageParam.assign(it).apply { YukiHookAPI.printSplashInfo() })
217+
if (it.isCorrectProcess) packageParamCallback?.invoke(it.instantiate().assign(it).apply { YukiHookAPI.printSplashInfo() })
210218
if (it.type != HookEntryType.ZYGOTE && it.packageName == modulePackageName)
211219
AppParasitics.hookModuleAppRelated(it.appClassLoader, it.type)
212220
if (it.type == HookEntryType.PACKAGE) AppParasitics.registerToAppLifecycle(it.packageName)

0 commit comments

Comments
 (0)