Loading
2014. 3. 16. 08:20 - 알 수 없는 사용자

안드로이드 커널 빌드 및 플래싱 파일 생성 방법


안녕하세요, 칼다리스입니다. 환경 구축에 대한 글을 쓴지도 꽤 시간이 지났네요. 이사준비 등 바쁜 일이 많아 커널은 거의 건드리지 못했네요. 지난 글에선 커널 빌드를 위한 개발환경 구축에 대해 알아보았으니 이번엔 커널을 빌드하는 과정과 배포를 위한 커스텀 리커버리 플래싱 파일을 만드는 방법을  알아보겠습니다.



커널 소스

커널 빌드는 시간이 좀 걸린다는 것 뿐이지 실제로 어려운 점은 별로 없습니다. 우선 빌드하고자 하는 커널의 소스코드를 다운로드해 시작해야겠죠? 각 제조사마다 오픈소스 사이트를 운영해 커널 소스를 공개해둡니다:

삼성 http://opensource.samsung.com/

LG http://www.lg.com/global/support/opensource/index

팬택 http://opensource.pantech.com/model/list.asp?Category=Mobile

HTC http://www.htcdev.com/devcenter/downloads

소니 http://developer.sonymobile.com/downloads/opensource/


대부분 사이트는 갤럭시 S3, 베가 R3 식이 아닌 M440S, A850K처럼 모델명을 이용하니 모델명을 먼저 알아둘 필요가 있습니다. 압축파일일 경우 압축을 풀면 arch, block같은 폴더들이 나오니 바로 커널 소스입니다. 여러분이 사용하는 디바이스의 클럭, 그래픽 외 상당 수의 기능들이 이 소스를 트윅하여 개발됩니다.



램디스크

커널 소스에서 빌드되는 파일들은 zImage와 ko확장자를 가진 모듈입니다. 하지만 커널을 완성하기 위해선 램디스크라는 것이 필요한데 이미 존재하는 커널에서 추출해야 합니다. 인터넷에서 검색을 통해 찾으셔도 되며 직접 디바이스에서 boot.img를 추출하셔도 됩니다. boot.img에서 램디스크를 추출하는 프로그램은 여러 개발자들이 배포해 여러가지가 존재합니다. 제 경우엔 Koush님의 AnyKernel을 약간 수정해 디바이스에서 직접 언팩을 해 필요한 파일들을 추출했습니다.


직접 추출을 하시려면 먼저 디바이스에서 파일탐색기를 이용해 /dev/block/platform/msm_sdcc.1/by-name으로 들어가 boot폴더의 링크 경로를 찾아야 합니다. 보통 /dev/block/mmcblk0p#형식입니다. 다음은 이 링크를 통해 kernelunpacker.zip을 받으신 후 /META-INF/com/google/android/updater-script를 열어 9번째 줄에 mmcblk0p7을 아까 찾은 경로로 수정합니다. 이후 커스텀 리커버리에서 zip파일을 플래싱하면 내장메모리에 램디스크를 비롯해 boot.img-로 시작하는 커널을 만드는데 필요한 여러 파일들이 내장메모리에 생성됩니다.



커널 빌드

커널 빌드 환경 구축은 복잡했지만 직접적인 빌드 과정은 그리 어렵지 않습니다. 터미널을 이용해 몇가지 명령어만 적어주고 기다리면 필요한 이미지가 나오게 되죠. 명령어는 디바이스나 제조사에 따라 약간 다르지만 다음과 비슷합니다:

  • export ARCH=arm
  • export CROSS_COMPILE=<툴체인 경로>
  • make clean <<= 커널 빌드 후 새로운 빌드를 위해 코드 잔해 제거
  • make ####_defconfig <<= 커널 빌드 시 적용할 설정
  • make <<= 커널 빌드

이렇게 명령어를 실행하면 커널의 한부분인 zImage와 제조사에 따라 함께 필요한 .ko 모듈 파일들이 생성됩니다. 처음 2개의 명령어는 공통적이지만 나머지는 제조사에 따라 다르니 커널 소스와 함께 배포되는 README 파일을 참조하시기 바랍니다.
물론 빌드 자체는 쉽지만 소스코드를 수정해 기능을 추가하는 것이 어려운 작업이죠. 소스코드를 수정하는데 대한 팁과 깃헙사용법은 다음에 다루도록 하겠습니다.



커널 리팩

zImage와 램디스크, 모듈이 준비되었다면 boot.img형식으로 리팩을 해야합니다. boot.img 언패킹과 마찬가지로 repack하는 도구가 따로 있으나 이 역시 여러가지가 존재합니다. 전 언팩과 마찬가지로 디바이스에서 리팩하는 형식을 이용합니다. 전 AnyKernel을 직접 수정해 사용 중이지만 귀차니즘이 발동하신 분들은 Koush님의 AnyKernel을 다운로드해 /kernel폴더에 zImage를, /system/lib/modules폴더에 .ko 모듈을 삽입한 후 플래싱하시면 됩니다.


만약 램디스크를 수정하셨다면 스크립트를 약간 수정하셔야 플래싱 가능합니다. 제 커널을 다운로드해 kernel폴더의 내용 중 base, cmdline, pagesize, ramdisk.gz, zImage를 디바이스에 맞는 파일들로 수정하셔야 합니다. 이 때 앞부분의 "boot.img-"는 제거하시면 됩니다. system폴더의 etc폴더는 삭제하신 후 모듈이 있다면 /system/lib/modules 경로에 넣으세요. 이후 updater-script를 열어 다음 내용을 넣습니다:

  • mount("MTD", "system", "/system");
  • package_extract_dir("system", "/system");
  • package_extract_dir("kernel", "/tmp");
  • set_perm(0, 0, 0777, "/tmp/mkbootimg.sh");
  • set_perm(0, 0, 0777, "/tmp/mkbootimg");
  • set_perm(0, 0, 0777, "/tmp/busybox");
  • run_program("/tmp/mkbootimg.sh");
  • run_program("/tmp/busybox", "dd", "if=/tmp/newboot.img", "of=/dev/block/mmcblk0p#"); <<경로 수정하세요
  • unmount("/system");


*주의* 직접할 땐 몰랐는데 여러 디바이스를 위해 쓰려니 어렵네요. zImage형식으로 배포되는 같은 디바이스를 위한 커널 플래싱 파일을 참고하시는게 최고입니다.



위와 같이 준비하셨다면 플래싱할 준비가 되었습니다. 우선 사용 중인 커널을 백업해두신 후 새로 빌드하신 커널을 플래싱해 성공하시면 여러분 역시 커널 개발자(?)가 되었습니다!