내가 쓴 Android 커널 빌드하기.
Android :
2009. 8. 1. 17:19
반응형
AESOP 싸이트에서 많이 참조
안드로이드 소스코드 관련 된 구글 페이지는 : http://source.android.com/ 이다.
안드로이드 SDK 관련 된 구글 페이지는 : http://code.google.com/intl/ko/android/ 이다.
사전 준비로 다음의 패키지들을 설치한다.
자바 jdk 도 설치하고 다음을 ~/.bashrc 에 등록해준다. (자바는 1.5 버전이어야 한다.)
이제 사전 준비는 다 끝났다. 일단 bin 디렉토리를 만든다. (여기에 repo 라는 프로그램을 다운받아놓고 쓸 것이다.)
그리고 편하게 쓰기 위해서
~/.bashrc 파일에 다음과 같이 PATH 설정을 해준다.
안드로이드 소스를 받을 때는 git 과 repo라는 프로그램을 사용한다.
구글에서는 git 과 repo를 다음과 같이 설명하고 있다.
다운받은 repo프로그램을 사용할 수 있도록 퍼미션을 설정한다. (모든 유저에 실행 권한을 준다.)
그다음엔 안드로이드 소스코드를 다운받을 디렉토리를 만든다.
이제 repo를 설정하여 다운받을 준비를 한다.
다음 명령어를 실행하면 git(SVN처럼 소스관리 프로그램 같은데)으로 받을 소스를 설정하는 메시지가 나오는 것을 볼수 있다.
여기서 -b 옵션은 받고자 하는 branch를 고르는 것이다.(예 : -b cupcake 또는 -b donut 또는 -b android-1.5r3)
만들어둔 디렉토리로 들어간다.
이제 repo를 실행해서 소스를 받는다. 실행시켜 보면 아시겠지만 뭐 여러가지 받는데. 엄청 오래 걸린다. 느긋하게 기다리자.
다 받아진거 같으면 디렉토리를 들여다 보자.
.repo 디렉토리는 아까 위에서 (# repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5r3)를 했을 때 정보를 저장하기 위해 생성되는 디렉토리이다.
나머지는 그냥 repo로 저장소에서 받아온 것들이고 원래 옛날에는 kernel 디렉토리도 같이 받아졌는데 요새는 따로 받는다고 한다.
다운 받았으면 다음을 ~/.bashrc에 등록해준 다음 make 한다.
만일 자신의 PC의 CPU 코어가 멀티 코어라면 make -j2 처럼 -j 옵션 뒤에 숫자를 써주면 컴파일을 더 빠르게 할 수 있다. (나같은 경우 VMWare 에서 # make -j2 하면 에러났다. 그래서 그냥 make 했다.)
모두 build 되면 out 디렉토리 안에 결과물이 생긴다.
여기에 생긴 파일들을 RootFS 로 사용한다.
디렉토리에 들어가서 결과물을 확인해보자.
이제 커널을 받아보자.
받아진 커널 버전이 뭔지 보려면
최신 버전 2.6.29로 업그레이드 하려면
컴파일 하려면 일단 다음과 같이 arm 이라고 지정하고 크로스컴파일러를 지정해준다.
※ 안드로이드에서 지원하는 가상화 SoC인 goldfish를 사용하고 싶거나. MSM 퀄컴칩을 사용하고 싶을때는 다음과 같이 하면 된다. (다음에서는 크로스 컴파일러는 안드로이드 소스에 들어있는 prebuilt 된 arm-eabi 툴체인을 사용한 것이다.)
위의 명령어를 실행해서 configure 를 진행한다.
알아서 설정한후에 Save an Alternate Configureation File 을 하고 .config 파일로 저장하고 나온다.
컴파일은 make zImage 라고 하면 된다.
NFS로 RootFS를 제공할 디렉토리를 만든다.
결과물을 위에서 만든 디렉토리로 복사한다.
NFS 서버로 쓸 디렉토리로 가서 퍼미션을 설정 한다.
처음 부팅하면 다음과 같은 화면이 한참 보인다.
난 다운된줄 알고 여러번 껐다 켰으나 알고보니 다운된것이 아니라.
처음 부팅할때 data 디렉토리에 파일을 생성하는 작업을 하고 있는것이었다.
그리고 배터리 체크 부분을 막지 않으면 다음과 같은 화면이 나오니
컴파일시에 배터리 패치를 하자.
로그가 보고 싶다면 엔터를 친후에
내가 갖고 있는 안드로이드 RootFS 버전을 알고 싶다면
안드로이드 소스코드 관련 된 구글 페이지는 : http://source.android.com/ 이다.
안드로이드 SDK 관련 된 구글 페이지는 : http://code.google.com/intl/ko/android/ 이다.
사전 준비로 다음의 패키지들을 설치한다.
# apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl git-core git
# apt-get install valgrind
# apt-get install valgrind
자바 jdk 도 설치하고 다음을 ~/.bashrc 에 등록해준다. (자바는 1.5 버전이어야 한다.)
#JAVA Setting
export AJVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export ANDROID_JAVA_HOME=$JAVA_HOME
export AJVA_HOME=/usr/lib/jvm/java-1.5.0-sun
export ANDROID_JAVA_HOME=$JAVA_HOME
이제 사전 준비는 다 끝났다. 일단 bin 디렉토리를 만든다. (여기에 repo 라는 프로그램을 다운받아놓고 쓸 것이다.)
#mkdir bin
그리고 편하게 쓰기 위해서
~/.bashrc 파일에 다음과 같이 PATH 설정을 해준다.
#for Android repo
export PATH=${PATH}:~/bin
export PATH=${PATH}:~/bin
안드로이드 소스를 받을 때는 git 과 repo라는 프로그램을 사용한다.
구글에서는 git 과 repo를 다음과 같이 설명하고 있다.
그다음에 다음의 명령어를 이용해서 우리가 만들어둔 ~/bin 디렉토리에 repo를 다운받는다.
#curl http://android.git.kernel.org/repo >~/bin/repo
다운받은 repo프로그램을 사용할 수 있도록 퍼미션을 설정한다. (모든 유저에 실행 권한을 준다.)
#chmod a+x ~/bin/repo
그다음엔 안드로이드 소스코드를 다운받을 디렉토리를 만든다.
#mkdir myAndroid
이제 repo를 설정하여 다운받을 준비를 한다.
다음 명령어를 실행하면 git(SVN처럼 소스관리 프로그램 같은데)으로 받을 소스를 설정하는 메시지가 나오는 것을 볼수 있다.
여기서 -b 옵션은 받고자 하는 branch를 고르는 것이다.(예 : -b cupcake 또는 -b donut 또는 -b android-1.5r3)
# repo init -u git://android.git.kernel.org/platform/manifest.git -b donut
위 명령어를 실행하면 개발자로 등록하라고 Name 과 Email 을 쓰라고 나온다. 써도 되고 안써도 상관없다.만들어둔 디렉토리로 들어간다.
# cd myAndroid/
이제 repo를 실행해서 소스를 받는다. 실행시켜 보면 아시겠지만 뭐 여러가지 받는데. 엄청 오래 걸린다. 느긋하게 기다리자.
# repo sync
다 받아진거 같으면 디렉토리를 들여다 보자.
.repo 디렉토리는 아까 위에서 (# repo init -u git://android.git.kernel.org/platform/manifest.git -b android-1.5r3)를 했을 때 정보를 저장하기 위해 생성되는 디렉토리이다.
나머지는 그냥 repo로 저장소에서 받아온 것들이고 원래 옛날에는 kernel 디렉토리도 같이 받아졌는데 요새는 따로 받는다고 한다.
root@realg-desktop:~/myAndroid# l
total 60
drwxr-xr-x 14 root root 4096 Aug 1 17:13 .
drwxrwxrwx 31 root root 4096 Aug 1 16:35 ..
drwxr-xr-x 6 root root 4096 Aug 1 17:11 .repo
-r--r--r-- 1 root root 87 Aug 1 17:11 Makefile
drwxr-xr-x 9 root root 4096 Aug 1 17:11 bionic
drwxr-xr-x 5 root root 4096 Aug 1 17:11 bootable
drwxr-xr-x 7 root root 4096 Aug 1 17:11 build
drwxr-xr-x 18 root root 4096 Aug 1 17:11 dalvik
drwxr-xr-x 16 root root 4096 Aug 1 17:11 development
drwxr-xr-x 61 root root 4096 Aug 1 17:12 external
drwxr-xr-x 5 root root 4096 Aug 1 17:12 frameworks
drwxr-xr-x 5 root root 4096 Aug 1 17:12 hardware
drwxr-xr-x 5 root root 4096 Aug 1 17:12 packages
drwxr-xr-x 9 root root 4096 Aug 1 17:13 prebuilt
drwxr-xr-x 6 root root 4096 Aug 1 17:13 system
root@realg-desktop:~/myAndroid#
total 60
drwxr-xr-x 14 root root 4096 Aug 1 17:13 .
drwxrwxrwx 31 root root 4096 Aug 1 16:35 ..
drwxr-xr-x 6 root root 4096 Aug 1 17:11 .repo
-r--r--r-- 1 root root 87 Aug 1 17:11 Makefile
drwxr-xr-x 9 root root 4096 Aug 1 17:11 bionic
drwxr-xr-x 5 root root 4096 Aug 1 17:11 bootable
drwxr-xr-x 7 root root 4096 Aug 1 17:11 build
drwxr-xr-x 18 root root 4096 Aug 1 17:11 dalvik
drwxr-xr-x 16 root root 4096 Aug 1 17:11 development
drwxr-xr-x 61 root root 4096 Aug 1 17:12 external
drwxr-xr-x 5 root root 4096 Aug 1 17:12 frameworks
drwxr-xr-x 5 root root 4096 Aug 1 17:12 hardware
drwxr-xr-x 5 root root 4096 Aug 1 17:12 packages
drwxr-xr-x 9 root root 4096 Aug 1 17:13 prebuilt
drwxr-xr-x 6 root root 4096 Aug 1 17:13 system
root@realg-desktop:~/myAndroid#
다운 받았으면 다음을 ~/.bashrc에 등록해준 다음 make 한다.
export ANDROID_JAVA_HOME=$JAVA_HOME
만일 자신의 PC의 CPU 코어가 멀티 코어라면 make -j2 처럼 -j 옵션 뒤에 숫자를 써주면 컴파일을 더 빠르게 할 수 있다. (나같은 경우 VMWare 에서 # make -j2 하면 에러났다. 그래서 그냥 make 했다.)
# make
모두 build 되면 out 디렉토리 안에 결과물이 생긴다.
root@realg-desktop:~/android_donut# l
total 68
drwxr-xr-x 16 root root 4096 Aug 1 18:02 .
drwxrwxrwx 30 root root 4096 Aug 1 18:51 ..
drwxr-xr-x 6 root root 4096 Aug 1 17:59 .repo
-r--r--r-- 1 root root 87 Aug 1 17:59 Makefile
drwxr-xr-x 9 root root 4096 Aug 1 17:59 bionic
drwxr-xr-x 5 root root 4096 Aug 1 17:59 bootable
drwxr-xr-x 7 root root 4096 Aug 1 17:59 build
drwxr-xr-x 18 root root 4096 Aug 1 17:59 dalvik
drwxr-xr-x 17 root root 4096 Aug 1 18:00 development
drwxr-xr-x 68 root root 4096 Aug 1 18:00 external
drwxr-xr-x 5 root root 4096 Aug 1 18:00 frameworks
drwxr-xr-x 6 root root 4096 Aug 1 18:00 hardware
drwxr-xr-x 4 root root 4096 Aug 1 18:15 out
drwxr-xr-x 5 root root 4096 Aug 1 18:01 packages
drwxr-xr-x 11 root root 4096 Aug 1 18:01 prebuilt
drwxr-xr-x 6 root root 4096 Aug 1 18:01 system
drwxr-xr-x 3 root root 4096 Aug 1 18:01 vendor
total 68
drwxr-xr-x 16 root root 4096 Aug 1 18:02 .
drwxrwxrwx 30 root root 4096 Aug 1 18:51 ..
drwxr-xr-x 6 root root 4096 Aug 1 17:59 .repo
-r--r--r-- 1 root root 87 Aug 1 17:59 Makefile
drwxr-xr-x 9 root root 4096 Aug 1 17:59 bionic
drwxr-xr-x 5 root root 4096 Aug 1 17:59 bootable
drwxr-xr-x 7 root root 4096 Aug 1 17:59 build
drwxr-xr-x 18 root root 4096 Aug 1 17:59 dalvik
drwxr-xr-x 17 root root 4096 Aug 1 18:00 development
drwxr-xr-x 68 root root 4096 Aug 1 18:00 external
drwxr-xr-x 5 root root 4096 Aug 1 18:00 frameworks
drwxr-xr-x 6 root root 4096 Aug 1 18:00 hardware
drwxr-xr-x 4 root root 4096 Aug 1 18:15 out
drwxr-xr-x 5 root root 4096 Aug 1 18:01 packages
drwxr-xr-x 11 root root 4096 Aug 1 18:01 prebuilt
drwxr-xr-x 6 root root 4096 Aug 1 18:01 system
drwxr-xr-x 3 root root 4096 Aug 1 18:01 vendor
여기에 생긴 파일들을 RootFS 로 사용한다.
디렉토리에 들어가서 결과물을 확인해보자.
# cd out/target/product/generic
# ls -al
total 47896
drwxr-xr-x 7 root root 4096 Aug 1 20:16 .
drwxr-xr-x 3 root root 4096 Aug 1 18:02 ..
-rw-r--r-- 1 root root 7 Aug 1 18:16 android-info.txt
-rw-r--r-- 1 root root 460 Aug 1 19:11 clean_steps.mk
drwxr-xr-x 2 root root 4096 Aug 1 18:15 data
-rw-r--r-- 1 root root 12788 Aug 1 20:16 installed-files.txt
drwxr-xr-x 12 root root 4096 Aug 1 20:16 obj
-rw-r--r-- 1 root root 40 Aug 1 19:11 previous_build_config.mk
-rw-r--r-- 1 root root 155361 Aug 1 20:16 ramdisk.img
drwxr-xr-x 8 root root 4096 Aug 1 20:15 root
drwxr-xr-x 4 root root 4096 Aug 1 19:25 symbols
drwxr-xr-x 10 root root 4096 Aug 1 20:16 system
-rw------- 1 root root 48770304 Aug 1 20:16 system.img
-rw------- 1 root root 2112 Aug 1 20:16 userdata.img
# ls -al
total 47896
drwxr-xr-x 7 root root 4096 Aug 1 20:16 .
drwxr-xr-x 3 root root 4096 Aug 1 18:02 ..
-rw-r--r-- 1 root root 7 Aug 1 18:16 android-info.txt
-rw-r--r-- 1 root root 460 Aug 1 19:11 clean_steps.mk
drwxr-xr-x 2 root root 4096 Aug 1 18:15 data
-rw-r--r-- 1 root root 12788 Aug 1 20:16 installed-files.txt
drwxr-xr-x 12 root root 4096 Aug 1 20:16 obj
-rw-r--r-- 1 root root 40 Aug 1 19:11 previous_build_config.mk
-rw-r--r-- 1 root root 155361 Aug 1 20:16 ramdisk.img
drwxr-xr-x 8 root root 4096 Aug 1 20:15 root
drwxr-xr-x 4 root root 4096 Aug 1 19:25 symbols
drwxr-xr-x 10 root root 4096 Aug 1 20:16 system
-rw------- 1 root root 48770304 Aug 1 20:16 system.img
-rw------- 1 root root 2112 Aug 1 20:16 userdata.img
이제 커널을 받아보자.
# mkdir android_kernel
# cd android_kernel/
# ls -al
total 8
drwxr-xr-x 2 root root 4096 Aug 1 20:52 .
drwxrwxrwx 31 root root 4096 Aug 1 20:52 ..
# git clone git://android.git.kernel.org/kernel/common.git kernel
이렇게 하면 kernel 디렉토리 안에 커널이 받아진다.# cd android_kernel/
# ls -al
total 8
drwxr-xr-x 2 root root 4096 Aug 1 20:52 .
drwxrwxrwx 31 root root 4096 Aug 1 20:52 ..
# git clone git://android.git.kernel.org/kernel/common.git kernel
받아진 커널 버전이 뭔지 보려면
# cd kernel
# git branch
* android-2.6.27
2.6.27 버전이란다.# git branch
* android-2.6.27
최신 버전 2.6.29로 업그레이드 하려면
# git checkout --track -b android-2.6.29 origin/android-2.6.29
Checking out files: 100% (17530/17530), done.
Branch android-2.6.29 set up to track remote branch refs/remotes/origin/android-2.6.29.
Switched to a new branch "android-2.6.29"
# git branch
android-2.6.27
* android-2.6.29
2.6.29 로 업그레이드 된것을 볼 수 있다.Checking out files: 100% (17530/17530), done.
Branch android-2.6.29 set up to track remote branch refs/remotes/origin/android-2.6.29.
Switched to a new branch "android-2.6.29"
# git branch
android-2.6.27
* android-2.6.29
컴파일 하려면 일단 다음과 같이 arm 이라고 지정하고 크로스컴파일러를 지정해준다.
Makefile 에서
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
를
ARCH ?= arm
CROSS_COMPILE ?= arm-generic-linux-gnueabi-
로 바꾼다.
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
를
ARCH ?= arm
CROSS_COMPILE ?= arm-generic-linux-gnueabi-
로 바꾼다.
※ 안드로이드에서 지원하는 가상화 SoC인 goldfish를 사용하고 싶거나. MSM 퀄컴칩을 사용하고 싶을때는 다음과 같이 하면 된다. (다음에서는 크로스 컴파일러는 안드로이드 소스에 들어있는 prebuilt 된 arm-eabi 툴체인을 사용한 것이다.)
- msm
$ cd ~/mydroid/kernel
$ make msm_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- goldfish
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
$ cd ~/mydroid/kernel
$ make msm_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
- goldfish
$ cd ~/mydroid/kernel
$ make goldfish_defconfig ARCH=arm
$ make ARCH=arm CROSS_COMPILE=../prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
# make menuconfig
위의 명령어를 실행해서 configure 를 진행한다.
알아서 설정한후에 Save an Alternate Configureation File 을 하고 .config 파일로 저장하고 나온다.
컴파일은 make zImage 라고 하면 된다.
# make zImage
사실상 커널은 타겟 보드용 패치등을 해야 하기 때문에 이렇게 하면 안된다.NFS로 RootFS를 제공할 디렉토리를 만든다.
# mkdir -p /opt/myAndroid
결과물을 위에서 만든 디렉토리로 복사한다.
# cp -a root/* /opt/myAndroid
# cp -a data/* /opt/myAndroid/data/
# cp -a system/* /opt/myAndroid/system/
# cp -a data/* /opt/myAndroid/data/
# cp -a system/* /opt/myAndroid/system/
NFS 서버로 쓸 디렉토리로 가서 퍼미션을 설정 한다.
# cd /opt/myAndroid/
# chown -R root.root *
# chmod -R 777 data system
# chown -R root.root *
# chmod -R 777 data system
처음 부팅하면 다음과 같은 화면이 한참 보인다.
난 다운된줄 알고 여러번 껐다 켰으나 알고보니 다운된것이 아니라.
처음 부팅할때 data 디렉토리에 파일을 생성하는 작업을 하고 있는것이었다.
부팅 화면
그리고 배터리 체크 부분을 막지 않으면 다음과 같은 화면이 나오니
컴파일시에 배터리 패치를 하자.
빠때리 없다고 켜지자 마자 꺼진다.
로그가 보고 싶다면 엔터를 친후에
# logcat &
이라고 입력하면 로그들이 주루룩 나온다.내가 갖고 있는 안드로이드 RootFS 버전을 알고 싶다면
# cat build/core/version_defaults.mk | grep PLATFORM_VERSION
# PLATFORM_VERSION
# PLATFORM_VERSION_CODENAME
ifeq "" "$(PLATFORM_VERSION)"
PLATFORM_VERSION := Donut
# SDK version the branch is based on and PLATFORM_VERSION_CODENAME holds
ifeq "" "$(PLATFORM_VERSION_CODENAME)"
PLATFORM_VERSION_CODENAME := Donut
ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)
# PLATFORM_VERSION
# PLATFORM_VERSION_CODENAME
ifeq "" "$(PLATFORM_VERSION)"
PLATFORM_VERSION := Donut
# SDK version the branch is based on and PLATFORM_VERSION_CODENAME holds
ifeq "" "$(PLATFORM_VERSION_CODENAME)"
PLATFORM_VERSION_CODENAME := Donut
ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)
반응형
'Android' 카테고리의 다른 글
안드로이드 커널 올리기 (0) | 2009.08.01 |
---|---|
Dalvik Virtual Machine (3) | 2009.07.28 |
(S3C6410 & Android) U-Boot, zImage, Cupcake 요약 (0) | 2009.07.27 |