manager: Add the ability to get a list of active managers

This commit is contained in:
ShirkNeko
2025-07-06 00:26:42 +08:00
parent 42b883240e
commit 2bd6929d24
12 changed files with 216 additions and 4 deletions

View File

@@ -118,6 +118,12 @@ object Natives {
*/
external fun clearDynamicSign(): Boolean
/**
* Get active managers list when dynamic sign is enabled
* @return ManagersList object containing active managers, or null if failed or not enabled
*/
external fun getManagersList(): ManagersList?
private const val NON_ROOT_DEFAULT_PROFILE_KEY = "$"
private const val NOBODY_UID = 9999
@@ -177,7 +183,6 @@ object Natives {
val size: Int = 0,
val hash: String = ""
) : Parcelable {
constructor() : this(0, "")
fun isValid(): Boolean {
return size > 0 && hash.length == 64 && hash.all {
@@ -186,6 +191,22 @@ object Natives {
}
}
@Immutable
@Parcelize
@Keep
data class ManagersList(
val count: Int = 0,
val managers: List<ManagerInfo> = emptyList()
) : Parcelable
@Immutable
@Parcelize
@Keep
data class ManagerInfo(
val uid: Int = 0,
val signatureIndex: Int = 0
) : Parcelable
@Immutable
@Parcelize
@Keep

View File

@@ -719,6 +719,32 @@ private fun InfoCard(
icon = Icons.Default.SettingsSuggest,
)
// 活跃管理器
if (systemInfo.isDynamicSignEnabled && systemInfo.managersList != null) {
val signatureMap = systemInfo.managersList.managers.groupBy { it.signatureIndex }
val managersText = buildString {
signatureMap.toSortedMap().forEach { (signatureIndex, managers) ->
append(managers.joinToString(", ") { "UID:${it.uid}" })
append(" ")
append(
when (signatureIndex) {
1 -> "(${stringResource(R.string.default_signature)})"
2 -> "(${stringResource(R.string.dynamic_signature)})"
else -> if (signatureIndex >= 0) "(${stringResource(R.string.signature_index, signatureIndex)})" else "(${stringResource(R.string.unknown_signature)})"
}
)
append("; ")
}
}.trimEnd(' ', ';')
InfoCardItem(
stringResource(R.string.multi_manager_list),
managersText.ifEmpty { stringResource(R.string.no_active_manager) },
icon = Icons.Default.Group,
)
}
InfoCardItem(
stringResource(R.string.home_selinux_status),
systemInfo.seLinuxStatus,

View File

@@ -60,7 +60,9 @@ class HomeViewModel : ViewModel() {
val susSUMode: String = "",
val superuserCount: Int = 0,
val moduleCount: Int = 0,
val kpmModuleCount: Int = 0
val kpmModuleCount: Int = 0,
val managersList: Natives.ManagersList? = null,
val isDynamicSignEnabled: Boolean = false
)
private val gson = Gson()
@@ -242,6 +244,26 @@ class HomeViewModel : ViewModel() {
}
}
// 获取动态签名状态和管理器列表
val dynamicSignConfig = try {
Natives.getDynamicSign()
} catch (e: Exception) {
Log.w(TAG, "Failed to get dynamic sign config", e)
null
}
val isDynamicSignEnabled = dynamicSignConfig?.isValid() == true
val managersList = if (isDynamicSignEnabled) {
try {
Natives.getManagersList()
} catch (e: Exception) {
Log.w(TAG, "Failed to get managers list", e)
null
}
} else {
null
}
systemInfo = SystemInfo(
kernelRelease = uname.release,
androidVersion = Build.VERSION.RELEASE,
@@ -256,7 +278,9 @@ class HomeViewModel : ViewModel() {
susSUMode = susSUMode,
superuserCount = getSuperuserCount(),
moduleCount = getModuleCount(),
kpmModuleCount = getKpmModuleCount()
kpmModuleCount = getKpmModuleCount(),
managersList = managersList,
isDynamicSignEnabled = isDynamicSignEnabled
)
} catch (e: Exception) {
Log.e(TAG, "Error fetching system info", e)