Skip to content

Commit e41153d

Browse files
committed
feat(core): 支持PackageManager#getProviderInfo方法
由于更多测试插件的加入,比如androidx引入了新的Provider, queryContentProviders测试数据可能会变动,因此改为只判断是否大于0.
1 parent 72ce18c commit e41153d

File tree

8 files changed

+46
-30
lines changed

8 files changed

+46
-30
lines changed

projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/ComponentManager.kt

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ abstract class ComponentManager : PluginComponentLauncher {
306306
fun getArchiveFilePathForService(className: String) =
307307
getArchiveFilePath(className, PluginManifest::getServices)
308308

309-
fun getArchiveFilePathForProvider(action: String?): kotlin.Pair<String?, String?> {
309+
fun getArchiveFilePathForProviderByAction(action: String?): kotlin.Pair<String?, String?> {
310310
for ((pluginManifest, archiveFilePath) in allLoadedPlugin) {
311311
val providers = pluginManifest.providers
312312
if (providers != null) {
@@ -320,6 +320,20 @@ abstract class ComponentManager : PluginComponentLauncher {
320320
return null to null
321321
}
322322

323+
fun getArchiveFilePathForProviderByClassName(className: String): kotlin.Pair<String?, String?> {
324+
for ((pluginManifest, archiveFilePath) in allLoadedPlugin) {
325+
val providers = pluginManifest.providers
326+
if (providers != null) {
327+
for (provider in providers) {
328+
if (className == provider.className) {
329+
return provider.className to archiveFilePath
330+
}
331+
}
332+
}
333+
}
334+
return null to null
335+
}
336+
323337
fun getAllArchiveFilePaths() = allLoadedPlugin.map { it.second }.toList()
324338

325339
private fun getArchiveFilePath(

projects/sdk/core/loader/src/main/kotlin/com/tencent/shadow/core/loader/managers/PluginPackageManagerImpl.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,23 @@ internal class PluginPackageManagerImpl(
7272
PackageManager::getServiceInfo
7373
)
7474

75+
override fun getProviderInfo(component: ComponentName, flags: Int): ProviderInfo {
76+
val (className, archiveFilePath)
77+
= componentManager.getArchiveFilePathForProviderByClassName(component.className)
78+
if (archiveFilePath != null) {
79+
val packageInfo = hostPackageManager.getPackageArchiveInfo(
80+
archiveFilePath, PackageManager.GET_PROVIDERS or flags
81+
)
82+
val componentInfo = packageInfo?.providers?.find {
83+
it.name == className
84+
}
85+
if (componentInfo != null) {
86+
return componentInfo
87+
}
88+
}
89+
return hostPackageManager.getProviderInfo(component, flags)
90+
}
91+
7592
override fun resolveActivity(intent: Intent, flags: Int): ResolveInfo? {
7693
val component = intent.component
7794
if (component != null) {
@@ -127,7 +144,9 @@ internal class PluginPackageManagerImpl(
127144
}
128145

129146
override fun resolveContentProvider(name: String, flags: Int): ProviderInfo? {
130-
val (className, archiveFilePath) = componentManager.getArchiveFilePathForProvider(name)
147+
val (className, archiveFilePath) = componentManager.getArchiveFilePathForProviderByAction(
148+
name
149+
)
131150
if (archiveFilePath != null) {
132151
val packageInfo = hostPackageManager.getPackageArchiveInfo(
133152
archiveFilePath, PackageManager.GET_PROVIDERS or flags

projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PackageManagerInvokeRedirect.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ public static ServiceInfo getServiceInfo(ClassLoader classLoaderOfInvokeCode, Co
5656
return getPluginPackageManager(classLoaderOfInvokeCode).getServiceInfo(component, flags);
5757
}
5858

59+
public static ProviderInfo getProviderInfo(ClassLoader classLoaderOfInvokeCode, ComponentName component, int flags) throws PackageManager.NameNotFoundException {
60+
return getPluginPackageManager(classLoaderOfInvokeCode).getProviderInfo(component, flags);
61+
}
62+
5963
public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvokeCode, String packageName, int flags) throws PackageManager.NameNotFoundException {
6064
return getPluginPackageManager(classLoaderOfInvokeCode).getPackageInfo(packageName, flags);
6165
}

projects/sdk/core/runtime/src/main/java/com/tencent/shadow/core/runtime/PluginPackageManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public interface PluginPackageManager {
1818

1919
ServiceInfo getServiceInfo(ComponentName component, int flags);
2020

21+
ProviderInfo getProviderInfo(ComponentName component, int flags);
22+
2123
PackageInfo getPackageInfo(String packageName, int flags);
2224

2325
ProviderInfo resolveContentProvider(String name, int flags);

projects/sdk/core/transform/src/main/kotlin/com/tencent/shadow/core/transform/specific/PackageManagerTransform.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import com.tencent.shadow.core.transform.ShadowTransform.Companion.SelfClassName
2222
import com.tencent.shadow.core.transform_kit.SpecificTransform
2323
import com.tencent.shadow.core.transform_kit.TransformStep
2424
import javassist.*
25-
import java.util.*
2625

2726
class PackageManagerTransform : SpecificTransform() {
2827
companion object {
@@ -102,6 +101,7 @@ class PackageManagerTransform : SpecificTransform() {
102101
"getApplicationInfo",
103102
"getActivityInfo",
104103
"getServiceInfo",
104+
"getProviderInfo",
105105
"getPackageInfo",
106106
"resolveContentProvider",
107107
"queryContentProviders",

projects/test/dynamic/host/test-dynamic-host/src/androidTest/java/com/tencent/shadow/test/cases/plugin_main/PackageManagerTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ public void testGetApplicationInfoMetaData() {
3838

3939
@Test
4040
public void testQueryContentProvidersName() {
41-
matchTextWithViewTag("queryContentProviders/size", "2");
42-
matchTextWithViewTag("queryContentProviders/name", "[android.support.v4.content.FileProvider, com.tencent.shadow.test.plugin.general_cases.lib.usecases.provider.TestProvider]");
41+
matchTextWithViewTag("queryContentProviders/size", ">0");
4342
}
4443

4544
@Test

projects/test/plugin/general-cases/test-plugin-general-cases/src/androidTest/java/com/tencent/shadow/test/plugin/general_cases/app/PackageManagerTest.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ public void testGetPackageInfoVersionCode() {
6262

6363
@Test
6464
public void testQueryContentProvidersName() {
65-
matchTextWithViewTag("queryContentProviders/size", "2");
66-
matchTextWithViewTag("queryContentProviders/name", "[android.support.v4.content.FileProvider, com.tencent.shadow.test.plugin.general_cases.lib.usecases.provider.TestProvider]");
65+
matchTextWithViewTag("queryContentProviders/size", ">0");
6766
}
6867

6968
@Test

projects/test/plugin/general-cases/test-plugin-general-cases/src/main/java/com/tencent/shadow/test/plugin/general_cases/lib/usecases/packagemanager/TestPackageManagerActivity.java

Lines changed: 2 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,6 @@
3636
import com.tencent.shadow.test.plugin.general_cases.lib.gallery.util.UiUtil;
3737
import com.tencent.shadow.test.plugin.general_cases.lib.usecases.service.TestService;
3838

39-
import java.util.ArrayList;
40-
import java.util.Arrays;
41-
import java.util.Collections;
4239
import java.util.List;
4340

4441
public class TestPackageManagerActivity extends Activity {
@@ -185,18 +182,8 @@ private void queryContentProviders(ViewGroup viewGroup) {
185182
int uid = applicationInfo.uid;
186183
List<ProviderInfo> providerInfos = packageManager.queryContentProviders(processName, uid, PackageManager.MATCH_ALL);
187184

188-
String size = Integer.toString(providerInfos.size());
189-
String name;
190-
if (providerInfos.isEmpty()) {
191-
name = "";
192-
} else {
193-
ArrayList<String> names = new ArrayList<>(providerInfos.size());
194-
for (ProviderInfo providerInfo : providerInfos) {
195-
names.add(providerInfo.name);
196-
}
197-
Collections.sort(names);
198-
name = Arrays.toString(names.toArray());
199-
}
185+
String size = providerInfos.size() > 0 ? ">0" : "0";
186+
200187
viewGroup.addView(
201188
UiUtil.makeItem(
202189
this,
@@ -205,14 +192,6 @@ private void queryContentProviders(ViewGroup viewGroup) {
205192
size
206193
)
207194
);
208-
viewGroup.addView(
209-
UiUtil.makeItem(
210-
this,
211-
"queryContentProviders/name",
212-
"queryContentProviders/name",
213-
name
214-
)
215-
);
216195
}
217196

218197
private void resolveActivityByExplicitIntent(ViewGroup viewGroup) {

0 commit comments

Comments
 (0)