From 11256bd933ca1f1cffb80c07baa4e69ba637ce9d Mon Sep 17 00:00:00 2001 From: yanglw Date: Sun, 14 Dec 2025 13:15:30 +0800 Subject: [PATCH] =?UTF-8?q?feat(core.runtime):=20=E6=94=AF=E6=8C=81Content?= =?UTF-8?q?=20Provider=E5=A4=9Aauthority=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/loader/managers/ComponentManager.kt | 22 ++++++++++++++----- .../managers/PluginContentProviderManager.kt | 16 +++++++++----- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/ComponentManager.kt b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/ComponentManager.kt index 0b8a1e78d..843f3d89a 100644 --- a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/ComponentManager.kt +++ b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/ComponentManager.kt @@ -60,6 +60,13 @@ abstract class ComponentManager : PluginComponentLauncher { abstract fun onBindContainerContentProvider(pluginContentProvider: ComponentName): ContainerProviderInfo + open fun onBindContainerContentProvider( + pluginContentProvider: ComponentName, + pluginAuthority: String + ): ContainerProviderInfo { + return onBindContainerContentProvider(pluginContentProvider) + } + override fun startActivity( shadowContext: ShadowContext, pluginIntent: Intent, @@ -212,11 +219,16 @@ abstract class ComponentManager : PluginComponentLauncher { pluginManifest.providers?.forEach { val componentName = ComponentName(applicationPackageName, it.className) - mPluginContentProviderManager!!.addContentProviderInfo( - loadParameters.partKey, - it, - onBindContainerContentProvider(componentName) - ) + it.authorities.split(";") + .filter { authority -> authority.isNotBlank() } + .forEach { authority -> + mPluginContentProviderManager!!.addContentProviderInfo( + loadParameters.partKey, + it, + onBindContainerContentProvider(componentName, authority), + authority + ) + } } pluginManifest.receivers?.forEach { diff --git a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginContentProviderManager.kt b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginContentProviderManager.kt index 9d211df6c..135c77d72 100644 --- a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginContentProviderManager.kt +++ b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginContentProviderManager.kt @@ -71,21 +71,22 @@ class PluginContentProviderManager() : UriConverter.UriParseDelegate { fun addContentProviderInfo( partKey: String, pluginProviderInfo: PluginManifest.ProviderInfo, - containerProviderInfo: ContainerProviderInfo + containerProviderInfo: ContainerProviderInfo, + pluginAuthority: String ) { - if (providerMap.containsKey(pluginProviderInfo.authorities)) { + if (providerMap.containsKey(pluginAuthority)) { throw RuntimeException("重复添加 ContentProvider") } - providerAuthorityMap[pluginProviderInfo.authorities] = containerProviderInfo.authority - var pluginProviderInfos: HashSet? = null + providerAuthorityMap[pluginAuthority] = containerProviderInfo.authority + var pluginProviderInfos: HashSet? if (pluginProviderInfoMap.containsKey(partKey)) { pluginProviderInfos = pluginProviderInfoMap[partKey] } else { pluginProviderInfos = HashSet() + pluginProviderInfoMap[partKey] = pluginProviderInfos } pluginProviderInfos?.add(pluginProviderInfo) - pluginProviderInfoMap.put(partKey, pluginProviderInfos) } fun createContentProviderAndCallOnCreate( @@ -105,7 +106,10 @@ class PluginContentProviderManager() : UriConverter.UriParseDelegate { providerInfo.authority = it.authorities providerInfo.grantUriPermissions = it.grantUriPermissions contentProvider?.attachInfo(context, providerInfo) - providerMap[it.authorities] = contentProvider + it.authorities + .split(";") + .filter { authority -> authority.isNotBlank() } + .forEach { authority -> providerMap[authority] = contentProvider } } catch (e: Exception) { throw RuntimeException( "partKey==$partKey className==${it.className} authorities==${it.authorities}",