feat: support single process multiple AppLifecycle instance

This commit is contained in:
2023-10-04 04:16:15 +08:00
parent 92106d6e92
commit ae71bea0a0
2 changed files with 56 additions and 34 deletions

View File

@@ -231,7 +231,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* - 在 [loadZygote] 中不会被装载 - 仅会在 [loadSystem]、[loadApp] 中装载
*
* - 作为 Hook API 装载时请使用原生的 [Application] 实现生命周期监听
* @param isOnFailureThrowToApp 是否在发生异常时将异常抛出给宿主 - 默认是
* @param isOnFailureThrowToApp 是否在发生异常时将异常抛出给宿主 - 默认是 (仅在第一个 Hooker 设置有效)
* @param initiate 方法体
*/
inline fun onAppLifecycle(isOnFailureThrowToApp: Boolean = true, initiate: AppLifecycle.() -> Unit) =
@@ -794,7 +794,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param result 回调 - ([Context] baseContext,[Boolean] 是否已执行 super)
*/
fun attachBaseContext(result: (baseContext: Context, hasCalledSuper: Boolean) -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.attachBaseContextCallback = result
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).attachBaseContextCallback = result
}
/**
@@ -802,7 +802,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param initiate 方法体
*/
fun onCreate(initiate: Application.() -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onCreateCallback = initiate
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).onCreateCallback = initiate
}
/**
@@ -810,7 +810,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param initiate 方法体
*/
fun onTerminate(initiate: Application.() -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onTerminateCallback = initiate
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).onTerminateCallback = initiate
}
/**
@@ -818,7 +818,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param initiate 方法体
*/
fun onLowMemory(initiate: Application.() -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onLowMemoryCallback = initiate
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).onLowMemoryCallback = initiate
}
/**
@@ -826,7 +826,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param result 回调 - ([Application] 当前实例,[Int] 类型)
*/
fun onTrimMemory(result: (self: Application, level: Int) -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onTrimMemoryCallback = result
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).onTrimMemoryCallback = result
}
/**
@@ -834,7 +834,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param result 回调 - ([Application] 当前实例,[Configuration] 配置实例)
*/
fun onConfigurationChanged(result: (self: Application, config: Configuration) -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onConfigurationChangedCallback = result
if (isCurrentScope) AppParasitics.AppLifecycleActor.get(this@PackageParam).onConfigurationChangedCallback = result
}
/**
@@ -844,7 +844,7 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
*/
fun registerReceiver(vararg action: String, result: (context: Context, intent: Intent) -> Unit) {
if (isCurrentScope && action.isNotEmpty())
AppParasitics.AppLifecycleCallback.onReceiverActionsCallbacks[action.value()] = Pair(action, result)
AppParasitics.AppLifecycleActor.get(this@PackageParam).onReceiverActionsCallbacks[action.value()] = action to result
}
/**
@@ -853,13 +853,14 @@ open class PackageParam internal constructor(internal var wrapper: PackageParamW
* @param result 回调 - ([Context] 当前上下文,[Intent] 当前 Intent)
*/
fun registerReceiver(filter: IntentFilter, result: (context: Context, intent: Intent) -> Unit) {
if (isCurrentScope) AppParasitics.AppLifecycleCallback.onReceiverFiltersCallbacks[filter.toString()] = Pair(filter, result)
if (isCurrentScope)
AppParasitics.AppLifecycleActor.get(this@PackageParam).onReceiverFiltersCallbacks[filter.toString()] = filter to result
}
/** 设置创建生命周期监听回调 */
internal fun build() {
AppParasitics.AppLifecycleCallback.isOnFailureThrowToApp = isOnFailureThrowToApp
AppParasitics.AppLifecycleCallback.isCallbackSetUp = true
if (AppParasitics.AppLifecycleActor.isOnFailureThrowToApp == null)
AppParasitics.AppLifecycleActor.isOnFailureThrowToApp = isOnFailureThrowToApp
}
}

View File

@@ -112,10 +112,13 @@ internal object AppParasitics {
/** [ClassLoader] 监听回调数组 */
private var classLoaderCallbacks = mutableMapOf<Int, (Class<*>) -> Unit>()
/** 当前 Hook APP (宿主) 的生命周期演绎者数组 */
private val appLifecycleActors = mutableMapOf<String, AppLifecycleActor>()
/**
* 当前 Hook APP (宿主) 的全局生命周期 [Application]
*
* 需要 [YukiHookAPI.Configs.isEnableDataChannel] or [AppLifecycleCallback.isCallbackSetUp] 才会生效
* 需要 [YukiHookAPI.Configs.isEnableDataChannel] or [appLifecycleActors] 不为空才会生效
*/
internal var hostApplication: Application? = null
@@ -267,36 +270,44 @@ internal object AppParasitics {
* @param throwable 当前异常
*/
fun YukiHookCallback.Param.throwToAppOrLogger(throwable: Throwable) {
if (AppLifecycleCallback.isOnFailureThrowToApp) this.throwable = throwable
if (AppLifecycleActor.isOnFailureThrowToApp != false) this.throwable = throwable
else YLog.innerE("An exception occurred during AppLifecycle event", e = throwable)
}
/** Hook [Application] 装载方法 */
runCatching {
if (AppLifecycleCallback.isCallbackSetUp) {
if (appLifecycleActors.isNotEmpty()) {
YukiHookHelper.hook(ApplicationClass.method { name = "attach"; param(ContextClass) }, object : YukiMemberHook() {
override fun beforeHookedMember(param: Param) {
runCatching {
(param.args?.get(0) as? Context?)?.also { AppLifecycleCallback.attachBaseContextCallback?.invoke(it, false) }
appLifecycleActors.forEach { (_, actor) ->
(param.args?.get(0) as? Context?)?.also { actor.attachBaseContextCallback?.invoke(it, false) }
}
}.onFailure { param.throwToAppOrLogger(it) }
}
override fun afterHookedMember(param: Param) {
runCatching {
(param.args?.get(0) as? Context?)?.also { AppLifecycleCallback.attachBaseContextCallback?.invoke(it, true) }
appLifecycleActors.forEach { (_, actor) ->
(param.args?.get(0) as? Context?)?.also { actor.attachBaseContextCallback?.invoke(it, true) }
}
}.onFailure { param.throwToAppOrLogger(it) }
}
})
YukiHookHelper.hook(ApplicationClass.method { name = "onTerminate" }, object : YukiMemberHook() {
override fun afterHookedMember(param: Param) {
runCatching {
(param.instance as? Application?)?.also { AppLifecycleCallback.onTerminateCallback?.invoke(it) }
appLifecycleActors.forEach { (_, actor) ->
(param.instance as? Application?)?.also { actor.onTerminateCallback?.invoke(it) }
}
}.onFailure { param.throwToAppOrLogger(it) }
}
})
YukiHookHelper.hook(ApplicationClass.method { name = "onLowMemory" }, object : YukiMemberHook() {
override fun afterHookedMember(param: Param) {
runCatching {
(param.instance as? Application?)?.also { AppLifecycleCallback.onLowMemoryCallback?.invoke(it) }
appLifecycleActors.forEach { (_, actor) ->
(param.instance as? Application?)?.also { actor.onLowMemoryCallback?.invoke(it) }
}
}.onFailure { param.throwToAppOrLogger(it) }
}
})
@@ -305,7 +316,7 @@ internal object AppParasitics {
runCatching {
val self = param.instance as? Application? ?: return
val type = param.args?.get(0) as? Int? ?: return
AppLifecycleCallback.onTrimMemoryCallback?.invoke(self, type)
appLifecycleActors.forEach { (_, actor) -> actor.onTrimMemoryCallback?.invoke(self, type) }
}.onFailure { param.throwToAppOrLogger(it) }
}
})
@@ -314,12 +325,12 @@ internal object AppParasitics {
runCatching {
val self = param.instance as? Application? ?: return
val config = param.args?.get(0) as? Configuration? ?: return
AppLifecycleCallback.onConfigurationChangedCallback?.invoke(self, config)
appLifecycleActors.forEach { (_, actor) -> actor.onConfigurationChangedCallback?.invoke(self, config) }
}.onFailure { param.throwToAppOrLogger(it) }
}
})
}
if (YukiHookAPI.Configs.isEnableDataChannel || AppLifecycleCallback.isCallbackSetUp)
if (YukiHookAPI.Configs.isEnableDataChannel || appLifecycleActors.isNotEmpty())
YukiHookHelper.hook(InstrumentationClass.method { name = "callApplicationOnCreate" }, object : YukiMemberHook() {
override fun afterHookedMember(param: Param) {
runCatching {
@@ -346,14 +357,16 @@ internal object AppParasitics {
}
}
hostApplication = it
AppLifecycleCallback.onCreateCallback?.invoke(it)
AppLifecycleCallback.onReceiverActionsCallbacks.takeIf { e -> e.isNotEmpty() }?.forEach { (_, e) ->
if (e.first.isNotEmpty()) IntentFilter().apply {
e.first.forEach { action -> addAction(action) }
}.registerReceiver(e.second)
appLifecycleActors.forEach { (_, actor) ->
actor.onCreateCallback?.invoke(it)
actor.onReceiverActionsCallbacks.takeIf { e -> e.isNotEmpty() }?.forEach { (_, e) ->
if (e.first.isNotEmpty()) IntentFilter().apply {
e.first.forEach { action -> addAction(action) }
}.registerReceiver(e.second)
}
actor.onReceiverFiltersCallbacks.takeIf { e -> e.isNotEmpty() }
?.forEach { (_, e) -> e.first.registerReceiver(e.second) }
}
AppLifecycleCallback.onReceiverFiltersCallbacks.takeIf { e -> e.isNotEmpty() }
?.forEach { (_, e) -> e.first.registerReceiver(e.second) }
runCatching {
/** 过滤系统框架与一系列服务组件包名不唯一的情况 */
if (isDataChannelRegistered ||
@@ -446,15 +459,23 @@ internal object AppParasitics {
}
/**
* 当前 Hook APP (宿主) 的生命周期回调处理类
* 当前 Hook APP (宿主) 的生命周期演绎者
*/
internal object AppLifecycleCallback {
internal class AppLifecycleActor {
/** 是否已设置回调 */
internal var isCallbackSetUp = false
internal companion object {
/** 是否在发生异常时将异常抛出给宿主 */
internal var isOnFailureThrowToApp = true
/** 是否在发生异常时将异常抛出给宿主 */
internal var isOnFailureThrowToApp: Boolean? = null
/**
* 获取、创建新的 [AppLifecycleActor]
* @param instance 实例
* @return [AppLifecycleActor]
*/
internal fun get(instance: Any) =
appLifecycleActors[instance.toString()] ?: AppLifecycleActor().apply { appLifecycleActors[instance.toString()] = this }
}
/** [Application.attachBaseContext] 回调 */
internal var attachBaseContextCallback: ((Context, Boolean) -> Unit)? = null