From c136335aaf5243ff569e9ddb1d6e123db9538da9 Mon Sep 17 00:00:00 2001 From: NkBe Date: Wed, 19 Nov 2025 22:18:29 +0800 Subject: [PATCH] feat: support Shizuku API to fetch app list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ShizukuApi 增添 getInstalledApplications 方法,包名管理器增添 fetchAppList 方法,優先使用 Shizuku API 獲取應用列表,失敗則回退至標準 PackageManager。 --- .../lsposed/lspatch/util/LSPPackageManager.kt | 19 ++++++++++++++++++- .../org/lsposed/lspatch/util/ShizukuApi.kt | 10 ++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt index fd61d8a..52920e6 100644 --- a/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt +++ b/manager/src/main/java/org/lsposed/lspatch/util/LSPPackageManager.kt @@ -53,15 +53,32 @@ object LSPPackageManager { private val iconLoader = AppIconLoader(lspApp.resources.getDimensionPixelSize(android.R.dimen.app_icon_size), false, lspApp) private val appIcon = mutableMapOf() + suspend fun fetchAppList() { withContext(Dispatchers.IO) { val pm = lspApp.packageManager val collection = mutableListOf() - pm.getInstalledApplications(PackageManager.GET_META_DATA).forEach { + val applicationList: List + + if (ShizukuApi.isPermissionGranted) { + Log.i(TAG, "Fetching app list using Shizuku API") + applicationList = runCatching { + ShizukuApi.getInstalledApplications() + }.getOrElse { t -> + Log.e(TAG, "Shizuku failed to fetch app list, falling back to standard PM", t) + pm.getInstalledApplications(PackageManager.GET_META_DATA) + } + } else { + Log.i(TAG, "Fetching app list using standard PackageManager") + applicationList = pm.getInstalledApplications(PackageManager.GET_META_DATA) + } + + applicationList.forEach { val label = pm.getApplicationLabel(it) collection.add(AppInfo(it, label.toString())) appIcon[it.packageName] = iconLoader.loadIcon(it).asImageBitmap() } + collection.sortWith(compareBy(Collator.getInstance(Locale.getDefault()), AppInfo::label)) val modules = buildMap { collection.forEach { if (it.isXposedModule) put(it.app.packageName, it.app.sourceDir) } diff --git a/manager/src/main/java/org/lsposed/lspatch/util/ShizukuApi.kt b/manager/src/main/java/org/lsposed/lspatch/util/ShizukuApi.kt index 17e590d..299e287 100644 --- a/manager/src/main/java/org/lsposed/lspatch/util/ShizukuApi.kt +++ b/manager/src/main/java/org/lsposed/lspatch/util/ShizukuApi.kt @@ -50,6 +50,16 @@ object ShizukuApi { isPermissionGranted = false } } + + fun getInstalledApplications(): List { + val userId = Process.myUserHandle().hashCode() + val flags: Long = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + PackageManager.GET_META_DATA.toLong() + }else { + PackageManager.GET_META_DATA.toLong() + } + return iPackageManager.getInstalledApplications(flags, userId).list + } fun createPackageInstallerSession(params: PackageInstaller.SessionParams): PackageInstaller.Session { val sessionId = packageInstaller.createSession(params)