기록

[GPT가 알려주는] AOSP랑 Soong 본문

잡동사니/GPT가 알려주는

[GPT가 알려주는] AOSP랑 Soong

heylo 2025. 11. 27. 17:13

좋다.
AOSP 전체 구조 + 부팅 과정 + vendor/telechips + 커널 + 파티션 + 이미지 빌드 흐름까지
초딩도 이해하는 레벨로 다시 싹 다 풀어서 알려줄게.
너 이제 진짜 Android IVI 개발자 맞음.


🧱 1. AOSP는 “안드로이드 레고 창고”

너가 쓰는
~/PROJECTS/MHC_TCC8070/android
== 안드로이드 레고 공장 전체.

안에는 다음이 있음:

  • 레고 조각 (소스코드)
  • 조각 설명서 → Android.bp
  • 특수 레고 → Soong/Ninja 빌드시 들어가는 모듈
  • 기계 장비 → 빌드 도구들

🤖 2. Soong = 조립 설계도 만드는 로봇

Android.bp들을 읽고
"이 부품은 먼저 만들고, 이건 나중에 만들고…"
전체 조립 계획(blueprint)을 만듦.

📘 Android.bp = 레고 조각 설명서
🛠 Soong = 설명서를 읽고 전체 계획을 만드는 로봇


⚡ 3. Ninja = 실제 조립하는 초고속 공장 기계

Soong이 만든 계획서를 받아서
진짜로 OS를 빌드하는 애.

Ninja가 돌 때:

  • system.img
  • vendor.img
  • boot.img
  • odm.img
  • product.img

같은 실제 “완성품”이 만들어짐.


🧩 4. 커널(Linux Kernel)은 레고 공장 바닥

안드로이드는 리눅스 커널 위에 돌아감.

커널은 다음을 담당함:

  • CPU 스케줄링
  • 메모리 관리
  • 파일 시스템
  • 드라이버 (UART, I2C, SPI, USB, GPU, CAN 등)
  • 프로세스 실행

📌 커널은 레고 공장의 바닥/기초임.

Android Framework/System은 그 위에서 놀고 있음.


🧰 5. Bootloader는 “레고 공장 기계 전원 켜는 친구”

Android는 부팅할 때 이렇게 감:

  1. Boot ROM (칩 안에 하드코딩)
  2. 1st Stage Bootloader (BL1)
  3. 2nd Stage Bootloader (BL2/U-Boot or LK)
  4. Vendor Boot
  5. Kernel 실행
  6. init 실행
  7. System 부팅

Telechips는 BL1/BL2/U-boot, Hypervisor 등 구조가 특이함.

🔌 Bootloader = 공장 전원 켜고, 커널을 불러오는 애


🗂 6. vendor/telechips는 “Telechips 회사에서 만든 특별 레고 조각”

Google AOSP는 순정 레고임.
하지만 너는 Telechips SoC(TCC8070)를 사용하기 때문에
추가로 필요한 조각들(touch driver, GPU hal, vehicle service 등)이 있음.

그래서:

  • SoC 별 HAL
  • Display service
  • Audio hal
  • CAN service
  • Boot-control
  • Subcore update
  • Hypervisor configs
  • 패치 파일들

이런 게 전부 vendor/telechips 아래에 있음.

📌 vendor = 있는 그대로 회사가 넣은 커스텀 레고 조각 저장소


🪛 7. device/telechips/* 는 “조립 안내서”

device/* 는 SoC/보드 구체 설정이 들어 있음.

  • 파티션 구조
  • init.rc 파일
  • 부팅 시 서비스 실행
  • Feature enable
  • 파일 위치 매핑
  • SELinux policy

📌 device/telechips/ = 해당 보드 전용 조립 설명서*


🧱 8. 파티션 = 레고 창고를 여러 칸으로 나눈 것

Android 파티션은 이렇게 나뉩니다:

  • boot → 커널 + ramdisk
  • vendor_boot → 커널 관련 추가 파일
  • dtbo → 장치 트리
  • system → Android framework
  • vendor → Telechips HAL
  • product → OEM 앱
  • odm → 파트너(HMG, OEM) ai 가능한 부분
  • super → system/vendor/product 통합 파티션

📌 파티션 = 레고 박스를 종류별로 분리한 것


🛠️ 9. Android 부팅 순서(초딩버전)

① Bootloader

“얘들아 커널 실행할 준비해!”

② Kernel

“오케이, 안드로이드 공장 바닥 설치!”

③ init (PID 1)

“자~ 공장 기계들 전부 켜자”

④ Zygote 시작

“앱 만드는 공장 준비!”

⑤ SystemServer

“Wi-Fi, Bluetooth, Audio, Display, Window 다 준비!”

⑥ Launcher 실행

“짜잔! 화면 켜짐!”


🌈 10. vendor/telechips/aosp-patch 는 “레고 조각을 수정하는 패치 모음집”

Telechips가 Android 오픈소스를 그대로 쓰지 않고
수정해야 하는 부분이 있을 때

  • Bootloader message 크기 변경
  • Hypervisor integration
  • partition layout fix
  • HAL bug fix

이런 걸 patch 파일로 제공함.

📌 그래서 문제 있으면 보통 여기서 충돌이 남.


🚀 11. 전체 AOSP 빌드가 어떻게 도는지 (초딩버전 완성)

  1. envsetup.sh / lunch
    → 로봇(Soong)을 깨운다
  2. Soong
    → 전체 Android.bp 읽고 조립 계획 작성
  3. Ninja
    → 계획대로 system/vendor/product 이미지 조립
  4. Out 디렉터리
    → 완성된 레고 세트(system.img 등)가 생성됨
  5. FWDN or fastboot flash
    → 기기에 설치됨
  6. 기기 부팅
    → Bootloader → Kernel → Android Framework → Launcher

완.벽.


🔍 너가 지금 겪은 에러 설명도 초딩 버전으로…

문제 상황

bootloader_message_ab라는 레고 조각(X 부품)의 크기
구글 기본 AOSP에서는 4096바이트인데
Telechips 버전에서는 8192바이트가 필요함.

근데 어떤 박스에는 4096이라고
어떤 박스에는 8192라고 적혀 있어서
로봇(Soong)이 조립하다가:

“뭐야?? 크기 안 맞아!! 멈춰!!!”

하고 빌드를 중단한 것.

왜 에러 메시지에 6144가 나왔냐?

4096 → 구글 AOSP 원래 크기
8192 → Telechips 패치 적용 후 필요한 크기

하지만 너의 코드에서는 구조체가 애매하게 수정되어
실제 크기가 6144가 되어버린 것.

즉,

  • Telechips 패치 제대로 안 적용됨
  • 반쪽짜리 패치 적용
  • struct 안의 배열 길이가 어중간함
  • padding 잘못 들어감
  • .git/rebase-apply 잔해가 충돌함

이런 이유로 “6144바이트짜리 괴물 조각”이 나온 것.


👍 결론

필요하면 지금 네 local project에서 정확히 어떤 파일에서 struct가 6144가 되었는지 계산도 해줄 수 있음.

네가 원하면:

  • bootloader_message_ab 전체 구조 계산
  • Telechips 패치와 AOSP 원본 diff
  • 어느 부분에서 padding이 발생했는지
  • 최종적으로 8192로 일치시키는 정확한 수정본 제공
  • patch 파일로 만들어서 바로 git apply 할 수 있게 생성

다 할 수 있음.

원해?