2014-11-24 43 views
0

来自Android 5.0框架源代码的NotificationManagerService.java。 我不明白何时uid将为零。Android系统的uid等于零时意味着什么

private static boolean isUidSystem(int uid) { 
    final int appid = UserHandle.getAppId(uid); 
    return (appid == Process.SYSTEM_UID || appid == Process.PHONE_UID || uid == 0); 
} 

回答

1

Android的Process类包含了以下定义(其中包括)返回true:

/** 
* Defines the root UID. 
*/ 
public static final int ROOT_UID = 0; 

/** 
* Defines the UID/GID under which system code runs. 
*/ 
public static final int SYSTEM_UID = 1000; 

/** 
* Defines the UID/GID under which the telephony code runs. 
*/ 
public static final int PHONE_UID = 1001; 

这些构架值对应于内核uid S为rootsystem,和radio用户。在Android中,许多系统进程都作为这三个uid之一运行。

NotificationManagerService使用isUidSystem()来检查调用进程是否属于其中一个用户,如果是,请设置布尔型isSystemNotification(如果包名以android.*开头,它也会变为true)。

注意isSystemUid不直接比较上述值主叫uid,但首先运行它通过UserHandle.getAppId(),这需要内核值和器官功能障碍综合征它与UserHandle.PER_USER_RANGE,通常定义为100000(即,uid % PER_USER_RANGE)。这最终成为内核uid的最后五位数字,其中前两个数字对应于多用户设备上的userId

所以uidappId将为0对于运行作为根用户进程和应用程序,并且将isSystemUid()在这种情况下返回true。只要uid来自作为systemradio用户运行的呼叫者,它也会返回true。

1

我刚才算了一下,该代码意味着只对系统的UID,电话UID和根的UID(等于0)