개요
안드로이드 기본 소스코드는 밧데리가 없으면 시작되자마자 바로 꺼지도록 되어있다.
그래서 타겟보드에서 작업할 때에는 가장 먼저 이 밧데리 부분을 주석걸어 주어야지 꺼지지않고 실행이 된다.
이번 포스트에서는 그 방법을 알아보도록 하자.


밧데리 패치
"frameworks/base/services/java/com/android/server/BatteryService.java" 파일을 열어자.

     private final void shutdownIfNoPower() {

        // shut down gracefully if our battery is critically low and we are not powered.

        // wait until the system has booted before attempting to display the shutdown dialog.

        /*

        if (mBatteryLevel == 0 && !isPowered() && ActivityManagerNative.isSystemReady()) {

            Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);

            intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            mContext.startActivity(intent);

        }

        */

    }


    private native void native_update();


    private synchronized final void update() {

        //native_update();


        boolean logOutlier = false;

        long dischargeDuration = 0;

        ...
약 186 라인쯤에 위와 같은 부분을 찾을 수 있는데 위처럼 주석을 걸어주자.
이제 컴파일하고 타겟보드에 올리고 실행하면 제대로 될 것이다.
Posted by cranix
들어가며
안드로이드 소스를 분석하다보면 시스템쪽의 java 소스를 봐야할 경우가 많은데 이클립스상에서 따라내려갈 수 없게 되어있어서 불편할때가 많았다.
안드로이드 sdk 에다가 이클립스 소스를 연결하는법을 알아보도록 하자.


SDK 에 안드로이드 소스 링크걸기
이클립스에서는 기본적으로 jar 파일에다가 소스 링크걸기를 지원한다.
그런데 안드로이드의 jar 파일은 이 기능이 꺼져있어서 임의로 링크 걸수없게 되있다.
그러나 이클립스에서 안드로이드 프로젝트를 만들어서 android.jar 파일의 Source attachment 부분을 보면 기본적으로 경로가 잡혀있음을 알 수 있다.
결국 해당 경로에 sources 디렉토리를 만들어서 소스를 넣어주면 링크가 된다는 소리다.
그러기 위해서는 소스를 먼저 다운받아야 하는데 아래 글을 참조해서 다운 받기로 하자.
android 소스 다운로드 받기 
그다음 sdk 를 설치한 경로의 platform/android-7 디렉토리에 다가 심볼릭 링크를 걸어주면 된다.

# ln -s eclare_src/ android-sdk-linux_86/platforms/android-7/sources

이클립스가 켜져있다면 F5 를 눌러서 리플래쉬 해 주면 소스를 로딩하는것을 볼 수있다.
이제 원하는 소스를 마음대로 볼 수 있다.

Posted by cranix

ADT 업데이트
일단 이클립스의 Help->Update 로 들어가서 아래 주소를 입력한다.

 https://dl-ssl.google.com/android/eclipse/

그런데 설치를 진행하면 아래와같은 오류로 더이상 안되는 경우가 있다.
우분투에서 apt-get 으로 이클립스를 설치했을 경우 기본적인 플러그인만 설치되기때문에 이런 현상이 많이 발생한다.

Cannot complete the install because one or more required items could not be found.

  Software being installed: Android Development Tools 0.9.6.v201002051504-24846 (com.android.ide.eclipse.adt.feature.group 0.9.6.v201002051504-24846)

  Missing requirement: Android Development Tools 0.9.6.v201002051504-24846 (com.android.ide.eclipse.adt.feature.group 0.9.6.v201002051504-24846) requires 'org.eclipse.wst.sse.ui 0.0.0' but it could not be found

해결하기 위해서는 필요한 플러그인을 먼저 설치해주면 된다.
위의 오류에서는 wst 가 필요하다고 하는데 이는 웹관련 툴을 의미하는것으로 ADT 에서 웹관련 툴을 사용하는것으로 판단된다.
WST를 설치하기 위해서는 이클립스 업데이트 사이트에 아래 주소를 입력하자.
http://download.eclipse.org/releases/galileo
"Eclipse Web Developer Tools" 를 찾아서 설치하자.
설치가 다 끝나면 이제다시 ADT 를 설치하면 제대로 설치 될 것이다.

Posted by cranix
TAG ADT, Eclipse, wst
필요한 라이브러리 설치하기
컴파일 하기위해서 필요한 라이브러리를 한꺼번에 설치하자.

# apt-get install git-core gnupg flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
# apt-get install valgrind



자바 1.5 설치하기
안드로이드는 아직 자바 1.6을 지원하지 않는다. 그래서 1.5 를 설치해야 하는데 문제는 우분투 9.10 에서는 자바 1.5 를 apt-get 으로 설치할수 없다는 것이다.
그래서 아래와 같은 방법이 필요하다.

시스템>관리>소프트웨어 소스를 선택하면 [소프트웨어 소스] 창이 뜬다.
여기서 기타 소프트웨어 탭에서 아래 와 같이 추가해 주자.

deb http://kr.archive.ubuntu.com/ubuntu/ jaunty multiverse
deb http://kr.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse

창을 닫으면 소프트웨어를 다시 읽는것을 볼 수 있다.
내 컴퓨터 같은경우는 다시 읽다가 거의 다된 시점에서 계속 멈추어 있길래 취소를 눌러주었다.
뭔가 오류가 났지만 상관없이 진행되었다.
다되었으면 apt-get 으로 설치해 보도록 하자.

 # apt-get install sun-java5-jdk

 이제 설치되었다면 버젼을 확인해 보자.

 # java -version

 만약 1.5 가 아니라면 아래 명령으로 자바 리스트를 확인한후 업데이트 시켜주자.

# update-java-alternatives -l

java-1.5.0-sun 53 /usr/lib/jvm/java-1.5.0-sun

java-6-sun 63 /usr/lib/jvm/java-6-sun

# update-java-alternatives -s java-1.5.0-sun

 만약 자바 버젼을 바꾸는 도중 아래와 같은 메시지를 볼 수도 있을것이다.

update-alternatives: error: no alternatives for firefox-javaplugin.so.

update-alternatives: error: no alternatives for iceape-javaplugin.so.

update-alternatives: error: no alternatives for iceweasel-javaplugin.so.

update-alternatives: error: no alternatives for jhat.

update-alternatives: error: no alternatives for jrunscript.

update-alternatives: error: no alternatives for midbrowser-javaplugin.so.

update-alternatives: error: no alternatives for mozilla-javaplugin.so.

update-alternatives: error: no alternatives for schemagen.

update-alternatives: error: no alternatives for wsgen.

update-alternatives: error: no alternatives for wsimport.

update-alternatives: error: no alternatives for xjc.

update-alternatives: error: no alternatives for xulrunner-1.9-javaplugin.so.

update-alternatives: error: no alternatives for xulrunner-javaplugin.so.

update-alternatives: error: no alternatives for firefox-javaplugin.so.

update-alternatives: error: no alternatives for iceape-javaplugin.so.

update-alternatives: error: no alternatives for iceweasel-javaplugin.so.

update-alternatives: error: no alternatives for midbrowser-javaplugin.so.

update-alternatives: error: no alternatives for mozilla-javaplugin.so.

update-alternatives: error: no alternatives for xulrunner-1.9-javaplugin.so.

update-alternatives: error: no alternatives for xulrunner-javaplugin.so.

이것은 안드로이드 소스 컴파일과는 관계없지만 다른 어플을 실행하는데 문제가 될 수도 있기 때문에 아래와 같이 sun-java5-plugin 과 sun-java6-plugin 을 설치해 주자.

 # apt-get install sun-java5-plugin sun-java6-plugin

 

컴파일 하기
이제 컴파일할 환경은 다 갖추어 졌다.
다운받은 안드로이드 소스에는 크로스 컴파일 환경까지 갖추어져 있다.
(안드로이드 소스 다운받는법은 android 소스 다운로드 받기 를 참조하자)
그래서 컴파일을 하기위해서는 "build/envsetup.sh" 파일을 환경등록 해주어야 한다.
다운받은 소스의 루트 디렉토리에서 아래와같이 실행해서 환경등록 해주도록 하자.

 # source build/envsetup.sh

다되었다면 이제 make 를 하면 된다.

 # make

안드로이드 소스는 최초 컴파일시 시간이 무척오래 걸린다.
사실 -j 옵션으로 스레드를 돌려주면 시간을 약간 줄일 수 있다.
그런데 이 옵션은 최초 컴파일시는 왠만해서 사용하지 않는것이 좋다.
왜냐하면 먼저 컴파일 된 것을 참조하는 구문이 있을수도 있는데 그런곳에서 오류가 나서 컴파일이 멈추어 버리는 현상이 나오기 때문이다.
일단 처음에는 느리더라고 그냥 make 를 쓰자.

Posted by cranix
hello 디바이스 만들기
프로그래밍 첨하면 아무나 다하는 hello.c를 만들어 보겠다.

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");


static int __init hello_init(void) {

        printk(KERN_ALERT "Hello, world\n");

        return 0;

}

static void __exit hello_exit(void) {

        printk(KERN_ALERT "Goodbye, world\n");

}

module_init(hello_init);

module_exit(hello_exit);

뭐하는 설명 안해도 다 알만한 프로그램이다.
여기서 기존의 프로그램과 다른점은 printf 대신 printk 를 썻다는 것이다.
저 코드들은 커널 에서 실행되기때문에 유저스페이스의 함수를 사용할 수 없다.
그래서 stdio 같은것들을 인클루드 하면 안된다. 모두 커널상의 함수를 사용해야한다.
printk 역시 커널 함수로 printf와 거의 유사한 기능을 한다.

중간에 __init 과 __exit 가 좀 수상쩍어 보인다.
이것은 필수는 아니지만 써주는게 좋다. 그 이유는 커널에게 시작할때 한번 끝날때 한번 실행하는 함수라고 알려서 실행되고 바로 메모리에서 삭제하도록 할 수있다.

MODULE_LICENSE 는 라이센스를 지정하는 부분인데 이부분이 재미있다.
여기에 들어갈 수 있는 스트링은 아래와 같다.

"GPL"  ,  "GPL v2"  ,  "GPL and additional rights"  ,  "Dual BSD/GPL"  ,  "Dual MPL/GPL"

"Proprietary"

 사실 MODULE_LICENSE 는 옵션이다. 그러나 지정하지 않은 모듈을 적재시 "오염 상태" 가 된다.

makefile 만들기

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

obj-m := hello.o


default:

        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules


clean:

        rm *.ko *.o Module.* modules.* *.mod.c

KERNELDIR 에는 커널헤더 경로가 들어가기 때문에 위와 같은 명령을 사용하면 헤더의 경로를 가져올 수 있다.
자 이제 make 를 실행해 보자.

root@cranix-desktop:~/work/drivers# make

make -C /lib/modules/2.6.31-20-generic-pae/build M=/root/work/drivers modules

make[1]: Entering directory `/usr/src/linux-headers-2.6.31-20-generic-pae'

  CC [M]  /root/work/drivers/hello.o

  Building modules, stage 2.

  MODPOST 1 modules

  CC      /root/work/drivers/hello.mod.o

  LD [M]  /root/work/drivers/hello.ko

make[1]: Leaving directory `/usr/src/linux-headers-2.6.31-20-generic-pae'

위와 같이 나오면 제대로 컴파일 된 것이고 hello.ko 파일이 생겼을 것이다.
ko 란 커널 오브젝트의 약자로서 2.6 넘어오면서 커널오브젝트와 다른 오브젝트를 구분하기위해 생긴것이다.


hello 디바이스 적재및 삭제

root@cranix-desktop:~/work/drivers# insmod hello.ko

root@cranix-desktop:~/work/drivers# lsmod |grep hello

hello                   1052  0

root@cranix-desktop:~/work/drivers# rmmod hello

root@cranix-desktop:~/work/drivers# lsmod |grep hello

root@cranix-desktop:~/work/drivers#  

위와같이 디바이스 드라이버는 insmod 와 rmmod 로 적재와 삭제를 하고 lsmod 로 리스트를 볼 수 있다.



커널로그 보기
분명 적재는 했는데 printk 로 출력한 메시지는 어떻게 볼 수 있을까?

root@cranix-desktop:~/work/drivers# dmesg

...

...

[ 2747.649737] Hello, world

[ 2759.753311] Goodbye, world

메시지가 쭈욱 나오는데 제일 아래보면 원하던 메시지를 볼 수 있을 것이다.



'알짜정보 > Linux device driver' 카테고리의 다른 글

hello 디바스 드라이버  (0) 2010/03/18
Posted by cranix

curl 로 repo 스크립트 받기

안드로이드는 수많은 개발자가 참여하는 오픈소스 시스템이다.

이러한 시스템을 관리해주는 유틸은 git 를 사용하는데 그러다 보니 전체 소스가 한꺼번에 관리되지 않는다.

그래서 웹상에 소스를 한꺼번에 다운로드 받을수 있는 스크립트를 작성해 놓고 curl 로 다운받아가게 한 것이다.

# apt-get install curl

# curl http://android.git.kernel.org/repo >repo

# chmod 755 repo

이제 repo 라는 스크립트가 생겼을 것이다.

편하게 하기위해서는 repo 가 있는 디렉토리를 PATH 로 잡아놓으면 된다.

 

 

repo 를 사용해서 소스받기

repo 는 결국 git 를 사용하기 때문에 git 를 먼저 설치해야 한다.

 # apt-get install git-core

git-core 가 없다면 repo 를 실행했을때 "No such file or directory" 오류가 떨어질 것이다.

 

repo 를 이용해서 다운받으려면 init 과 sync 옵션을 사용하면 된다.

# mkdir android_src

# cd android_src

# repo init -u git://android.git.kernel.org/platform/manifest.git

# repo sync

repo 를 실행하기 전에 먼저 소스가 저장될 디렉토리를 만들고 그안에서 init 과 sync 작업을 하도록 하자.

repo init 옵션은 마지막에 -b (branch) 옵션으로 원하는 버전의 소스를 받을수 있다. 위 처럼 아무것도 안쓴다면 최신버전을 다운받게 된다.

그리고 init 을 실행 할 때 이름, 메일주소 등을 물어보는데 적당히 적어주면 된다.

init 작업은 실제로 소스를 다운받지 않기 때문에 빠른 시간안에 끝난다. sync 에서 비로소 소스를 다운받기 때문에 상당히 시간이 걸린다. 인터넷이 빨라도 최소한 한시간은 잡아야 한다.

 

Posted by cranix
TAG Android, curl, repo

우분투 셋팅

분류없음 2010/03/18 00:19
들어가며
어제 새벽까지 설치하고 일하러 갔더니 완전 제정신이 아니었다.
오늘은 얼른하고 자야겠다.
일단 오늘 할것을 생각해 보자.

  폰트, vim, eclipse, ...


폰트셋팅
처음 우분투 설치할때는 폰트가 맘에든다고 생각했지만,
계속 쓰다보니 별로 맘에 안들었다.
일단 터미널 폰트부터 바꿔보자.
폰트는 한컴에서 만든 네이버사전체와 고정폭 Lucida Sans Typewriter 폰트를 받도록 하자.

 함초롬체 : http://www.haansoft.com/hnc/event/ham/index.htm

 네이버사전체 : http://cndic.naver.com/static/fontInstall

 고정폭 Lucida Sans Typewriter 체 : # apt-get install sun-java6-fonts

다 받았으면 아래와 같이 폰트 디렉토리의 truetype 디렉토리에 회사별로 디렉토리를 만들고 ttf 파일을 이동시키자.
일단 아래와같이 폰트에 디렉토리를 만들고 폰트캐시를 업데이트 하자.

 # mkdir /usr/share/fonts/truetype/han

 # mv *.ttf /usr/share/fonts/truetype/han

 # fc-cache -v

그럼 이제 폰트를 바꿔보자.
시스템전체의 글꼴을 설정하려면 아래 메뉴로 가서 변경하자.

 시스템 -> 기본설정 -> 모양새 -> 폰트


VI 셋팅
일단 VI 는 먼저 vim 을 설치하도록 하자.
그다음 홈 디렉토리 아래에 .vimrc 파일을 만들고 아래와 같이 저장하자.

set autoindent          "자동 들여쓰기

set cindent             "C 프로그래밍 할때 자동으로 들여쓰기

set smartindent         "좀 더 똑똑한 들여쓰기

set nobackup            "백업파일을 만들지 않는다.

set number              "라인번호를 출력한다.

"폰트 설정

set fenc=utf-8

set fencs=utf-8,cp949,cp932,euc-jp,shift-jis,big5,latin1,ucs-2le

set nocp                " vi 와 호환성을 없애고 vim 만 쓸수있게


filetype on  "파일 종류를 자동으로 인식

set ru "커서의 위치를 항상 보이게함

set sc "완성중인 명령을 표시


set background=dark

colorscheme elflord

filet plugin indent on "파일종류 자동으로 인식

syntax on "알아서 하이라이팅

set title "제목표시

set novisualbell

set hlsearch "검색어 하이라이트

set wmnu "탭 누르면 자동완성 가능한 목록 나옴


if has("gui_running") "gui 시작이면 시작시 크기 설정

   set lines=50

   set co=125

endif

참고로  /etc/skel 디렉토리는 사용자가 생성될 때마다 복사하기 때문에 거기에 .vimrc 를 옮겨놓으면 나중에 편해진다.


오픈오피스 글자 깨지는거 수정
오픈오피스를 켰더니 글자가 깨져서 얼마전에 내가 적었던 포스트를 검색해서 수정했다.
이 블로그에서 "오픈오피스" 로 검색하면 나올것이다.


마치며
얼른 하려고 했는데 또 한시가 넘어버렸다.ㅜ
내일은 이클립스 설정이나 해야겠다.

Posted by cranix
TAG font, ubuntu, vi

 

리눅스 관련해서 작업할 일이 점점 많아지다 보니 리눅스의 필요성을 느꼈다.

그래서 설치하기로 마음먹었다.

 

하드디스크 정리

일단 용량이 있어야 설치를 하니까 가장 먼저 하드디스크 정리를 했다.

약 100기가 정도의 용량을 확보했다.

 

 

파티션 매직 프로그램으로 파티션 변경

다음은 리눅스에서 쓰게하기 위해서 남은 용량파티션을 삭제할 필요가 있었다.

이것은 파티션 매직이라는 프로그램으로 했었는데 유료 라서 무료 프로그램을 찾다보니 파티션 마스터 라는 프로그램이 검색되었다.

홈페이지는 아래와 같다.

http://www.easeus.com/download.htm

설치하고 파티션을 설정후 재부팅 하면 되는데 재부팅시에 상당히 오래걸렸다.

 

 

USB메모리로 우분투 설치하기

CD 롬을 지금 구할수 없기에 USB 메모리로 우분투를 설치하기로 하였다.

구글링 결과 아래 사이트를 발견했다.

http://myubuntu.tistory.com/entry/904-우분투-USB드라이브에-이식해서-설치하기

나와 같은 생각을 하는사람이 많나보다.

전용 프로그램까지 존재하니까 말이다.

UNetbootin 이라는 프로그램인데 아래 사이트에서 찾을 수 있다.

http://unetbootin.sourceforge.net/

 

일단 UI 는 맘에 든다.

 

그러나 이거 역시 시간이 좀 오래걸린다.

원래 USB 보다 씨디롬이 빨랐던가?

얼른 우분투가 뜨는 모습을 보고 싶지만 오늘은 이만 접어야겠다.

내일 회사가야 하니까.


설치완료

지금은 새벽 2시.

내일 회사가야 하지만 깔고 싶은 마음이 더 컸다.ㅜㅜ

그래도 결과는 성공적이다.

처음에 바이오스 부팅이 안되는줄 알았는데 이상하게 내 바이오스는 F8 을 눌러줘야지 부팅선택 화면이 나와서 USB 로 부팅할수 있게 되어있다.

부팅하니 바로 UNetbootin  화면이 뜨면서 설치가 된다.


결국 우분투 부팅화면까지 보고야 말았다.

이제 진짜 자야지.


'알짜정보 > Linux server' 카테고리의 다른 글

cent os java 설치  (0) 2011/01/02
cent os 기본정보 확인  (0) 2010/12/30
리눅스 설치기  (0) 2010/03/17
ubuntu 터미널 한글깨질때  (0) 2010/02/01
ubuntu 오픈오피스 글자 깨질때  (0) 2010/02/01
fedora 10 에다가 vncserver 설치하기 (수정)  (0) 2009/08/10
Posted by cranix
TAG ubuntu, USB, 설치
1. 커널 다운로드

# git clone git://android.git.kernel.org/kernel/common.git kernel_goldfish

# cd kernel_goldfish

# git checkout --track -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29

# git branch

 
2. 컴파일 하기

 # make goldfish_defconfig ARCH=arm

# vi Makefile 아래 수정

  193   ARCH := arm

  194   CROSS_COMPILE  := [안드로이 sdk 경로]/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-

# make zImage

 

'알짜정보 > Android' 카테고리의 다른 글

안드로이드 소스 컴파일 하기  (0) 2010/03/21
android 소스 다운로드 받기  (0) 2010/03/18
goldfish 커널 다운로드 및 컴파일 하기  (0) 2010/03/16
android 커널부팅부터 액티비티까지  (0) 2010/03/12
AlertDialog 와 Toast  (0) 2010/03/01
SharedPreferences  (1) 2010/03/01
Posted by cranix
안드로이드는 커널 부팅후 /init 을 실행해 준다.
그 후 부터 home activity 가 뜰때까지의 과정을 분석해 보았다.

kernel boot
init.c:main() - init process 실행
app_main.cpp:main() - zygote service 실행
AndroidRuntime.cpp:start() - java VM 실행
ZygoteInit.java:main()
SystemServer.java:main()
system_init.cpp:system_init()
SystemServer.java:init2()
ServerThread.run()
ActivityManagerService.java:startRunning()
systemReady()
resumeTopActivityLocked()
startHomeActivityLocked()
startActivityLocked()

- system_init.cpp 의 main() 에서는 SurfaceFlinger, AudioFlinger, MediaPlayerService, CameraService, AudioPolicyService 등 C++ 과 연동되어진 서비스들이 실행된다.

- SystemServer.java:ServerThread.run() 에서는 안드로이드 프레임웍 자바단에서 쓰이는 모든 서비스가 실행 및 등록 된다.

'알짜정보 > Android' 카테고리의 다른 글

android 소스 다운로드 받기  (0) 2010/03/18
goldfish 커널 다운로드 및 컴파일 하기  (0) 2010/03/16
android 커널부팅부터 액티비티까지  (0) 2010/03/12
AlertDialog 와 Toast  (0) 2010/03/01
SharedPreferences  (1) 2010/03/01
Activity 간의 통신  (0) 2010/02/25
Posted by cranix