From 4a2ffcd080fcc54a39607267aff595859bc99654 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=96=E7=95=8C?= Date: Fri, 2 Jan 2026 01:00:30 +0800 Subject: [PATCH] Fix binder transaction overflow in RootPackageManager Fetch installed packages in chunks of 50 to avoid exceeding the 1MB binder transaction limit on devices with many apps. --- .../nekohasekai/sfa/vendor/IRootPackageManager.aidl | 2 +- .../io/nekohasekai/sfa/vendor/RootPackageManager.kt | 12 +++++++++++- .../sfa/vendor/RootPackageManagerService.kt | 9 +++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/app/src/minApi23/aidl/io/nekohasekai/sfa/vendor/IRootPackageManager.aidl b/app/src/minApi23/aidl/io/nekohasekai/sfa/vendor/IRootPackageManager.aidl index ce43869..a4a4f4b 100644 --- a/app/src/minApi23/aidl/io/nekohasekai/sfa/vendor/IRootPackageManager.aidl +++ b/app/src/minApi23/aidl/io/nekohasekai/sfa/vendor/IRootPackageManager.aidl @@ -3,5 +3,5 @@ package io.nekohasekai.sfa.vendor; import android.content.pm.PackageInfo; interface IRootPackageManager { - List getInstalledPackages(int flags); + List getInstalledPackages(int flags, int offset, int limit); } diff --git a/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManager.kt b/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManager.kt index 6079065..da995b2 100644 --- a/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManager.kt +++ b/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManager.kt @@ -91,8 +91,18 @@ object RootPackageManager { } } + private const val CHUNK_SIZE = 50 + suspend fun getInstalledPackages(flags: Int): List { val svc = bindService() - return svc.getInstalledPackages(flags) + val result = mutableListOf() + var offset = 0 + while (true) { + val chunk = svc.getInstalledPackages(flags, offset, CHUNK_SIZE) + if (chunk.isEmpty()) break + result.addAll(chunk) + offset += chunk.size + } + return result } } diff --git a/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManagerService.kt b/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManagerService.kt index e93b911..4349c80 100644 --- a/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManagerService.kt +++ b/app/src/minApi23/java/io/nekohasekai/sfa/vendor/RootPackageManagerService.kt @@ -10,8 +10,8 @@ import com.topjohnwu.superuser.ipc.RootService class RootPackageManagerService : RootService() { private val binder = object : IRootPackageManager.Stub() { - override fun getInstalledPackages(flags: Int): List { - return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + override fun getInstalledPackages(flags: Int, offset: Int, limit: Int): List { + val allPackages = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { packageManager.getInstalledPackages( PackageManager.PackageInfoFlags.of(flags.toLong()) ) @@ -19,6 +19,11 @@ class RootPackageManagerService : RootService() { @Suppress("DEPRECATION") packageManager.getInstalledPackages(flags) } + val endIndex = minOf(offset + limit, allPackages.size) + if (offset >= allPackages.size) { + return emptyList() + } + return allPackages.subList(offset, endIndex) } }