Module list from manager should use match all flag (#1621)

This commit is contained in:
LoveSy 2022-02-04 01:35:37 +08:00 committed by GitHub
parent a92b5999e2
commit 4955dcb542
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 4 deletions

View File

@ -56,6 +56,10 @@ public final class ModuleUtil {
private Map<Pair<String, Integer>, InstalledModule> installedModules = new HashMap<>();
private boolean modulesLoaded = false;
static final int MATCH_ANY_USER = 0x00400000; // PackageManager.MATCH_ANY_USER
static final int MATCH_ALL_FLAGS = PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | PackageManager.MATCH_UNINSTALLED_PACKAGES | MATCH_ANY_USER;
private ModuleUtil() {
pm = App.getInstance().getPackageManager();
}
@ -93,12 +97,11 @@ public final class ModuleUtil {
Map<Pair<String, Integer>, InstalledModule> modules = new HashMap<>();
var users = ConfigManager.getUsers();
for (PackageInfo pkg : ConfigManager.getInstalledPackagesFromAllUsers(PackageManager.GET_META_DATA, false)) {
for (PackageInfo pkg : ConfigManager.getInstalledPackagesFromAllUsers(PackageManager.GET_META_DATA | MATCH_ALL_FLAGS, false)) {
ApplicationInfo app = pkg.applicationInfo;
if (app.metaData != null && app.metaData.containsKey("xposedminversion")) {
InstalledModule installed = new InstalledModule(pkg);
modules.put(Pair.create(pkg.packageName, app.uid / 100000), installed);
modules.computeIfAbsent(Pair.create(pkg.packageName, app.uid / 100000), k -> new InstalledModule(pkg));
}
}

View File

@ -128,13 +128,23 @@ public class PackageService {
return pm.getApplicationInfo(packageName, flags, userId);
}
// Only for manager
public static ParceledListSlice<PackageInfo> getInstalledPackagesFromAllUsers(int flags, boolean filterNoProcess) throws RemoteException {
List<PackageInfo> res = new ArrayList<>();
IPackageManager pm = getPackageManager();
if (pm == null) return ParceledListSlice.emptyList();
for (var user : UserService.getUsers()) {
// in case pkginfo of other users in primary user
res.addAll(pm.getInstalledPackages(flags, user.id).getList().parallelStream().filter(info -> info.applicationInfo != null && info.applicationInfo.uid / PER_USER_RANGE == user.id).collect(Collectors.toList()));
res.addAll(pm.getInstalledPackages(flags, user.id).getList().parallelStream()
.filter(info -> info.applicationInfo != null && info.applicationInfo.uid / PER_USER_RANGE == user.id)
.filter(info -> {
try {
return isPackageAvailable(info.packageName, user.id, true);
} catch (RemoteException e) {
return false;
}
})
.collect(Collectors.toList()));
}
if (filterNoProcess) {
return new ParceledListSlice<>(res.parallelStream().filter(packageInfo -> {