manager: Add recognition for app paths add uid hide
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user