在执行以下操作之前备份您的资料,因为您很有可能会损坏您的手机。
不是一个完整的答案,但简而言之,一些应用程序倾向于将其用户信息存储为/data/system/packages.list 中的空格分隔值,而其他应用程序倾向于将用户信息存储为/data/system/packages.xml 中的 XML 格式。此外,在终端中看到的所有权看起来与它们在这些文件中的外观有些不同。例如,在我的手机上,Whatsapp 是 Unix 用户 u0_a70,而它的 XML 条目将其标识为 userId="10070"。
因此,“仅修复”用户权限有点困难,因为您需要 2 个不同的脚本来查看 2 个完全不同的数据集,而且 Android Linux 并不完全附带 XML 解析器。所需的用户 ID 转换也无济于事,因为它并不总是适用。
如果您准备好迎接挑战,使用 BusyBox 箱的起点如下:
# Generate a permissions fixer from /data/system/packages.list:
cat /data/system/packages.list | awk '{print "chown u0_a" $2-10000 ":u0_a" $2-10000 " /data/data/"$1" -R"}' > /data/media/fix_perms.sh
chmod +x /data/media/fix_perms.sh
这将生成一个如下所示的行列表:
chown u0_a17:u0_a17 /data/data/com.google.android.gsf -R
chown u0_a6:u0_a6 /data/data/com.android.keyguard -R
chown u0_a52:u0_a52 /data/data/com.google.android.calendar -R
chown u0_a48:u0_a48 /data/data/com.android.chrome -R
chown u0_a55:u0_a55 /data/data/jackpal.androidterm -R
这是有希望的。但是,这不适用于像“蓝牙”、“无线电”和“系统”这样的用户,并且与这些用户的线路会产生如下垃圾:
chown -8998:-8998 /data/data/com.android.bluetooth -R
因此,您需要在运行脚本之前对所有内容进行全面检查。解决此问题的一种天真的方法可能是将上述 cat..awk 导入| egrep -v '[0-9][0-9][0-9][0-9]:-[0-9][0-9][0-9][0-9]',但这是一个 hack 解决方案,并非在所有情况下都有效。如果这对您来说是可以接受的,那么您可以将以上内容组合成一行重定向到 /data/media/fix_perms.sh。
现在,这不会修复仅在 /data/system/packages.xml 中定义的任何内容,并且几乎可以保证任何常规脚本都会在设备上失败,因此我不会对此进行介绍。如果您确实想要一个可能的解决方案,请发表评论,我也会为 XML 文件编写一个模拟脚本。