GKI 버전 관리

이 페이지에서는 일반 커널 이미지(GKI)의 버전 관리 체계를 설명합니다. 일반 커널 이미지(GKI)에는 커널 출시라는 고유 식별자가 있습니다. 커널 출시는 커널 모듈 인터페이스(KMI) 버전과 하위 수준으로 구성됩니다. 커널 출시는 출시되는 이미지에 따라 다르지만 KMI 버전은 출시가 빌드된 인터페이스를 나타냅니다. KMI 버전은 여러 커널 출시를 지원할 수 있습니다. 커널 출시는 한 KMI 버전에만 연결됩니다. 드물지만 커널 모듈 인터페이스를 변경해야 할 때에는 KMI 세대를 반복하여 KMI 버전의 변경사항을 반영합니다.

용어 요약

다음 표에는 이 페이지와 GKI 업데이트에 사용되는 중요한 용어가 요약되어 있습니다.

이름 기호 설명
커널 출시 w.x.y-zzz-k-suffix 5.4.42-android12-0-foo GKI 출시의 고유 식별자입니다. uname에서 반환한 값입니다.
KMI 버전 w.x-zzz-k 5.4-android12-0 동적으로 로드 가능한 커널 모듈(DLKM)과 GKI 간의 커널 모듈 인터페이스(KMI)를 설명합니다.
하위 수준 y 42 같은 KMI 버전 내에서 커널 출시의 출시 순서를 설명합니다.

다음 표에는 기타 관련 용어가 참조용으로 나열되어 있습니다.

이름 기호 설명
w.x.y w.x.y 5.4.42

자세한 내용은 Linux 커널 Makefile('KERNELRELEASE' 검색)을 참고하세요.

w.x.y는 이 문서 전체에서 직접 사용됩니다. 일반적으로 세 부분 버전 번호라고도 합니다. VINTF에서 사용되는 용어인 커널 버전은 다른 용어, 특히 w와 혼동을 일으킬 수 있습니다.

이 변수는 libkver에서 kernel_version_tuple이라고 합니다.

이 튜플은 OTA나 메인라인을 비롯하여 업데이트로 인해 낮아져서는 안 됩니다.

커널 분기 zzz-w.x android12-5.4 이 용어는 일반 커널 분기 유형에서 사용됩니다.
버전 w 5 이 문서에서는 사용되지 않는 용어입니다. 이 변수는 libkver에서 버전이라고 합니다.
패치 수준 x 4 이 문서에서는 사용되지 않는 용어입니다. 이 변수는 libkver에서 patch_level이라고 합니다.
Android 출시 zzz android12

커널이 연결된 Android(디저트) 출시 번호입니다.

AndroidRelease 필드를 비교할 때 숫자 부분은 비교를 위해 문자열에서 추출됩니다.

Android 출시 번호는 OTA나 메인라인을 비롯하여 업데이트로 인해 낮아져서는 안 됩니다.

KMI 세대 k 0

드물게 발생하는 이벤트 처리를 위해 추가된 번호입니다. 보안 버그 수정을 위해 같은 Android 출시 내에서 KMI를 변경해야 하는 경우 KMI 세대가 증가합니다.

KMI 세대 번호는 0으로 시작합니다.

버전 관리 디자인

커널 출시

정의

GKI와 함께 제공되는 기기의 경우 커널 출시는 다음과 같이 정의됩니다.

KernelRelease :=
Version.PatchLevel.SubLevel-AndroidRelease-KmiGeneration-suffix
w      .x         .y       -zzz           -k            -something

자세한 내용은 기기에서 커널 출시 확인을 참고하세요.

다음은 커널 출시를 보여주는 예입니다.

5.4.42-android12-0-00544-ged21d463f856

설명

커널 출시는 GKI 출시의 고유 ID입니다. GKI 바이너리 두 개가 같은 커널 출시를 보유하면 바이트별로 동일해야 합니다.

커널 출시는 KMI 버전과 하위 수준, 접미사로 구성됩니다. 이 문서에서는 KMI 세대 뒤의 접미사는 무시합니다.

KMI 버전

정의

KMI 버전은 다음과 같이 정의됩니다.

KmiVersion :=
Version.PatchLevel-AndroidRelease-KmiGeneration
w      .x         -zzz           -k

하위 수준 y는 KMI 버전의 일부가 아닙니다. 커널 출시의 예에서 KMI 버전은 다음과 같습니다.

5.4-android12-0

설명

KMI 버전은 동적으로 로드 가능한 커널 모듈(DLKM)과 GKI 간의 커널 모듈 인터페이스(KMI)를 설명합니다.

커널 출시 두 개가 같은 KMI 버전을 보유하면 같은 커널 모듈 인터페이스를 구현합니다. 하나와 호환되는 DLKM은 다른 하나와도 호환됩니다.

KMI 버전은 OTA 업데이트로 인해 낮아져서는 안 됩니다.

하위 수준

하위 수준 y는 같은 KMI 버전 내에서 커널 출시의 출시 순서를 설명합니다.

KMI 버전은 같지만 하위 수준은 각각 Y1과 Y2인 커널 출시 두 개는 다음과 같습니다.

  • Y1이 Y2보다 작거나 같으면 Y1을 실행하는 기기는 Y2 업데이트를 받을 수 있습니다.
  • Y1이 Y2보다 크면 Y1을 실행하는 기기는 Y2로 업데이트할 수 없습니다.

즉, KMI 버전이 변경되지 않으면 하위 수준은 OTA 업데이트로 인해 낮아져서는 안 됩니다.

기기에서 커널 출시 확인

전체 커널 출시는 uname -r, 또는 다음 코드 스니펫과 함께 uname(2)를 실행하여 확인할 수 있습니다.

std::string get_kernel_release() {
  struct utsname buf;
  return uname(&buf) == 0 ? buf.release : "";
}

출력 예는 다음과 같습니다.

5.4.42-android12-0-00544-ged21d463f856

이 문서에서는 커널 정보를 추출할 때 KMI 세대 뒤의 모든 내용이 무시됩니다. 좀 더 공식적으로 uname -r의 출력은 다음 정규식으로 파싱됩니다(zzz가 항상 'android'로 시작한다고 가정).

^(?P<w>\d+)[.](?P<x>\d+)[.](?P<y>\d+)-(?P<z>android\d+)-(?P<k>\d+).*$

무시되는 정보에는 ci.android.com 빌드 번호, 기준 커널 위의 패치 수, git 커밋의 SHA 해시와 같은 정보가 포함될 수 있습니다.

libkver

라이브러리 libkver은 커널 출시나 KMI 버전 문자열을 파싱하는 C++ 인터페이스를 제공합니다. libkver에서 노출하는 API 목록은 packages/modules/Gki/libkver/include/kver을 참고하세요.

VINTF 검사

Android 11 이하의 경우 KMI 버전의 Android 출시 부분은 기기 제조업체가 기기 매니페스트에 수동으로 지정합니다. 자세한 내용은 VINTF 커널 일치 규칙을 참고하세요.

Android S부터 KMI 버전의 Android 출시 부분은 커널에서 추출하여 빌드 시 기기 매니페스트에 삽입할 수 있습니다.

커널 구성 요구사항은 일반적으로 변경되지 않으므로 호환성 매트릭스 내에서 k를 인코딩하지 않아도 됩니다. 그러나 드물지만 커널 구성 요구사항을 변경해야 하는 경우에는 다음 사항을 확인하세요.

  • 호환성 매트릭스에서 이에 상응하는 요구사항이 삭제됩니다.
  • 추가 VTS 테스트가 추가되어 KMI 세대에 따른 새 요구사항을 확인합니다.

OTA 메타데이터의 부팅 이미지 버전

부팅 이미지가 OTA 업데이트를 통해 업데이트되더라도 OTA 페이로드 형식 payload.bin으로 래핑되어야 합니다. OTA 페이로드는 각 파티션의 version 필드를 인코딩합니다. update_engine이 OTA 페이로드를 처리할 때 이 필드를 비교하여 파티션이 다운그레이드되지 않도록 합니다.

혼동을 피하기 위해 OTA 메타데이터의 부팅 파티션 version 필드를 boot image version이라고 합니다.

램디스크는 항상 처음부터 빌드되므로 램디스크 타임스탬프를 사용하면 전체 부팅 이미지를 설명하기에 충분합니다. 부팅 이미지 버전에서 커널 출시를 인코딩하지 않아도 됩니다. 단, 이후에 이전 부팅 이미지를 새 커널 바이너리에 병합하는 경우는 예외입니다.

OTA 업데이트 전에 OTA 클라이언트는 다른 파티션과 같은 방식으로 부팅 이미지 버전을 확인합니다.