Skip to content

Commit 000ae0c

Browse files
aprz512shifujun
authored andcommitted
feat(core): 支持新增API33新增的getPackageInfo方法
androidx.profileinstaller.ProfileVerifier中有使用。 Tencent#1277
1 parent 7650e36 commit 000ae0c

File tree

6 files changed

+111
-5
lines changed

6 files changed

+111
-5
lines changed

buildScripts/gradle/versions.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
COMPILE_SDK_VERSION=31
1+
COMPILE_SDK_VERSION=33
22
MIN_SDK_VERSION=14
33
TARGET_SDK_VERSION=28
44
VERSION_CODE=1

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

+48-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,18 @@ internal class PluginPackageManagerImpl(
3838
hostPackageManager.getApplicationInfo(packageName, flags)
3939
}
4040

41-
override fun getPackageInfo(packageName: String, flags: Int): PackageInfo? {
42-
val hostPackageInfo = hostPackageManager.getPackageInfo(packageName, flags)
41+
/**
42+
* 所有插件中的各种方法签名的getPackageInfo方法汇总到这里。
43+
* 如果包名是插件的,优先返回插件的PackageInfo。
44+
* 否则返回从宿主(系统)查询到的PackageInfo。
45+
* 直接由getPackageArchiveInfo构造的PackageInfo和从getPackageInfo得到的正常的PackageInfo不完全一致。
46+
* 在这里修改它使其尽可能像系统返回的。
47+
*/
48+
private fun getPluginPackageInfoIfPossible(
49+
packageName: String,
50+
flags: Int,
51+
hostPackageInfo: PackageInfo,
52+
): PackageInfo? {
4353
return if (packageName.isPlugin()) {
4454
val packageInfo = hostPackageManager.getPackageArchiveInfo(pluginArchiveFilePath, flags)
4555
if (packageInfo != null) {
@@ -53,6 +63,42 @@ internal class PluginPackageManagerImpl(
5363
}
5464
}
5565

66+
@Suppress("DEPRECATION")
67+
override fun getPackageInfo(packageName: String, flags: Int) =
68+
getPluginPackageInfoIfPossible(
69+
packageName,
70+
flags,
71+
hostPackageManager.getPackageInfo(packageName, flags)
72+
)
73+
74+
@Suppress("DEPRECATION")
75+
@SuppressLint("NewApi")
76+
override fun getPackageInfo(versionedPackage: VersionedPackage, flags: Int) =
77+
getPluginPackageInfoIfPossible(
78+
versionedPackage.packageName,
79+
flags,
80+
hostPackageManager.getPackageInfo(versionedPackage, flags)
81+
)
82+
83+
@SuppressLint("NewApi")
84+
override fun getPackageInfo(packageName: String, flags: PackageManager.PackageInfoFlags) =
85+
getPluginPackageInfoIfPossible(
86+
packageName,
87+
flags.value.toInt(),//FIXME 这里会丢失flags升级到Long新增的标志位
88+
hostPackageManager.getPackageInfo(packageName, flags)
89+
)
90+
91+
@SuppressLint("NewApi")
92+
override fun getPackageInfo(
93+
versionedPackage: VersionedPackage,
94+
flags: PackageManager.PackageInfoFlags
95+
) =
96+
getPluginPackageInfoIfPossible(
97+
versionedPackage.packageName,
98+
flags.value.toInt(),//FIXME 这里会丢失flags升级到Long新增的标志位
99+
hostPackageManager.getPackageInfo(versionedPackage, flags)
100+
)
101+
56102
override fun getActivityInfo(component: ComponentName, flags: Int): ActivityInfo? =
57103
getComponentInfo(
58104
component,

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

+13-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,19 @@ public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvokeCode, St
6767
@TargetApi(Build.VERSION_CODES.O)
6868
public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvokeCode, VersionedPackage versionedPackage,
6969
int flags) throws PackageManager.NameNotFoundException {
70-
return getPluginPackageManager(classLoaderOfInvokeCode).getPackageInfo(versionedPackage.getPackageName(), flags);
70+
return getPluginPackageManager(classLoaderOfInvokeCode).getPackageInfo(versionedPackage, flags);
71+
}
72+
73+
@TargetApi(Build.VERSION_CODES.TIRAMISU)
74+
public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvokeCode, String packageName,
75+
PackageManager.PackageInfoFlags flags) throws PackageManager.NameNotFoundException {
76+
return getPluginPackageManager(classLoaderOfInvokeCode).getPackageInfo(packageName, flags);
77+
}
78+
79+
@TargetApi(Build.VERSION_CODES.TIRAMISU)
80+
public static PackageInfo getPackageInfo(ClassLoader classLoaderOfInvokeCode, VersionedPackage versionedPackage,
81+
PackageManager.PackageInfoFlags flags) throws PackageManager.NameNotFoundException {
82+
return getPluginPackageManager(classLoaderOfInvokeCode).getPackageInfo(versionedPackage, flags);
7183
}
7284

7385
public static ProviderInfo resolveContentProvider(ClassLoader classLoaderOfInvokeCode, String name, int flags) {

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

+12
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package com.tencent.shadow.core.runtime;
22

3+
import android.annotation.TargetApi;
34
import android.content.ComponentName;
45
import android.content.Intent;
56
import android.content.pm.ActivityInfo;
67
import android.content.pm.ApplicationInfo;
78
import android.content.pm.PackageInfo;
9+
import android.content.pm.PackageManager;
810
import android.content.pm.ProviderInfo;
911
import android.content.pm.ResolveInfo;
1012
import android.content.pm.ServiceInfo;
13+
import android.content.pm.VersionedPackage;
14+
import android.os.Build;
1115

1216
import java.util.List;
1317

@@ -22,6 +26,14 @@ public interface PluginPackageManager {
2226

2327
PackageInfo getPackageInfo(String packageName, int flags);
2428

29+
PackageInfo getPackageInfo(VersionedPackage versionedPackage, int flags);
30+
31+
@TargetApi(Build.VERSION_CODES.TIRAMISU)
32+
PackageInfo getPackageInfo(VersionedPackage versionedPackage, PackageManager.PackageInfoFlags flags);
33+
34+
@TargetApi(Build.VERSION_CODES.TIRAMISU)
35+
PackageInfo getPackageInfo(String packageName, PackageManager.PackageInfoFlags flags);
36+
2537
ProviderInfo resolveContentProvider(String name, int flags);
2638

2739
List<ProviderInfo> queryContentProviders(String processName, int uid, int flags);

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

+20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.tencent.shadow.test.cases.plugin_main;
22

3+
import android.content.Context;
34
import android.content.Intent;
5+
import android.content.pm.PackageInfo;
6+
import android.content.pm.PackageManager;
47

58
import androidx.test.core.app.ApplicationProvider;
69

@@ -55,4 +58,21 @@ public void testGetServiceInfoName() {
5558
public void testGetServiceInfoPackageName() {
5659
matchTextWithViewTag("getServiceInfo/packageName", "com.tencent.shadow.test.hostapp");
5760
}
61+
62+
@Test
63+
public void testGetPackageInfoVersionName() throws PackageManager.NameNotFoundException {
64+
Context applicationContext = ApplicationProvider.getApplicationContext();
65+
String packageName = applicationContext.getPackageName();
66+
PackageInfo packageInfo = applicationContext.getPackageManager().getPackageInfo(packageName, 0);
67+
matchTextWithViewTag("getPackageInfo/versionName", packageInfo.versionName);
68+
}
69+
70+
@Test
71+
public void testGetPackageInfoVersionCode() throws PackageManager.NameNotFoundException {
72+
Context applicationContext = ApplicationProvider.getApplicationContext();
73+
String packageName = applicationContext.getPackageName();
74+
PackageInfo packageInfo = applicationContext.getPackageManager().getPackageInfo(packageName, 0);
75+
matchTextWithViewTag("getPackageInfo/versionCode", Integer.toString(packageInfo.versionCode));
76+
}
77+
5878
}

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

+17-1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import android.content.pm.ProviderInfo;
3131
import android.content.pm.ResolveInfo;
3232
import android.content.pm.ServiceInfo;
33+
import android.content.pm.VersionedPackage;
34+
import android.os.Build;
3335
import android.os.Bundle;
3436
import android.view.ViewGroup;
3537

@@ -151,7 +153,21 @@ private void getPackageInfo(ViewGroup viewGroup) {
151153
String versionName;
152154
String versionCode;
153155
try {
154-
PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
156+
PackageManager packageManager = getPackageManager();
157+
String packageName = getPackageName();
158+
PackageInfo packageInfo;
159+
160+
//'getPackageInfo(java.lang.String, int)' is deprecated as of API 33 ("Tiramisu"; Android 13.0)
161+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
162+
packageInfo = packageManager.getPackageInfo(packageName, PackageManager.PackageInfoFlags.of(0));
163+
164+
//再测试调用一下传VersionedPackage的方法
165+
VersionedPackage versionedPackage = new VersionedPackage(packageInfo.packageName, packageInfo.getLongVersionCode());
166+
packageInfo = packageManager.getPackageInfo(versionedPackage, PackageManager.PackageInfoFlags.of(0));
167+
} else {
168+
packageInfo = packageManager.getPackageInfo(packageName, 0);
169+
}
170+
155171
versionName = packageInfo.versionName;
156172
versionCode = Integer.toString(packageInfo.versionCode);
157173
} catch (PackageManager.NameNotFoundException e) {

0 commit comments

Comments
 (0)