manager: Add recognition for app paths add uid hide

This commit is contained in:
ShirkNeko
2025-08-12 13:25:36 +08:00
parent 1eb0f19ca6
commit 75e0cd05a9
2 changed files with 74 additions and 23 deletions

View File

@@ -76,16 +76,41 @@ fun SusPathsContent(
val (appPathGroups, otherPaths) = remember(susPaths) { val (appPathGroups, otherPaths) = remember(susPaths) {
val appPathRegex = Regex(".*/Android/data/([^/]+)/?.*") val appPathRegex = Regex(".*/Android/data/([^/]+)/?.*")
val uidPathRegex = Regex("/sys/fs/cgroup/uid_([0-9]+)")
val appPathMap = mutableMapOf<String, MutableList<String>>() val appPathMap = mutableMapOf<String, MutableList<String>>()
val uidToPackageMap = mutableMapOf<String, String>()
val others = mutableListOf<String>() val others = mutableListOf<String>()
// 构建UID到包名的映射
SuperUserViewModel.apps.forEach { app ->
try {
val uid = app.packageInfo.applicationInfo?.uid
uidToPackageMap[uid.toString()] = app.packageName
} catch (_: Exception) {
}
}
susPaths.forEach { path -> susPaths.forEach { path ->
val matchResult = appPathRegex.find(path) val appDataMatch = appPathRegex.find(path)
if (matchResult != null) { val uidMatch = uidPathRegex.find(path)
val packageName = matchResult.groupValues[1]
appPathMap.getOrPut(packageName) { mutableListOf() }.add(path) when {
} else { appDataMatch != null -> {
others.add(path) val packageName = appDataMatch.groupValues[1]
appPathMap.getOrPut(packageName) { mutableListOf() }.add(path)
}
uidMatch != null -> {
val uid = uidMatch.groupValues[1]
val packageName = uidToPackageMap[uid]
if (packageName != null) {
appPathMap.getOrPut(packageName) { mutableListOf() }.add(path)
} else {
others.add(path)
}
}
else -> {
others.add(path)
}
} }
} }

View File

@@ -62,6 +62,7 @@ object SuSFSManager {
private const val MIN_VERSION_FOR_LOOP_PATH = "1.5.9" private const val MIN_VERSION_FOR_LOOP_PATH = "1.5.9"
private const val BACKUP_FILE_EXTENSION = ".susfs_backup" private const val BACKUP_FILE_EXTENSION = ".susfs_backup"
private const val MEDIA_DATA_PATH = "/data/media/0/Android/data" private const val MEDIA_DATA_PATH = "/data/media/0/Android/data"
private const val CGROUP_UID_PATH_PREFIX = "/sys/fs/cgroup/uid_"
data class SlotInfo(val slotName: String, val uname: String, val buildTime: String) data class SlotInfo(val slotName: String, val uname: String, val buildTime: String)
data class CommandResult(val isSuccess: Boolean, val output: String, val errorOutput: String = "") data class CommandResult(val isSuccess: Boolean, val output: String, val errorOutput: String = "")
@@ -400,9 +401,7 @@ object SuSFSManager {
fun getSdcardPath(context: Context): String = fun getSdcardPath(context: Context): String =
getPrefs(context).getString(KEY_SDCARD_PATH, "/sdcard") ?: "/sdcard" getPrefs(context).getString(KEY_SDCARD_PATH, "/sdcard") ?: "/sdcard"
/** // 获取已安装的应用列表
* 获取已安装的应用列表
*/
@SuppressLint("QueryPermissionsNeeded") @SuppressLint("QueryPermissionsNeeded")
suspend fun getInstalledApps(): List<AppInfo> = withContext(Dispatchers.IO) { suspend fun getInstalledApps(): List<AppInfo> = withContext(Dispatchers.IO) {
try { try {
@@ -456,10 +455,29 @@ object SuSFSManager {
} }
} }
// 获取应用的UID
private suspend fun getAppUid(context: Context, packageName: String): Int? = withContext(Dispatchers.IO) {
try {
// 从SuperUserViewModel中查找
val superUserApp = SuperUserViewModel.apps.find { it.packageName == packageName }
if (superUserApp != null) {
return@withContext superUserApp.packageInfo.applicationInfo?.uid
}
/** // 从PackageManager中查找
* 快捷添加应用路径 val packageManager = context.packageManager
*/ val packageInfo = packageManager.getPackageInfo(packageName, 0)
packageInfo.applicationInfo?.uid
} catch (e: Exception) {
Log.w("SuSFSManager", "Failed to get UID for package $packageName: ${e.message}")
null
}
}
private fun buildUidPath(uid: Int): String = "$CGROUP_UID_PATH_PREFIX$uid"
// 快捷添加应用路径
suspend fun addAppPaths(context: Context, packageName: String): Boolean { suspend fun addAppPaths(context: Context, packageName: String): Boolean {
val androidDataPath = getAndroidDataPath(context) val androidDataPath = getAndroidDataPath(context)
getSdcardPath(context) getSdcardPath(context)
@@ -467,28 +485,36 @@ object SuSFSManager {
val path1 = "$androidDataPath/$packageName" val path1 = "$androidDataPath/$packageName"
val path2 = "$MEDIA_DATA_PATH/$packageName" val path2 = "$MEDIA_DATA_PATH/$packageName"
var successCount = 0 val uid = getAppUid(context, packageName)
var totalCount = 0 if (uid == null) {
Log.w("SuSFSManager", "Failed to get UID for package: $packageName")
return false
}
// 添加第一个路径 val path3 = buildUidPath(uid)
totalCount++
var successCount = 0
val totalCount = 3
// 添加第一个路径Android/data路径
if (addSusPath(context, path1)) { if (addSusPath(context, path1)) {
successCount++ successCount++
} }
// 添加第二个路径 // 添加第二个路径(媒体数据路径)
totalCount++
if (addSusPath(context, path2)) { if (addSusPath(context, path2)) {
successCount++ successCount++
} }
val success = successCount > 0 // 添加第三个路径UID路径
if (success) { if (addSusPath(context, path3)) {
"" successCount++
} else {
""
} }
val success = successCount > 0
Log.d("SuSFSManager", "Added $successCount/$totalCount paths for $packageName (UID: $uid)")
return success return success
} }