2012년 7월 13일 금요일

안드로이드 스크랩 노트

난 구글이 싫다.

실력이 너무 좋다.



플랫폼 구조


소프트웨어 플랫폼이란 ? 소프트웨어의 주요구성요소, 구성요소간의 인터페이스, 중요동작방식 등의 주요 특징들을 결정짓는 모든 설계 구조

소프트웨어 플랫폼은 소프트웨어 개발에 있어 가장 영향력

소프트웨어 플랫폼 종류 : 윈도우, 리눅스, 닷넷, 자바

런타임(runtime) 이란?

안드로이드 소프트웨어 플랫폼?

모바일 장치를 위한 소프트웨어 집합체

계층적 구조 : 커널, 라이브러리,

런타임라이브러리,애플리케이션 프레임워크,

애플리케이션으로 적층

자바 플랫폼이라고 하지 않음


안드로이드 파일시스템 구조


일반 리눅스 파일시스템 구조와 다르다.


안드로이드 파일시스템 구조


일반 리눅스 파일시스템에 안드로이드 플랫폼 위한 파일 저장 폴더 추가

/data, /system 폴더 추가

/recovery 추가 : 안드로이드 2.2 버전

각각의 추가된 폴더에 어떤 내용이 들어있는지 확인 필요

 
커널 특징


Open source

리눅스 커널 2.6.x 에 안드로이드 커널 패치

내부 메모리관리, 프로세스 관리, 네트워킹, 운영체계

상위층 : 라이브러리, 달빅 런타임

하위층: 하드웨어 (기본장치 외의 하드웨어릏 모듈형식으로 동작)

사용자 모드로 동작하면 커널 버전이 갱신될 때마다

플러그인 방식으로 배포/사용이 편리

속도 느려지는 단점

라이선스

안정성 향상

우분투 리눅스 + 안드로이드 기능추가


Debian GNU/Linux 기본

무료로 다운로드

GPL, LGPL 라이선스

레드햇 리눅스 상업화 이후 독보적 마켓쉐어

커널 설정에서 다음 기능 추가

Alarm 기능,

공유메모리 (ashmem),

low memory-killer,

전력관리 (Power management),

바인더,

logger 등

커널 빌드 도구 변경


기존 임베디드 시스템은 ARM 사의 ABI (Application Binary Interface)

기반 gcc 컴파일러 사용

안드로이드에서는 ARM EABI (Embedded Application Binary Interface)

기반의 툴체인 사용

EABI?

 
안드로이드 일반 라이브러리


라이브러리 : C/C++로 제작

C/C++ 라이브러리 변경 : glibc -> BSD Unix의 libc->Bionic C

라이브러리가 동적 라이브러리 확장자(so)/system/lib 폴더에 위치

surface manager, media framework, sqlite, webkit, libc등으로 구성


안드로이드 일반 라이브러리 : surface manager


애플리케이션 생성화면 -> 프레임버퍼 저장(RAM) -> LCD 화면표시

LCD와 CPU 데이터 처리속도 차이: 프레임버퍼 저장후 일시에 LCD 출력

2D, 3D 표현

화면합성, 결합, 반투명 효과

 
안드로이드 일반 라이브러리 :


미디어 프레임워크 : PocketVideo OpenCORE 기반, MPEG4, H264, AAC

Sqlite : 개방형 관계형 데이터베이스

WebKit : 웹브라우저 기반 엔진, 화면 웹 내용, 오픈소스, 웹 관련 클래스 제공



glibc : GPL, 소스공개의무

libc : BSD, 공개의무 없음,

코드 경량,

libc를 플랫폼에 맞게 수정한 Bionic C lib,

프로세스마다 동적으로 적재, libc.so: 226KB의 경량 쓰레드

모든 라이브러리 코드가 bionic과 함께 컴파일

LibWebCore

OpenGL ES

FreeType

Audio Manager

 
안드로이드 런타임 라이브러리 :


컴퓨터 프로그램을 실행하는 동안의 기능을 추가하기 위하여 사용되는 특별한

프로그램 라이브러리

입출력, 메모리 관리, 산술함수 기능

일반 라이브러리와 차이는 컴파일러 제조사에 따라 다름

런타임 라이브러리는 컴파일러와 플랫폼에 종속

달빅(Dalvik) 가상머신의 지원으로 하드웨어 종속성 해결,

달빅은 405KB의 livdvm.so 라이브러리로 지원

 
 
안드로이드 런타임 라이브러리 : DalVik VM


달빅 가상머신

가장 신비스러운 곳 :미공개 소스

Interpreter, register based, 적은 메모리에 최적화된 가상머신,

banked 레지스터 기반 데이터 이동으로 속도가 빠름

일반자바 가상머신: stack based(PUSH, POP 사용)

자바 언어 사용하지만 선마이크로시스템스의 자바와는 다름(특허문제 때문)

선 마이크로시스템스 Java : 1-2바이트 길이 코드

안드로이드 Java : 4 바이트 코드, ARM 프로세서에 최적화,

4바이트 레지스터로 명령수행, 빠른 성능

 
안드로이드 런타임 라이브러리 : Dalvik VM


일반 자바 : 소스코드(.java) -> 자바 컴파일러 -> 클래스생성 (.class)

-> 가상머신에서 실행



안드로이드 자바 : 소스코드(.java) -> 자바 컴파일러 -> 클래스생성 (.class)

-> dx 사용 -> dex (최소 메모리로 최적화 )

-> Dalvik 가상머신에서 실행


tools> dexdump -d classes.dex


 
1. cmd 명령으로 명령창 띄운다.


2. D 드라이버로 이동하기 위하여 d:을 입력한다.

3. 안드로이드 SDK에 대한 환경 변수 설정이 되어 있지 않다면 “cd android\android-sdk\platforms\android-3\tools” 명령을 실행한다.

4. “dexdump -f D:\android\workspace\android\bin\classes.dex” 명령을 실행


 
 
 
 
<코드 11-1> 네이티브 서비스 초기화 코드


extern "C" status_t system_init()

{

LOGI("Entered system_init()");

sp proc(ProcessState::self());

sp sm = defaultServiceManager();

LOGI("ServiceManager: %p\n", sm.get());

sp grim = new GrimReaper();

sm->asBinder()->linkToDeath(grim, grim.get(), 0);

char propBuf[PROPERTY_VALUE_MAX];

property_get("system_init.startsurfaceflinger", propBuf, "1");

if (strcmp(propBuf, "1") == 0) {

// Start the SurfaceFlinger

SurfaceFlinger::instantiate();

}

// On the simulator, audioflinger et al don't get started the

// same way as on the device, and we need to start them here

if (!proc->supportsProcesses()) {

// Start the AudioFlinger

AudioFlinger::instantiate();

// Start the media playback service

MediaPlayerService::instantiate();

// Start the camera service

CameraService::instantiate();

 
 
 
 
 
안드로이드 플랫폼 부팅


안드로이드 부팅이 후 자바 서비스 시작 : 시스템 서버

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

시스템 서버는 Native 서비스 외에도 다양한 서비스 지원

 
 
 
 
<코드 11-2> 시스템 서버에서 init2()와 스레드를 호출하는 코드


// And now start the Android runtime.

LOGI("System server: starting Android runtime.\n");

AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services.\n");

runtime->callStatic("com/android/server/SystemServer", "init2");

// If running in our own process, just go into the thread

// pool. Otherwise, call the initialization finished

// func to let this process continue its initilization.

if (proc->supportsProcesses()) {

LOGI("System server: entering thread pool.\n");

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

LOGI("System server: exiting thread pool.\n");

}

return NO_ERROR;

}


 
 
 
시스템 서버의 기타 서비스 목록


네트워크 상태 서비스NetStat Service,

연결 서비스Connectivity Service,

노티피케이션 매니저Notification Manager,

마운트 서비스Mount Service,

디바이스 스토리지 모니터 서비스

Device Storage Monitor Service,

위치 매니저Location Manager,

탐색 매니저 서비스Search Manager Service,

폴백 체크인 서비스Fallback Checkin Service,

배경화면 서비스Wallpaper Service,

오디오 서비스Audio Service,

핸드셋 옵저버Headset Observer 등



 

댓글 없음:

댓글 쓰기

국정원의 댓글 공작을 지탄합니다.

UPBIT is a South Korean company, and people died of suicide cause of coin investment.

 UPBIT is a South Korean company, and people died of suicide cause of coin. The company helps the people who control the market price manipu...