GKI 버전 관리

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

용어 요약

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

이름 상징 예시 설명
커널 릴리스 wxy-zzz-k-접미사 5.4.42-android12-0-foo GKI 릴리스의 고유 식별자입니다. 이것은 uname 에서 반환된 값입니다.
KMI 버전 wx-zzz-k 5.4-android12-0 GKI와 DLKM(동적으로 로드 가능한 커널 모듈) 간의 커널 모듈 인터페이스(KMI)에 대해 설명합니다.
하위 수준 와이 42 동일한 KMI 버전 내에서 커널 릴리스의 릴리스 순서를 설명합니다.

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

이름 상징 예시 설명
wxy wxy 5.4.42

자세한 내용은 Linux 커널 Makefile ("KERNELELEASE" 검색)을 참조하세요.

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

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

이 튜플은 OTA 또는 메인라인을 포함한 업데이트로 인해 줄어들지 않아야 합니다.

커널 분기 zzz-wx 안드로이드12-5.4 이 용어는 공통 커널 분기 유형 에서 사용됩니다.
버전 5 이 용어는 이 문서에서 사용되지 않습니다. 이 변수는 libkver 에서 버전 이라고 합니다.
패치 레벨 엑스 4 이 용어는 이 문서에서 사용되지 않습니다. 이 변수는 libkver 에서 patch_level 이라고 합니다.
안드로이드 출시 쿨쿨 안드로이드12

커널이 연결된 Android(디저트) 릴리스 번호입니다.

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

Android 릴리스 번호는 OTA 또는 메인라인을 포함한 업데이트로 인해 줄어들지 않아야 합니다.

KMI 생성 케이 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 버전은 GKI와 동적으로 로드 가능한 커널 모듈(DLKM) 간의 커널 모듈 인터페이스(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는 커널 릴리스 또는 KMI 버전 문자열을 구문 분석하기 위한 C++ 인터페이스를 제공합니다. libkver가 노출하는 API 목록은 packages/modules/Gki/libkver/include/kver 를 참조하세요.

VINTF 체크

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

Android S에서 KMI 버전의 Android 릴리스 부분을 커널에서 추출하여 빌드 시 장치 매니페스트에 주입할 수 있습니다.

커널 구성 요구 사항은 일반적으로 변경되지 않으므로 호환성 매트릭스 내에서 k 를 인코딩할 필요가 없습니다. 그러나 커널 구성 요구 사항을 변경해야 하는 드문 경우에는 다음을 확인하십시오.

  • 호환성 매트릭스에서 해당 요구 사항이 제거됩니다.
  • KMI 생성을 조건으로 하는 새로운 요구 사항을 확인하기 위해 추가 VTS 테스트가 추가되었습니다.

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

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

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

ramdisk는 항상 처음부터 빌드되기 때문에 ramdisk 타임스탬프 를 사용하면 전체 부팅 이미지를 설명하기에 충분합니다. 앞으로 이전 부팅 이미지를 새 커널 바이너리에 연결하지 않는 한 부팅 이미지 버전에서 커널 릴리스를 인코딩할 필요가 없습니다.

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