diff --git a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginPackageManagerImpl.kt b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginPackageManagerImpl.kt index dbba9abd9..5f74ac3f9 100644 --- a/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginPackageManagerImpl.kt +++ b/projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginPackageManagerImpl.kt @@ -19,6 +19,7 @@ package com.tencent.shadow.core.loader.managers import android.content.ComponentName +import android.content.Intent import android.content.pm.* import com.tencent.shadow.core.runtime.PluginPackageManager @@ -78,4 +79,19 @@ internal class PluginPackageManagerImpl(private val hostPackageManager: PackageM && it.applicationInfo.uid == uid }.flatMap { it.providers.asIterable() } } + + override fun resolveActivity(intent: Intent, flags: Int): ResolveInfo { + val hostResolveInfo = hostPackageManager.resolveActivity(intent, flags) + return if (hostResolveInfo?.activityInfo == null) { + ResolveInfo().apply { + activityInfo = allPluginPackageInfo() + .flatMap { it.activities.asIterable() } + .find { + it.name == intent.component?.className + } + } + } else { + hostResolveInfo + } + } } \ No newline at end of file diff --git a/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java b/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java index 69846f1bd..5dc66086b 100644 --- a/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java +++ b/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java @@ -20,11 +20,13 @@ import android.annotation.TargetApi; import android.content.ComponentName; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; import android.content.pm.VersionedPackage; import android.os.Build; @@ -67,4 +69,8 @@ public static List queryContentProviders(ClassLoader classLoaderOf return getPluginPackageManager(classLoaderOfInvokeCode).queryContentProviders(processName, uid, flags); } + public static ResolveInfo resolveActivity(ClassLoader classLoaderOfInvokeCode, Intent intent, int flags) { + return getPluginPackageManager(classLoaderOfInvokeCode).resolveActivity(intent, flags); + } + } diff --git a/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java b/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java index d3b61c7ba..73f92a997 100644 --- a/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java +++ b/projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java @@ -1,10 +1,12 @@ package com.tencent.shadow.core.runtime; import android.content.ComponentName; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; import java.util.List; @@ -18,4 +20,6 @@ public interface PluginPackageManager { ProviderInfo resolveContentProvider(String name, int flags); List queryContentProviders(String processName, int uid, int flags); + + ResolveInfo resolveActivity(Intent intent, int flags); } diff --git a/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/PackageManagerTransform.kt b/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/PackageManagerTransform.kt index 0114d6a0c..6c6332512 100644 --- a/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/PackageManagerTransform.kt +++ b/projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/PackageManagerTransform.kt @@ -104,6 +104,7 @@ class PackageManagerTransform : SpecificTransform() { "getPackageInfo", "resolveContentProvider", "queryContentProviders", + "resolveActivity", ) ) } diff --git a/projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/tencent/shadow/test/cases/plugin_main/PackageManagerTest.java b/projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/tencent/shadow/test/cases/plugin_main/PackageManagerTest.java index f475b1008..27cca8e49 100644 --- a/projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/tencent/shadow/test/cases/plugin_main/PackageManagerTest.java +++ b/projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/tencent/shadow/test/cases/plugin_main/PackageManagerTest.java @@ -41,4 +41,9 @@ public void testQueryContentProvidersName() { matchTextWithViewTag("queryContentProviders/size", "2"); matchTextWithViewTag("queryContentProviders/name", "[android.support.v4.content.FileProvider, com.tencent.shadow.test.plugin.general_cases.lib.usecases.provider.TestProvider]"); } + + @Test + public void testResolveActivityByExplicitIntent() { + matchTextWithViewTag("resolveActivity/explicit", "com.tencent.shadow.test.plugin.general_cases.lib.usecases.packagemanager.TestPackageManagerActivity"); + } } diff --git a/projects/test/plugin/general-cases/general-cases-app/src/androidTest/java/com/tencent/shadow/test/plugin/general_cases/app/PackageManagerTest.java b/projects/test/plugin/general-cases/general-cases-app/src/androidTest/java/com/tencent/shadow/test/plugin/general_cases/app/PackageManagerTest.java index 1bff41e10..8ad40fc34 100644 --- a/projects/test/plugin/general-cases/general-cases-app/src/androidTest/java/com/tencent/shadow/test/plugin/general_cases/app/PackageManagerTest.java +++ b/projects/test/plugin/general-cases/general-cases-app/src/androidTest/java/com/tencent/shadow/test/plugin/general_cases/app/PackageManagerTest.java @@ -65,4 +65,9 @@ public void testQueryContentProvidersName() { matchTextWithViewTag("queryContentProviders/size", "2"); matchTextWithViewTag("queryContentProviders/name", "[android.support.v4.content.FileProvider, com.tencent.shadow.test.plugin.general_cases.lib.usecases.provider.TestProvider]"); } + + @Test + public void testResolveActivityByExplicitIntent() { + matchTextWithViewTag("resolveActivity/explicit", "com.tencent.shadow.test.plugin.general_cases.lib.usecases.packagemanager.TestPackageManagerActivity"); + } } diff --git a/projects/test/plugin/general-cases/general-cases-lib/src/main/AndroidManifest.xml b/projects/test/plugin/general-cases/general-cases-lib/src/main/AndroidManifest.xml index 50e6313cf..170f4d9ff 100644 --- a/projects/test/plugin/general-cases/general-cases-lib/src/main/AndroidManifest.xml +++ b/projects/test/plugin/general-cases/general-cases-lib/src/main/AndroidManifest.xml @@ -47,13 +47,18 @@ - + + + + + + - + diff --git a/projects/test/plugin/general-cases/general-cases-lib/src/main/java/com/tencent/shadow/test/plugin/general_cases/lib/usecases/packagemanager/TestPackageManagerActivity.java b/projects/test/plugin/general-cases/general-cases-lib/src/main/java/com/tencent/shadow/test/plugin/general_cases/lib/usecases/packagemanager/TestPackageManagerActivity.java index dd77446bc..90824cb25 100644 --- a/projects/test/plugin/general-cases/general-cases-lib/src/main/java/com/tencent/shadow/test/plugin/general_cases/lib/usecases/packagemanager/TestPackageManagerActivity.java +++ b/projects/test/plugin/general-cases/general-cases-lib/src/main/java/com/tencent/shadow/test/plugin/general_cases/lib/usecases/packagemanager/TestPackageManagerActivity.java @@ -20,11 +20,13 @@ import android.app.Activity; import android.content.ComponentName; +import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; import android.os.Bundle; import android.view.ViewGroup; @@ -48,6 +50,7 @@ protected void onCreate(Bundle savedInstanceState) { getActivityInfo(viewGroup); getPackageInfo(viewGroup); queryContentProviders(viewGroup); + resolveActivityByExplicitIntent(viewGroup); } private void getApplicationInfo(ViewGroup viewGroup) { @@ -181,4 +184,25 @@ private void queryContentProviders(ViewGroup viewGroup) { ) ); } + + private void resolveActivityByExplicitIntent(ViewGroup viewGroup) { + PackageManager packageManager = getPackageManager(); + Intent intent = new Intent(this, this.getClass()); + ResolveInfo resolveInfo = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); + + String name; + if (resolveInfo != null && resolveInfo.activityInfo != null) { + name = resolveInfo.activityInfo.name; + } else { + name = ""; + } + viewGroup.addView( + UiUtil.makeItem( + this, + "resolveActivity/explicit", + "resolveActivity/explicit", + name + ) + ); + } }