Skip to content

Added limited multi-user support (via root)#282

Open
hyperzlib wants to merge 1 commit into
Dr-TSNG:masterfrom
hyperzlib:master
Open

Added limited multi-user support (via root)#282
hyperzlib wants to merge 1 commit into
Dr-TSNG:masterfrom
hyperzlib:master

Conversation

@hyperzlib

@hyperzlib hyperzlib commented Sep 15, 2023

Copy link
Copy Markdown

Fix for #81

相比 #266 更接近原生的多用户管理(并且会显示工作资料小图标),但是目前由于核心功能不支持多用户,获取到的userId暂且没用。

具体做法:

  1. 通过pm list users获取用户列表。
  2. 通过 pm grant ${pkgName} android.permission.INTERACT_ACROSS_USERS 让HMA获取特殊权限。
  3. 通过Hidden API getInstalledPackagesAsUser 获取指定用户下的所有应用。

1和2运行时均需要root权限,可能需要在UI上添加对应提示,以及调整授权的时机。

@5ec1cff

5ec1cff commented Sep 15, 2023

Copy link
Copy Markdown

在系统服务里面向 app 暴露个 api 获取所有用户的包就行了,哪用那么麻烦

@hyperzlib

Copy link
Copy Markdown
Author

在系统服务里面向 app 暴露个 api 获取所有用户的包就行了,哪用那么麻烦

系统服务还是尽量别hook,鬼知道那些定制UI内部加了些什么东西。

@walwan

walwan commented Oct 13, 2023

Copy link
Copy Markdown

感谢提交这个功能,我现在使用工作账户正好需要这个。
我合并这个提交,编译后发现一开始不能正常识别工作账户里的应用,后来发现是代码里默认不尝试授予INTERACT_ACROSS_USERS这个权限(函数默认参数是否),我手动授予后就正常工作了。

@hyperzlib

Copy link
Copy Markdown
Author

感谢提交这个功能,我现在使用工作账户正好需要这个。
我合并这个提交,编译后发现一开始不能正常识别工作账户里的应用,后来发现是代码里默认不尝试授予INTERACT_ACROSS_USERS这个权限(函数默认参数是否),我手动授予后就正常工作了。

是这样吗?我是在读取应用列表时写了个检测,如果没有权限就使用root自动添加权限。

@walwan

walwan commented Oct 20, 2023

Copy link
Copy Markdown

好像是的。我看您在158行这里
fun getInstalledPackagesFromUser(user: Int, tryGrantPermission: Boolean = false): List {
给的tryGrantPermission默认参数是false。然后170-173行
if (tryGrantPermission) {
grantCrossUserPermissions()
return getInstalledPackagesFromUser(user)
}
这里调的时候没有给参数。

@hyperzlib

Copy link
Copy Markdown
Author

好像是的。我看您在158行这里 fun getInstalledPackagesFromUser(user: Int, tryGrantPermission: Boolean = false): List { 给的tryGrantPermission默认参数是false。然后170-173行 if (tryGrantPermission) { grantCrossUserPermissions() return getInstalledPackagesFromUser(user) } 这里调的时候没有给参数。

似乎是调试的时候修改了,没有改回去。

@aruskkk

aruskkk commented Mar 5, 2024

Copy link
Copy Markdown

Hello 👋 I can't use Hma On other users on Google pixel

@YuruiHong

Copy link
Copy Markdown

感谢提交这个功能,我现在使用工作账户正好需要这个。 我合并这个提交,编译后发现一开始不能正常识别工作账户里的应用,后来发现是代码里默认不尝试授予INTERACT_ACROSS_USERS这个权限(函数默认参数是否),我手动授予后就正常工作了。

请问目前具体如何使用呢?我在编译安装此分支后尝试过在adb shell中pm grant com.tsng.hidemyapplist android.permission.INTERACT_ACROSS_USERS,但是仍然未改变可配置的应用。以及是否有必要在工作空间中也安装一份?

@hyperzlib

Copy link
Copy Markdown
Author

感谢提交这个功能,我现在使用工作账户正好需要这个。 我合并这个提交,编译后发现一开始不能正常识别工作账户里的应用,后来发现是代码里默认不尝试授予INTERACT_ACROSS_USERS这个权限(函数默认参数是否),我手动授予后就正常工作了。

请问目前具体如何使用呢?我在编译安装此分支后尝试过在adb shell中pm grant com.tsng.hidemyapplist android.permission.INTERACT_ACROSS_USERS,但是仍然未改变可配置的应用。以及是否有必要在工作空间中也安装一份?

这个只需要在主用户中安装。之前测试的时候使用的是安卓12,没有对安卓12以上的系统进行测试。

@astro-angelfish

astro-angelfish commented Feb 22, 2025

Copy link
Copy Markdown

我来挖个坟

在安卓15 (1+ ace 3v刷了oxygen os 15)中root权限下的pm list users只会返回0号用户, 包括通过反射调用的UserManager#getUsers也只会返回0号用户, 最终app列表会只显示自己

OP5E93L1:/ $ su
OP5E93L1:/ # pm list users
Users:
        UserInfo{0:机主:4c13} running
OP5E93L1:/ # pm list users
Users:
        UserInfo{0:机主:4c13} running

个人使用的反射方法如下:

  1. icu.nullptr.hidemyapplist.MyApp下添加fetchContext方法, 把applicationContext放出来 (谷歌说直接扔static变量会泄漏)
  2. 添加额外获取的权限SuUtils.execPrivileged("pm grant ${hmaApp.packageName} android.permission.MANAGE_USERS --user 0")
  3. 使用val userManager = hmaApp.fetchContext().getSystemService(Context.USER_SERVICE) as UserManager
  4. 反射调用UserManager#getUsers(boolean, boolean, boolean), 对应的谷歌源码
val boolPrimitiveClass = Boolean::class.javaPrimitiveType
val internalUsers = userManager::class.java.getMethod("getUsers", Class.forName("java.util.List"), boolPrimitiveClass, boolPrimitiveClass, boolPrimitiveClass).invoke(userManager, false, false, false)
  1. 你只看到有一个uid=0的用户

个人认为这个pr似乎已经过时, 在这楼中可见一斑

目前似乎需要额外的配合, 包括潜在的需要通过系统服务/底层框架来获取完整的App列表

若上述过程有谬误, 还烦请大佬们来斧正

另, 在root下可以直接使用pm list packages获取所有软件包, 无需通过遍历用户获取, 同时可通过添加-U参数获取对应的uid, 以制成这个pr内所支持的软件包信息格式.

@aviraxp
aviraxp force-pushed the master branch 2 times, most recently from 87282ad to d03edf7 Compare March 9, 2025 15:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants