对android:sharedUserId="android.uid.system"的讨论

使用

使用前提:签名要和系统相同。

使用时机:应用需要system 权限时;内存不足,或优先级低的时候不容易被干掉时。

使用效果:让程序运行在系统进程中,这样就有权限修改系统的值了。

应用不添加android.uid.system时崩溃的场景

1、Sound-Advanced settings-Sound Feedback设置Low时崩溃

崩溃日志:java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

问题定位到源码这段代码:Settings.Global.putInt(context.getContentResolver(),  Settings.Global.SOUND_EFFECTS_TYPE,value)

2、Sound-Advanced settings-Digital audioout设置Auto时崩溃

崩溃日志:java.lang.SecurityException: Permission denial: writing to settings requires:android.permission.WRITE_SECURE_SETTINGS

问题定位到源码这段代码:Settings.Global.putString(context.contentResolver, "nrdp_external_surround_sound_enabled", "1")

应用使用“android.uid.system”的原因

  1. 系统预装应用,可以使用“android.uid.system
  2. 使用了权限“,而在android 6.0及以后,WRITE_SETTINGS权限的保护等级已经由原来的dangerous升级为signature”,也就意味着SystemSettings需要用系统签名或者成为系统预装软件才能够申请此权限,并且还需要提示用户跳转到修改系统的设置界面去授予此权限。

注:SYSTEM_ALERT_WINDOW and WRITE_SETTINGS, 这两个权限比较特殊,不能通过代码申请方式获取,必须得用户打开软件设置页手动打开,才能授权。(参考文章:https://www.jianshu.com/p/2746a627c6d2

结论

应用需要使用android:sharedUserId="android.uid.system"。首先,它是系统预装应用,一般来说是使用的;其次,使用了权限“,需要system权限,所以需要使用。

你可能感兴趣的:(Android)