Android에서, 안드로이드를 통째로 컴파일 하지 말고, 만약 커널만 수정하고 싶다면?
순정롬을 다운받아서, zImage(kernel)만 바꿔 친 후, 안드로이드에 롬을 올리면 된다.
그 과정을 Ubuntu 12.04 64bit + Nexus 5에서 진행했을때는 아래와 같다.
예를 들어, 안드로이드에 tcp_probe 모듈을 추가하도록 해본다.
1. Kernel build
먼저, 커널을 다운로드 받는다.
# git clone https://android.googlesource.com/kernel/msm.git
# cd msm
# git checkout 3.4.0-gadb2201
그리고 컴파일
# make -j 4
컴파일이 완료되면, arch/arm/boot/zImage 가 생성된다.
net/ipv4/tcp_probe.ko 도 생성된다.
2. Make a ROM
순정롬을 다운받는다. Nexus 5는 아래의 경로에 있다.
https://developers.google.com/android/nexus/images?hl=ko-KR#hammerheadkot49h
압축을 푼다.
# tar xzvf hammerhead-kot49h-factory-02006b99.tgz
여기서 image-hammerhead-kot49h.zip 의 boot.img를 수정해야 한다.
# mkdir ~/image
# cd ~/image
# cp ~/hammerhead-kot49h/image-hammerhead-kot49h.zip ./
# unzip image-hammerhead-kot49h.zip
boot.img를 언팩하고, zImage를 바꿔 친 후, 리팩해야 하는데 나는 다른사람의 툴을 사용해서 했다.
# cd ~
# wget https://github.com/pbatard/bootimg-tools/archive/master.zip
# unzip master.zip
# cd bootimg-tools-master/
# make
# cd mkbootimg/
# cp mkbootimg /usr/local/bin/
# cp unmkbootimg /usr/local/bin/
이제 바꿔 치기를 한다. (참고로, 보통은 zImage를 사용하지만, 내 경우는 Nexus 5라서, zImage-dtb를 사용하였다.)
# mkdir ~/repack
# cd ~/repack
# cp ~/image/boot.img ./boot.img
# unmkbootimg -i boot.img
# cp ~/msm/arch/arm/boot/zImage-dtb ./zImage
# mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel zImage --ramdisk ramdisk.cpio.gz -o newboot.img
# cp newboot.img ~/image/boot.img
# cd ~/image
# rm image-hammerhead-kot49h.zip
# zip newimage.zip *
# cp newimage.zip ~/hammerhead-kot49h/image-hammerhead-kot49h.zip
3. Flash
fastboot 모드로, 실행시킨다.
# adb reboot-bootloader
# fastboot oem unlock
그리고, flash를 한다.
# cd ~/hammerhead-kot49h/
# ./flash-all.sh
flash가 끝나고 부팅이 완료되면 기본 설정을 마치고
바로 ‘개발자 모드 – USB 디버깅’을 체크하고 Nexus Root Toolkit으로 루팅을 시전한다.
루팅이 완료되고 부팅이 되면 바로 BusyBox를 실행하고 SuperSu 루트 권한을 허용하고,
쓸데없는 메시지 창을 닫고 하단 부 뱅글뱅글 로딩이가 없어지면 또 나오는 메시지 창을 닫고
왼쪽아래 install 버튼을 누르면 또 창이 뜨는데 거기서 Smart Install을 선택한다.(상단 부 /system/bin 옵션 그대로 둠)
Install이 끝나면 BusyBox 종료
아까 만들어진 tcp_probe.ko 파일을 adb를 사용해 폰에 넣는다.
# adb push ~/msm/net/ipv4/tcp_probe.ko /mnt/sdcard/Download/
이제 adb shell을 열고 관리자 권한을 얻기 위해 su를 입력하고 폰에 뜨는 SuperSU 루트 권한을 허용한다.
# adb shell
$ su
모듈을 저장할 폴더를 만들기 위해 read only인 root를 remount한다.
# mount –o rw,remount /
/lib/modules/ 경로를 생성한다.
# cd /
# mkdir lib
# cd lib
# mkdir modules
# cd modules
이후 경로를 확인하기 위해 modprobe를 입력해본다.
# modprobe
modprobe: can't change directory to '3.4.0-gadb2201-dirty': No such file or directory
에러 메시지를 보고 해당하는 폴더를 만든다
# mkdir 3.4.0-gadb2201-dirty
# cd 3.4.0-gadb2201-dirty
모듈 목록파일 modules.dep을 생성한다.
# vi modules.dep
파일 내용 딱 한줄
kernel/net/ipv4/tcp_probe.ko:
파일을 저장한 후 /lib/modules/3.4.0-gadb2201-dirty/kernel/net/ipv4 끝까지 경로를 생성해준다.
# mkdir kernel
# cd kernel/
# mkdir net
# cd net/
# mkdir ipv4
tcp_probe.ko 파일을 옮겨준다.
# cp /mnt/sdcard/Download/tcp_probe.ko /lib/modules/3.4.0-gadb2201-dirty/kernel/net/ipv4/
tcp_probe를 테스트해본다.
# modprobe tcp_probe full=1
# cat /proc/net/tcpprobe > /mnt/sdcard/Download/tcpprobe.log &
폰에서 인터넷 사용 후 로그를 출력해 보면 정상적으로 작동하는 것을 확인할 수 있다.
# tail /mnt/sdcard/Download/tcpprobe.log
끝.
+ 만약 벽돌이 되었다면.......... (Nexus 5 용)
http://liciousroms.com/nexus5_restore.html
참고
- 안드로이드 순정 롬
https://developers.google.com/android/nexus/images?hl=ko-KR#hammerheadkot49h
- kernel build & boot.img unpack and repack
https://groups.google.com/forum/#!topic/android-kernel/kgxdpN_77x4
- mkbootimg, unmkbootimg
'Computer Engineering > Android' 카테고리의 다른 글
Webkit crash 분석하기 (0) | 2013.12.06 |
---|---|
모바일에서 3G 패킷 캡쳐하기 (0) | 2013.07.14 |
Android에 debian kit 설치하기 (0) | 2013.06.03 |
Failed to allocate memory: 8 해결법 (0) | 2013.02.12 |