(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
블로그 이미지

민둥

,

Repo recursive copy

Else 2012. 6. 4. 16:44

git root 폴더에 해당하는 dir를 recursive하게 돌면서 cp


repo forall -c 'cp -v  .gitignore ~/project/g1_tdr/${REPO_PATH}'


Shell Script 

#!/bin/sh


DEST=~/project/g1_tdr/android


for file in `find . -name .gitignore`; do

        dir=$DEST"/"`dirname $file`"/.gitignore";

        #echo $file" -> "$dir;

        cp -v $file $dir

done


'Else' 카테고리의 다른 글

JAVA: Read binary file written in C  (0) 2012.03.12
find 사용법  (0) 2012.02.22
블로그 이미지

민둥

,
C에서 쓴 binary file을 Java에서 읽기위해서 온갖 삽질을 하다가..

- encoding문제인가 싶어서 온갖 encoding관련 검색을 하고 변경해봤지만 이건 아니고.
- Java에서 unsigned를 다루지 못해서 생긴 문제인가 싶어서 찾아봤지만 이것도 아니고.
- Big/little endian문제였다는것을 발견... 

Java에서는 Big endian으로만 데이터를 취급한다.
따라서 1) C에서 파일을 작성할때 Big endian으로 써주거나.
아니면 반대로 2) Java에서 읽을때 byte 를 거꾸로 읽어줘야 제대로 된 값을 가져올 수 있다.

나는 C에서 써주는 방법이 좀 더 간단하므로 이 방법을 택했음

1) C에서 작성하는 방법

 #include <arpa/inet.h>
 x = htonl(x);


2) Java에서 읽는 방법
( http://www.blah-blah.ch/it/programming/java-unsigned-int/ )

public static long readBytesLittle2Big(DataInputStream d, int iHowmany) throws IOException {
byte[] b = new byte[iHowmany];
ByteBuffer bb = ByteBuffer.allocate(iHowmany);
for (int x=0;x<iHowmany;x++)
{
b[x] = d.readByte();
}
/*Here I read stuff from disc which is saved in little endian order which I have to convert into big endian*/
for (int x=0;x<iHowmany;x++)
{
bb.put(iHowmany-1-x, b[x]);
}
bb.rewind();
return bb.getInt();
}



'Else' 카테고리의 다른 글

Repo recursive copy  (0) 2012.06.04
find 사용법  (0) 2012.02.22
블로그 이미지

민둥

,

find 사용법

Else 2012. 2. 22. 14:15
find - 파일찾기 

1) 검색 조건


-name filename 파일 이름으로 찾는다. 

-atime +n access time 이 n일 이전인 파일을 찾는다. 
-atime -n access time이 n일 이내인 파일을 찾는다. 
-mtime +n n일 이전에 변경된 파일을 찾는다. 
-mtime -n n일 이내에 변경된 파일을 찾는다. 

-perm nnn 파일 권한이 nnn인 파일을 찾는다. 
-type x 파일 타입이 x인 파일들을 찾는다. 
-size n 사이즈가 n이상인 파일들을 찾는다. 
-links n 링크된 개수가 n인 파일들을 찾는다. 

-user username user이름으로 찾는다. 
-group groupname group 이름으로 찾는다.

2) 처리방법


-print 찾은 파일의 절대 경로명을 화면에 출력한다. 
-exec cmd {};  찾은 파일들에 대해 cmd 명령어를 실행한다.

3) Examples


$ find /user4 -name test* -print
/user4 아래에서 파일이름이 test로 시작하는 모든 파일을 찾아서 화면에 보여준다.

$ find / -name ping -print
root 디렉토리 밑에서 파일이름이 ping인 파일을 찾아 절대 경로명을 화면에 출력한다.

$ find /usr -name *.c -print
/usr 밑에 이름이 .c로 끝나는 모든 파일들을 찾아 경로명을 보여준다.

$ find $home -name who.txt -print
home 디렉토리 아래에 who.txt라는 파일을 찾아 경로명을 보여준다.

$ find . -type d -print
파일 타입이 d인 파일을 찾아 경로명을 화면에 출력한다.

$ find /dev -type c -print
/dev디렉토리 아래에서 파일 타입이 c인 파일을 찾아 경로명을 보여 준다.

$ find . -perm 700 -print
파일 권한이 700인 파일을 찾아준다.

$ find . \ ( -perm 400 -o -perm 200 ) -print
파일 권한이 400인 파일과 200인 파일을 찾아준다. (주의 : "\"의 앞뒤에 space 가 반드시 있어야 한다.)

$ find . -size +1024 -print
파일의 블럭 크기가 1024 이상인 파일을 찾아준다.

$ find . -name core -size +2048 -print
파일 이름이 core이고 크기가 2048블럭 이상인 파일을 찾아준다.

$ find . -user unix01 -print
파일 소유자가 unix01인 파일을 찾아준다.

$ find . -group unix -print
사용자그룹이 unix인 파일을 찾아준다.

$ find . -atime +30 -print
30일 이전에 억세스되었던 파일을 찾는다.

$ find . -mtime -7 -print
7일 이내에 수정된 적이 있는 파일을 찾는다.

$ find . -name core -exec ls -l {} \;
이름이 core인 파일을 찾아서 ls -l 한다.

$ find . -name \*.c -atime +30 -exec ls -l {} \;
30일 이전에 억세스된 파일 중 *.c를 찾아 ls -l 한다.

$ find . -name core -exec rm -i {} \;
현재 디렉토리 밑에서 이름이 core인 파일을 찾아 지운다 (지우기 전에 정말 
지울 지를 물어본다.)

아래는 특정한 문자열을 검색하여 파일명을 출력하여 줍니다. 
$ find . -type f -exec grep "string" /dev/null {} ;
주의할 것은 조건에 맞는 파일의 개수가 많은 경위 쉘의 명령행 버퍼의 범위를 벗어나므로 문제가 생길수 있다는 것입니다.

명령행 버퍼의 오버플로우를 방지하기 위해서 다음과 같이 하십시요.
$ find . -type f | xargs grep "string"

'Else' 카테고리의 다른 글

Repo recursive copy  (0) 2012.06.04
JAVA: Read binary file written in C  (0) 2012.03.12
블로그 이미지

민둥

,

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
블로그 이미지

민둥

,