2014-11-24 3 views
0

안드로이드 5.0 프레임 워크 소스 코드의 NotificationManagerService.java에서. uid가 0 일 때 나는 이해할 수 없다.안드로이드 시스템의 uid가 0 일 때의 의미

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

답변

1

안드로이드의 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; 

이 프레임 워크의 값은 root, systemradio 사용자 uid의 커널 해당합니다. Android에서는 많은 시스템 프로세스가 uid 세 개 중 하나로 실행됩니다.

NotificationManagerService는 호출 프로세스가 이러한 사용자 중 하나가 소유 그렇다면, (패키지 이름이 android.*로 시작되는 경우 그것은 또한 사실 끝) 부울 isSystemNotification 설정되어 있는지 확인하는 isUidSystem()를 사용합니다. isSystemUid 바로 위의 값으로 호출 uid 비교하지만, 제 정상적으로 100,000 정의 UserHandle.PER_USER_RANGE와 커널 값 및 개조를 취하는데, 이는 UserHandle.getAppId() 통해 실행하지 않는

주 (즉, uid % PER_USER_RANGE). 결국 커널 uid의 마지막 다섯 자리 숫자가됩니다. 첫 번째 두 개는 다중 사용자 장치의 userId에 해당합니다.

는 그래서 uidappId 루트 사용자로 실행중인 프로세스 및 응용 프로그램에 대한 0 될 것이며, isSystemUid()이 경우 true를 반환합니다. uid가 system 또는 radio 사용자로 실행중인 호출자로부터 왔을 때도 true를 반환합니다.

1

난 그냥 생각의 코드는 시스템 UID, 전화 UID 및 (0 같음) 루트 UID

관련 문제