From af01bd46266eea70004b96d463eb002a242d27ee Mon Sep 17 00:00:00 2001 From: tehcneko <7764726+tehcneko@users.noreply.github.com> Date: Wed, 24 Feb 2021 13:07:41 +0800 Subject: [PATCH] [core] Fix no process filter (#188) --- .../lsposed/lspd/service/PackageService.java | 51 ++++++++++++++++--- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java index 0c94d00c..cc5aff50 100644 --- a/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java +++ b/core/src/main/java/io/github/lsposed/lspd/service/PackageService.java @@ -85,14 +85,20 @@ public class PackageService { List res = new ArrayList<>(); IPackageManager pm = getPackageManager(); if (pm == null) return ParceledListSlice.emptyList(); - if (filterNoProcess) flags = PackageManager.MATCH_DISABLED_COMPONENTS | - PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | - PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS | PackageManager.GET_PROVIDERS | flags; for (int userId : UserService.getUsers()) { res.addAll(pm.getInstalledPackages(flags, userId).getList()); } - if (filterNoProcess) - res = res.stream().filter(pkgInfo -> !fetchProcesses(pkgInfo).isEmpty()).collect(Collectors.toList()); + if (filterNoProcess) { + res = res.stream().filter(packageInfo -> { + int baseFlag = PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + try { + PackageInfo pkgInfo = getPackageInfoWithComponents(packageInfo.packageName, baseFlag, packageInfo.applicationInfo.uid / 100000); + return !fetchProcesses(pkgInfo).isEmpty(); + } catch (RemoteException e) { + return true; + } + }).collect(Collectors.toList()); + } return new ParceledListSlice<>(res); } @@ -122,11 +128,40 @@ public class PackageService { public static Pair, Integer> fetchProcessesWithUid(Application app) throws RemoteException { IPackageManager pm = getPackageManager(); if (pm == null) return new Pair<>(Collections.emptySet(), -1); - PackageInfo pkgInfo = pm.getPackageInfo(app.packageName, PackageManager.MATCH_DISABLED_COMPONENTS | - PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.GET_ACTIVITIES | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE | - PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS | PackageManager.GET_PROVIDERS, app.userId); + int baseFlag = PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE; + PackageInfo pkgInfo = getPackageInfoWithComponents(app.packageName, baseFlag, app.userId); if (pkgInfo == null || pkgInfo.applicationInfo == null) return new Pair<>(Collections.emptySet(), -1); return new Pair<>(fetchProcesses(pkgInfo), pkgInfo.applicationInfo.uid); } + + private static PackageInfo getPackageInfoWithComponents(String packageName, int flags, int userId) throws RemoteException { + PackageInfo pkgInfo; + try { + pkgInfo = pm.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES | PackageManager.GET_RECEIVERS | PackageManager.GET_PROVIDERS, userId); + } catch (Exception e) { + pkgInfo = pm.getPackageInfo(packageName, flags, userId); + try { + pkgInfo.activities = pm.getPackageInfo(packageName, flags | PackageManager.GET_ACTIVITIES, userId).activities; + } catch (Exception ignored) { + + } + try { + pkgInfo.services = pm.getPackageInfo(packageName, flags | PackageManager.GET_SERVICES, userId).services; + } catch (Exception ignored) { + + } + try { + pkgInfo.receivers = pm.getPackageInfo(packageName, flags | PackageManager.GET_RECEIVERS, userId).receivers; + } catch (Exception ignored) { + + } + try { + pkgInfo.providers = pm.getPackageInfo(packageName, flags | PackageManager.GET_PROVIDERS, userId).providers; + } catch (Exception ignored) { + + } + } + return pkgInfo; + } }