使用
使用前提:签名要和系统相同。
使用时机:应用需要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”的原因
- 系统预装应用,可以使用“android.uid.system”
- 使用了权限“<uses-permission android:name="android.permission.WRITE_SETTINGS" />,而在android 6.0及以后,WRITE_SETTINGS权限的保护等级已经由原来的dangerous升级为signature”,也就意味着SystemSettings需要用系统签名或者成为系统预装软件才能够申请此权限,并且还需要提示用户跳转到修改系统的设置界面去授予此权限。
注:SYSTEM_ALERT_WINDOW and WRITE_SETTINGS, 这两个权限比较特殊,不能通过代码申请方式获取,必须得用户打开软件设置页手动打开,才能授权。(参考文章:在android M版本SYSTEM_ALERT_WINDOW权限无法获取问题 - 简书)
结论
应用需要使用android:sharedUserId="android.uid.system"。首先,它是系统预装应用,一般来说是使用的;其次,使用了权限“<uses-permission android:name="android.permission.WRITE_SETTINGS" />,需要system权限,所以需要使用。