From 86a20f7eef2969df8c7b54f350defc97d44e701f Mon Sep 17 00:00:00 2001 From: LoveSy Date: Mon, 29 Nov 2021 23:55:56 +0800 Subject: [PATCH] [core] Workaround for lenovo (motorola) app clone (#1458) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: 南宫雪珊 --- .../org/lsposed/lspd/service/PackageService.java | 4 +++- .../org/lsposed/lspd/service/UserService.java | 15 +++++++++++++++ .../main/java/org/lsposed/lspd/util/Utils.java | 1 + .../src/main/java/android/os/IUserManager.java | 2 ++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/lsposed/lspd/service/PackageService.java b/core/src/main/java/org/lsposed/lspd/service/PackageService.java index 8777a873..4f5bf5d3 100644 --- a/core/src/main/java/org/lsposed/lspd/service/PackageService.java +++ b/core/src/main/java/org/lsposed/lspd/service/PackageService.java @@ -39,6 +39,7 @@ import android.content.pm.VersionedPackage; import android.os.Build; import android.os.Bundle; import android.os.IBinder; +import android.os.Parcel; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; @@ -132,7 +133,8 @@ public class PackageService { IPackageManager pm = getPackageManager(); if (pm == null) return ParceledListSlice.emptyList(); for (var user : UserService.getUsers()) { - res.addAll(pm.getInstalledPackages(flags, user.id).getList()); + // in case duplicate pkginfo in one user + res.addAll(pm.getInstalledPackages(flags, user.id).getList().parallelStream().distinct().collect(Collectors.toList())); } if (filterNoProcess) { return new ParceledListSlice<>(res.parallelStream().filter(packageInfo -> { diff --git a/core/src/main/java/org/lsposed/lspd/service/UserService.java b/core/src/main/java/org/lsposed/lspd/service/UserService.java index bd0bfdbb..a0280b85 100644 --- a/core/src/main/java/org/lsposed/lspd/service/UserService.java +++ b/core/src/main/java/org/lsposed/lspd/service/UserService.java @@ -29,6 +29,8 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; +import org.lsposed.lspd.util.Utils; + import java.util.LinkedList; import java.util.List; @@ -72,6 +74,19 @@ public class UserService { users = um.getUsers(true, true, true); } } + if (Utils.isLENOVO) { // lenovo hides user [900, 910) for app cloning + var gotUsers = new boolean[10]; + for (var user : users) { + var residual = user.id - 900; + if (residual >= 0 && residual < 10) gotUsers[residual] = true; + } + for (int i = 900; i <= 909; i++) { + var user = um.getUserInfo(i); + if (user != null && !gotUsers[i - 900]) { + users.add(user); + } + } + } return users; } diff --git a/core/src/main/java/org/lsposed/lspd/util/Utils.java b/core/src/main/java/org/lsposed/lspd/util/Utils.java index 484d108b..7e72ff33 100644 --- a/core/src/main/java/org/lsposed/lspd/util/Utils.java +++ b/core/src/main/java/org/lsposed/lspd/util/Utils.java @@ -34,6 +34,7 @@ public class Utils { public static final String LOG_TAG = "LSPosed"; public static final boolean isMIUI = !TextUtils.isEmpty(SystemProperties.get("ro.miui.ui.version.name")); + public static final boolean isLENOVO = !TextUtils.isEmpty(SystemProperties.get("ro.lenovo.region")); public static void logD(Object msg) { if (BuildConfig.DEBUG) diff --git a/hiddenapi-stubs/src/main/java/android/os/IUserManager.java b/hiddenapi-stubs/src/main/java/android/os/IUserManager.java index 7026b0b9..91aa7968 100644 --- a/hiddenapi-stubs/src/main/java/android/os/IUserManager.java +++ b/hiddenapi-stubs/src/main/java/android/os/IUserManager.java @@ -17,6 +17,8 @@ public interface IUserManager extends IInterface { List getUsers(boolean excludePartial, boolean excludeDying, boolean excludePreCreated) throws RemoteException; + UserInfo getUserInfo(int userHandle); + UserInfo getProfileParent(int userId) throws RemoteException; boolean isUserUnlockingOrUnlocked(int userId) throws RemoteException;