(3) InputListener.cpp
frameworks/base/services/input/InputListener.cpp

 

(http://androidxref.com/source/history/frameworks/base/services/input/InputListener.cpp)

 

Introduced the concept of an InputListener to further decouple the InputReader from the InputDispatcher.

The InputListener exposes just the minimum interface that the InputReader needs to communicate with the

outside world. The InputReader passes arguments to the InputListener by reference, which makes it easy to

queue them up.

 


(4) InputDispatcher.cpp
frameworks/base/services/input/InputDispatcher.cpp

 

InputListener를 자세히 보진 않았지만 사실은 InputReader에서 InputListener를 거쳐서 InputDispatcher로 들어옴

 

notifyKey(){
     KeyEvent 생성 
     enqueueInboundEventLocked(KeyEntry)

}
notifyMotion(){
     MotionEvent 생성 
     enqueueInboundEventLocked(MotionEntry)

}

 

enqueueInboundEventLocked()함수에서는 KeyEntry/MotionEntry를 queue에 저장하고 Event 내용에 따라 정보를 갱신한다.

mInboundQueue.enqueueAtTail(entry);

여기까지는 InputReader에 의해 호출된 함수가 Queue에 Event 내용을 저장하는 과정이다. (참고: http://marujj.tistory.com/?page=8)


지금부터는 InputDispatcher의 Thread, 실질적인 동작에 대해 분석.

InputDispatcher Class는 기본적으로 아래의 InputDispatcherThread에 의해서 동작한다.

 

dispatchOnce()

dispatchOnceInnerLocked()
     case EventEntry::TYPE_KEY: 
          --> dispatchKeyLocked 
          --> dispatchEventToCurrentInputTargetsLocked
     case EventEntry::TYPE_MOTION: 
          --> dispatchMotionLocked
          --> dispatchEventToCurrentInputTargetsLocked

 

dispatchEventToCurrentInputTargetsLocked
    --> prepareDispatchCycleLocked
    --> enqueueDispatchEntryLocked

...

// Enqueue the dispatch entry./
connection->outboundQueue.enqueueAtTail(dispatchEntry);

 

여기서 Connection은 이것!

InputDispatcher::Connection::Connection(const sp<InputChannel>& inputChannel,
     const sp<InputWindowHandle>& inputWindowHandle, bool monitor) :
     status(STATUS_NORMAL), inputChannel(inputChannel), inputWindowHandle(inputWindowHandle),
     monitor(monitor), inputPublisher(inputChannel), 
     lastEventTime(LONG_LONG_MAX), lastDispatchTime(LONG_LONG_MAX) {
}

 

이 Connection과 위쪽에서 연결되는 부분은 WindowManagerService이다

 

1) frameworks/base/service/java/com/android/server/wm/WindowManagerService.java

addWindow()에서 mInputManager.registerInputChannel(win.mInputChannel, win.mInputWindowHandle);

2) frameworks/base/core/java/android/view/InputQueue.java

registerInputChannel() --> nativeRegisterInputChannel()

3) frameworks/base/core/jni/android_view_InputQueue.cpp

android_view_InputQueue_nativeRegisterInputChannel()
--> registerInputChannel()    // 여기서 Connection 생성

 

이제 강적 바인더구나.. 바인더 공부를 해야겠다ㅠㅠ

 

'Android' 카테고리의 다른 글

Android Event Dispatch Process  (0) 2012.06.21
Android GestureDetector  (0) 2012.06.12
Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
블로그 이미지

민둥

,

(1) EventHub.cpp

frameworks/base/services/input/EventHub.cpp (ICS)

 

(참고: http://dry-kiss.blogspot.kr/2012/03/android-adb.html)
모든 event는 /dev/input/ 으로 들어온다.

 

입력 디바이스 이벤트 처리
(참고: http://blog.daum.net/baramjin/16011045)

 

EventHub에서는 디바이스 open, close, read 등등의 작업을 담당한다.

실제로 해당 method들의 호출은 InputReader에서 하게 된다.

 

디바이스에서 Event를 읽어오는 method.

getEvents()


디바이스에서 이벤트를 읽어올때는 struct input_event 타입으로 읽어오게 된다.

 

struct input_event readBuffer[bufferSize]; // input_event 타입의 readBuffer
int32_t readSize = read(device->fd, readBuffer, 
     sizeof(struct input_event) * capacity); // readBuffer에서 값을 읽어오고
const struct input_event& iev = readBuffer[i]; // 그 중에 하나를 꺼내어 RawEvent 타입으로 가져온다
...


RawEvent event;
event->when = now;
event->deviceId = deviceId;
event->type = iev.type;
event->scanCode = iev.code;
event->value = iev.value;
...

 

 

(2) InputReader.cpp

frameworks/base/services/input/InputReader.cpp

 

size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);

 

여기서 mEventBuffer가 EventHub에서 받아온 RawEvent이다.

mEventBuffer의 선언은 InputReader.h에서 다음과 같이되어있고.. RawEvent mEventBuffer[EVENT_BUFFER_SIZE];

 

if (count) {
     processEventsLocked(mEventBuffer, count);
}

 

EventBuffer에 이벤트를 받아오면, 받아온 이벤트 개수만큼 process진행한다.

Device add/remove event가 아닌 다른 이벤트들은 deviceId와 함께

processEventsForDeviceLocked(deviceId, rawEvent, batchSize); 로 전달!

 

device->process(rawEvents, count);

 

각 InputDevice의 process()로 event를 보낸다.

InputDevice::process의 주석을 참고삼아 읽어보자.

 

void InputDevice::process(const RawEvent* rawEvents, size_t count) {
// Process all of the events in order for each mapper.
// We cannot simply ask each mapper to process them in bulk because mappers may
// have side-effects that must be interleaved.  For example, joystick movement events
// gamepad button presses are handled by different mappers but they should be dispatched
// in the order received.

 

...

for (size_t i = 0; i < numMappers; i++) {
 InputMapper* mapper = mMappers[i];
 mapper->process(rawEvent);
}


그런데 아래 for문을 보면 모든 등록된 mapper로 event를 보내? 모든?

 

모든 InputDevice들은 device create할때 mMapper에 등록되도록 하는데 (InputDevice* InputReader::createDeviceLocked)
이때, Switch-like, Keyboard-like, Cursor-like, Touchscreen/touchpad, Joystick-like device들만 mapper에 등록되고 External device들은 빠진다. External device에서 나오는 센서 이벤트들은 따로 처리되는듯 하다. 이건 다음에...


모든 mapper로 event를 보내긴 하지만, 각 mapper들에서는 type을 보고 이벤트를 처리할지 결정한다.

현재 ICS에서 지원하는것으로 보이는 Mapper의 종류들은 다음과 같다.

 

CursorInputMapper {
    mCursorButtonAccumulator
    mCursorButtonAccumulator
    mCursorScrollAccumulator
}
TouchInputMapper {
    mCursorButtonAccumulator
    mCursorScrollAccumulator
    mTouchButtonAccumulator
}
SingleTouchInputMapper {
    TouchInputMapper
    mSingleTouchMotionAccumulator
}
MultiTouchInputMapper {
    TouchInputMapper
    mMultiTouchMotionAccumulator
}
SwitchInputMapper {
    switch (rawEvent->type) case EV_SW
}
KeyboardInputMapper {
    switch (rawEvent->type) case EV_KEY
}
JoystickInputMapper {
    switch (rawEvent->type) case EV_ABS, case EV_SYN
}

 

Mapper들의 내부에서는 다른 Mapper를 부르거나 Accumulator를 불러 동작!

 

CursorButtonAccumulator::process --> (rawEvent->type == EV_KEY) 
     BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, ...
CursorMotionAccumulator::process --> (rawEvent->type == EV_REL)
     REL_X, REL_Y
CursorScrollAccumulator::process --> (rawEvent->type == EV_REL)
     REL_WHEEL, REL_HWHEEL
TouchButtonAccumulator::process --> (rawEvent->type == EV_KEY) 
     BTN_TOUCH, BTN_STYLUS, BTN_TOOL_FINGER, ...s
SingleTouchMotionAccumulator::process --> (rawEvent->type == EV_ABS)
     ABS_X, ABS_Y, ABS_PRESSURE, ...
MultiTouchMotionAccumulator::process --> (rawEvent->type == EV_ABS)
     ABS_MT_POSITION_X, ABS_MT_POSITION_Y, ABS_MT_TOUCH_MAJOR, ...

 

모든 Event들은 그 타입에 따라서 notifyMotion 또는 notifyKey를 통해서 InputDispatcher로 전달된다.
EV_SYN --> 각 mapper의 sync() --> notifyMotion/notifyKey 의 형태.

 

InputDispatcher는 뒤에 계속..

 

'Android' 카테고리의 다른 글

Android Event Dispatch Process (2)  (0) 2012.06.21
Android GestureDetector  (0) 2012.06.12
Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
블로그 이미지

민둥

,

Android GestureDetector

Android 2012. 6. 12. 15:40

frameworks/base/core/java/android/view/GestureDetector.java


public class GestureDetector {
public interface OnGestureListener
public interface OnDoubleTapListener
public static class SimpleOnGestureListener implements OnGestureListenerOnDoubleTapListener
...

}


public interface OnGestureListener {
/* 터치하려고 손을 대면 발생하는 이벤트 */
boolean onDown(MotionEvent e);  
/* 짧은 시간 동안 누르면 발생하는 이벤트 */
void onShowPress(MotionEvent e);
/* 한 번 터치 했을 때 발생하는 이벤트 */
boolean onSingleTapUp(MotionEvent e);
/* 스크롤 시에 발생하는 이벤트 */
boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
/* 길게 눌렀을 때 발생하는 이벤트 */
void onLongPress(MotionEvent e);
/* 스크롤에서 끝을 살짝 튕기는 동작에서 발생하는 이벤트 */
boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);

}


public interface OnDoubleTapListener {
/* 한 번 터치하고 다음 이벤트가 들어오지 않을 때한 번 터치가 확실하다고 확인 해주는 이벤트*/
boolean onSingleTapConfirmed(MotionEvent e);
/* 두 번 터치 */
boolean onDoubleTap(MotionEvent e);
/* 두 번 터치, 두 번째 터치에 Down, Move, Up 이벤트를 포함 */
boolean onDoubleTapEvent(MotionEvent e);

}


그렇다면 Multi-touch에 관련한 Gesture는 어떻게 하는거지?

à 2.2(Froyo)부터 ScaleGestureDetector 제공


012




참고: 

http://blog.vizpei.kr/94697746

http://blog.vizpei.kr/94770746






'Android' 카테고리의 다른 글

Android Event Dispatch Process (2)  (0) 2012.06.21
Android Event Dispatch Process  (0) 2012.06.21
Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
블로그 이미지

민둥

,

Monkey Test 옵션 정리

Android 2012. 2. 20. 15:21
Basic syntax

$ adb shell monkey [options] <event-count>


해당 package에 대해서 검사할 때

$ adb shell monkey -p your.package.name -v <event-count>


특정 device에 대해 검사할 때

$ adb –s <device> shell monkey <event-count>


Option
 

General
--help Prints a simple usage guide.
-v <number of events> event 발생 횟수
Events  
 -s <seed> random number generator의 seed 설정
--throttle <milliseconds> event 사이의 delay 시간을 결정 (default: no delay)
--pct-touch <percent> Touch event 발생 빈도
--pct-motion <percent> motion event 발생 빈도
--pct-trackball <percent> trackball event 발생 빈도
--pct-nav <percent> navigation event 발생 빈도
--pct-majornav <percent> "major" navigation event 발생 빈도 (center button in a 5-way pad, back key, or menu key)
--pct-syskeys <percent> "system" key event 발생 빈도 (Home, Back, Start Call, End Call, or Volume controls.)
--pct-appswitch <percent> 새로운 app 실행 event 발생 빈도
--pct-anyevent <percent> 기타 event 발생 빈도
Constraints
 -p <allowed-package-name> 지정한 package에 대해 테스트 (중복 사용 가능)
-c <main-category> 하나 이상의 category를 설정할 때 사용 (중복 사용 가능)

'Android' 카테고리의 다른 글

Android Event Dispatch Process  (0) 2012.06.21
Android GestureDetector  (0) 2012.06.12
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
블로그 이미지

민둥

,
Zygote
- 실행되면서 Dalvik 가상 머신을 초기화하고 구동시킨다.
- application이 실행되기 전에 실행된 가상 머신의 코드 및 메모리 정보를 공유 - app이 실행되는 시간을 단축.
- 특히 한정된 자원을 사용해야 하는 임베디드 기기에서 적합함

안드로이드에서 하나의 Application은 isolated 된 하나의 프로세스로 실행하게 됩니다. 안드로이드가 실행되면 zygote라는 최초의 Dalvik VM 프로세스 실행되는데 zygote는 부팅시에 많은 시스템 클래스 라이브러리들을 로드 하게 되며 새로운 Application이 실행될 때마다 fork() 함수를 통해 새로운 자식 프로세스를 생성하게 됩니다. Linux는 프로세스가 fork될 때 부모 프로세스의 주소 영역을 카피하는데 이것이 오버헤드가 심하여 빠른 fork를 위해 다른 방법들을 사용합니다. 대표적인 것이 COW(Copy On Write)인데 부모의 주소 영역을 자식 프로세스가 공유하다가 실제 자식 프로세스가 어떤 영역에 쓰기를 시작할 때 별도의 메모리(페이지)를 할당하는 식입니다. 



ZygoteInit

Dalvik VM --> ZygoteInit::main()
 
(1) registerZygoteSocket()
- 새로운 Android application의 실행 요청을 받기 위한 소켓 바인딩
- UDS (Unix Domain Socket)을 사용하며 init.rc에서 app_process를 실행할때 /dev/zygote으로 등록한 socket을 사용한다
(2) preloadClasses()
           preloadResources()
- Android Application Framework에서 사용할 클래스들과 리소스의 로딩
(3) startSystemServer()
- System Server 시작 - Android platform에 필요한 주요 네이티브 서비스를 실행한다
(SurfaceFlinger, AudioFlinger, MediaPlayerService, CameraService)
(4) runSelectLoopMode()
- 새로운 Android application 실행 요청에 대한 처리

'Android' 카테고리의 다른 글

Android GestureDetector  (0) 2012.06.12
Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
블로그 이미지

민둥

,

JNI (Java Native Interface) 
 

- Java와 C/C++간의 인터페이스를 가능하게 해주는 매개체

- Java class에서 C언어로 작성된 라이브러리에 포함된 함수를 사용하고 싶다거나, 반대로 C에서 자바 클래스 라이브러리를 사용하고 싶은 경우

(1) 빠른 처리 속도를 요구하는 루틴 작성

(2) 하드웨어 제어

(3) 기존 C/C++ 프로그램의 재사용

JNI 개발 순서
 

(1) Java 코드 작성

- method 선언은 Java에서, 선언된 method의 실제 구현은 C/C++에서 이루어 진다.

- native keyword로 native method 선언

- System.loadLibrary()에서 C 라이브러리를 로딩

  (윈도우: hellojni.dll / 리눅스: libhellojni.so) 

(2) Java 코드 컴파일

(3) C header 파일 생성

(4) C 코드 작성

(5) C shared library 생성

(6) Java 프로그램 실행


 

Camera

frameworks/base/core/jni/android/graphics/Camera.cpp

frameworks/base/graphics/java/android/graphics/Camera.java


AlarmManagerServie

frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp



frameworks/base/services/java/com/android/server/AlarmManagerService.java




참고: http://blog.naver.com/PostView.nhn?blogId=iflowerpot&logNo=80119729013 

http://www.kandroid.org/board/board.php?board=androidsource&command=body&no=20 

http://blog.naver.com/PostView.nhn?blogId=oh4zzang&logNo=40111762322 



'Android' 카테고리의 다른 글

Monkey Test 옵션 정리  (0) 2012.02.20
인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
블로그 이미지

민둥

,

p.46 init.rc 분석 실행

 

  • system/core/init/init.c

 

--> int main(int argc, char **argv)
 


(1) init.rc 파일 파싱: 안드로이드가 동작하는데 공통적으로 필요한 환경 설정

(2) init.{hardware}.rc 파일 파싱: 플랫폼 특화된 환경 설정

(3) early-init 액션 리스트 실행:

(4) init 액션 리스트 실행

 

p.47 액션리스트

 

  • 'on' 키워드로 시작하는 액션 리스트
    • on init: 환경변수를 등록하고 파일 디렉터리 생성/마운트, 퍼미션을 조작한다.
    • on boot: application 종료 조건 설정, 구동에 필요한 디렉터리 파일 퍼미션 등을 설정한다.
  • 'service' 키워드로 시작하는 서비스 리스트
    • init 프로세스가 실행시킬 프로세스들을 기술.
    • service들은 모두 service list 등록되고, init 프로세스는 이를 순차적으로 실행한다.

 

  • init.rc 예제 (linaro-android 파일에서 가져옴)

 

on early-init

    start ueventd

 

on init

 

sysclktz 0

 

loglevel 3

 

# setup the global environment

    export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

    export LD_LIBRARY_PATH /vendor/lib:/system/lib

    export ANDROID_BOOTLOGO 1

    export ANDROID_ROOT /system

    export ANDROID_ASSETS /system/app

   

...

 

on boot

# basic network init

    ifup lo

    hostname localhost

    domainname localdomain

 

# set RLIMIT_NICE to allow priorities from 19 to -20

    setrlimit 13 40 40

 

# Define the oom_adj values for the classes of processes that can be

# killed by the kernel.  These are used in ActivityManagerService.

    setprop ro.FOREGROUND_APP_ADJ 0

    setprop ro.VISIBLE_APP_ADJ 1

    setprop ro.PERCEPTIBLE_APP_ADJ 2

    setprop ro.HEAVY_WEIGHT_APP_ADJ 3

    setprop ro.SECONDARY_SERVER_ADJ 4

...

 

# adbd on at boot in emulator

on property:ro.kernel.qemu=1

    start adbd

 

on property:persist.service.adb.enable=1

    start adbd

 

on property:persist.service.adb.enable=0

    stop adbd

 

service servicemanager /system/bin/servicemanager

    user system

    critical

    onrestart restart zygote

    onrestart restart media

 

service vold /system/bin/vold

    socket vold stream 0660 root mount

    ioprio be 2

...

 

 

p.55 액션 리스트 서비스 리스트의 실행

 

  • 액션 리스트와 서비스 리스트의 실행
    • 책에서는 drain_action_queue() 함수라고 소개되어 있지만 (p.55) 바뀐듯.
    • drain_action_queue() --> for + execute_one_command() 같은 역할을 한다.

 


  • 리스트의 명령어를 실행한 , 이벤트에 대한 파일 디스크립트 설정한다.
  • POLL 등록된 fd 이벤트를 기다리게 되고, 이벤트 발생시에 poll() 함수를 통해 이벤트를 처리한다. (p.45~46)


     

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter5  (0) 2012.02.02
인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Linaro  (0) 2011.11.28
블로그 이미지

민둥

,

Chapter 03

init 프로세스

$ head Makefile

VERSION = 2

PATCHLEVEL = 6

SUBLEVEL = 39

EXTRAVERSION = .4

 

p.33 init 프로세스의 실행과정

 

  • kernel/init/main.c

 

--> asmlinkage void __init start_kernel(void)

--> static noinline void __init_refok rest_init(void)

--> static int __init kernel_init(void * unused)
 


(init=/init  같이 최상위 디렉토리에서 init 찾고)
 

--> static noinline int init_post(void)
 

(최상위 디렉토리에 없는 경우 /sbin, /etc, /bin 차례로 찾는다.)
 

 

  • system/core/init/init.c

 

--> int main(int argc, char **argv)
 


(부팅에 필요한 디렉토리들 생성 + 마운트)

 

 

p.36 init 프로세스의 주요 역할
 

  • 디바이스 드라이버 노드 생성
  • 자식 프로세스 종료 처리
  • 프로퍼티 서비스

 

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter4  (0) 2012.02.02
인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Linaro  (0) 2011.11.28
Porting Android to x86  (0) 2011.11.23
블로그 이미지

민둥

,

Chapter 01

안드로이드 프레임워크 개요

Chapter 02

안드로이드 개발 환경 구축

 
 

p.14 이클립스 개발 환경 구축

 

 

p.20 HelloWorld application 작성

  • Android Project 생성
  • Android SDK and AVD Manager: 안드로이드 가상 머신 생성

 


 

 

'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
Linaro  (0) 2011.11.28
Porting Android to x86  (0) 2011.11.23
인사이드 안드로이드  (0) 2011.11.23
블로그 이미지

민둥

,

Linaro

Android 2011. 11. 28. 16:38
Linaro - Android - Panda board



Building Android Platform Code (https://wiki.linaro.org/Platform/Android/BuildSource)

(1) 코드 다운로드

$ repo init -u git://android.git.linaro.org/platform/manifest.git -b linaro-android-11.06-release.2

*** new release *** 
$ repo init -u git://android.git.linaro.org/platform/manifest.git -b linaro-android-11.11-release

문제 없이 한방에 잘된다 씐난다.

$ vim .repo/manifest.xml

위 파일을 열어서 아래와 같은 코드가 제대로 들어있는지 확인 (stable이 있는지만 확인하면 되는듯)

<project name="boot/u-boot-linaro-stable" path="u-boot" remote="linaro" revision="refs/tags/2011.06.3"/>

그런뒤에 repo sync를 하면 되는데.. 하니까 이딴 에러가..

$ repo sync
Initializing project platform/bionic ...
android.git.kernel.org[0: 149.20.4.77]: errno=Connection refused
fatal: unable to connect a socket (Connection refused)
error: Cannot fetch platform/bionic

...........url에 뭔가 해킹이 있었던지 여튼 안된다고.. 
Until git://android.git.kernel.org comes back online feel free to use ours: 다른 url source사용

$ repo init -u git://android.git.linaro.org/tools/repo.git -b linaro_android_2.3.5
$ repo sync 

*** 이제 다시 된다 (2011-12-07) *** 
$ repo init -u git://android.git.linaro.org/platform/manifest.git -b linaro-android-11.11-release
$ repo sync 
 
(2) Toolchain을 받아온다 & 압축풀기

$ wget --no-check-certificate https://android-build.linaro.org/jenkins/job/linaro-android_toolchain-4.6-2011.07/8/artifact/build/out/android-toolchain-eabi-linaro-4.6-2011.07-0-8-2011-07-25_12-42-06-linux-x86.tar.bz2
$ tar -jxvf android-toolchain-eabi-linaro-4.6-2011.07-0-8-2011-07-25_12-42-06-linux-x86.tar.bz2

*** new release ***
$ wget http://releases.linaro.org/11.11/components/android/toolchain/4.6/android-toolchain-eabi-linaro-4.6-2011.11-4-2011-11-15_12-22-49-linux-x86.tar.bz2
$ tar -jxvf android-toolchain-eabi-linaro-4.6-2011.11-4-2011-11-15_12-22-49-linux-x86.tar.bz2

(3) Build하기
(Source와 Toolchain version을 잘 맞춰줘야 make 에러없이 진행 가능하다)

$ PATH=$PWD/android-toolchain-eabi/bin/:$PATH
$ make -j4 TARGET_PRODUCT=pandaboard TARGET_TOOLS_PREFIX=./android-toolchain-eabi/bin/arm-eabi- boottarball systemtarball userdatatarball
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.3.5
TARGET_PRODUCT=pandaboard
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=GRJ90
============================================
....

정상적으로 완료 되었다면 boot.tar.bz2, system.tar.bz2, userdata.tar.bz2가 생성된다.

(1) make가 잘 안되면 PREFIX경로를 절대경로로 수정
(2) /bin/bash: bison: command not found --> sudo apt-get install bison
(3) fatal error: bits/predefs.h: No such file or directory --> sudo apt-get install libc6-dev-i386
(4) fatal error: zlib.h: No such file or directory --> sudo apt-get install zlib1g-dev 

(5) /usr/bin/ld: cannot find -lstdc++ --> sudo apt-get install libstdc++6-4.4-dev AND sudo apt-get install g++-multilib

(6) /usr/bin/ld: cannot find -lz --> sudo apt-get install zlibc


SD card에 올릴 image tool을 받는다.

$ bzr branch lp:linaro-image-tools 

(여기서부턴 아래 Installation(2)에서 부터 따라가면 된다)



(1) Get artifacts 

필요한 파일들 다운로드. wget으로 하니까 3Dhttp 어쩌고 에러나서 직접 다운로드 받은 후에 서버로 옮겼음.

wget http://releases.linaro.org/11.11/android/images/staging-panda/boot.tar.bz2
http://releases.linaro.org/11.11/android/images/staging-panda/system.tar.bz2
http://releases.linaro.org/11.11/android/images/staging-panda/userdata.tar.bz2 

(2) Get the latest linaro image tools

$ bzr branch lp:linaro-image-tools

위 명령어를 실행하면 다음과 같은 에러가 난다. launchpad.net에 등록이 안되어있기 때문.

$ bzr branch lp:linaro-image-tools
You have not informed bzr of your Launchpad ID, and you must do this to
write to Launchpad or access private data.  See "bzr help launchpad-login".
bzr: ERROR: Connection error: while sending POST http://bazaar.launchpad.net/~linaro-image-tools/linaro-image-tools/trunk/.bzr/smart: [Errno 110] Connection timed out

launchpad.net/people/+me에 들어가서 register + ssh key 등록까지 완료한 후에 launchpad-login

$ bzr launchpad-login minjeong-shin

다시 명령어 실행

$ bzr branch lp:linaro-image-tools
The authenticity of host 'bazaar.launchpad.net (91.189.90.11)' can't be established.
RSA key fingerprint is 9d:38:3a:63:b1:d5:6f:c4:44:67:53:49:2e:ee:fc:89.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'bazaar.launchpad.net,91.189.90.11' (RSA) to the list of known hosts.
Branched 469 revision(s).

linaro-image-tools이라는 폴더가 생성된다.

$ ls linaro-image-tools/
COPYING        README      linaro-android-media-create  linaro-hwpack-create   linaro-image-indexer  org.linaro.linaro-image-tools.policy
COPYING.GPL-2  do-release  linaro-fetch-image           linaro-hwpack-install  linaro-media-create   setup.py
COPYING.GPL-3  initrd-do   linaro-fetch-image-ui        linaro-hwpack-replace  linaro_image_tools

(3) Create media

아래 명령어를 실행하려면 python 2.7버젼 이상이 필요하다. 설치!

$ sudo ./linaro-image-tools/linaro-android-media-create --mmc /dev/sdX --dev panda --system system.tar.bz2 --boot boot.tar.bz2 --userdata userdata.tar.bz2

To run linaro-media-create you'll need to make sure the following packages are installed:

  - parted
  - dosfstools
  - u-boot-tools or uboot-mkimage
  - python-argparse
  - python-dbus
  - python-debian >= 0.1.16ubuntu1
  - python-parted
  - qemu-user-static >= 0.13.0 (only if you're running on x86)
  - btrfs-tools
  - command-not-found
  - python-testtools >= 0.9.8
     (available at https://launchpad.net/~linaro-maintainers/+archive/tools)

모두 설치 완료 + USB 삽입

$ sudo ./linaro-image-tools/linaro-android-media-create --mmc /dev/sdX --dev panda --system system.tar.bz2 --boot boot.tar.bz2 --userdata userdata.tar.bz2

I see...
Device           Mount point      Size
/dev/sda         none             476940MB
/dev/sda1        none             100000MB
/dev/sda2        none             102400MB
/dev/sda3        none             163839MB
/dev/sda4        none             110698MB
/dev/sda5        /                103950MB
/dev/sda6        none             6747MB
/dev/sdb         none             1962MB
/dev/sdb1        /media/boot      70MB
/dev/sdb2        /media/rootfs    1890MB
/dev/sr0         none             0MB
Are you 100% sure, on selecting [/dev/sdb] (y/n)? y
....

잘된다 오예!

(4) Boot Pandaboard

Pandaboard에 필요한 준비물을 갖추고 (http://pandaboard.org/content/resources/getting-started

Android booting 성공!!!!

(사진) 


'Android' 카테고리의 다른 글

인사이드 안드로이드 Chapter3 (1)  (0) 2011.12.08
인사이드 안드로이드 Chapter3  (0) 2011.12.08
인사이드 안드로이드 Chapter1-2  (0) 2011.12.08
Porting Android to x86  (0) 2011.11.23
인사이드 안드로이드  (0) 2011.11.23
블로그 이미지

민둥

,