포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
안녕하세요.
요즘 안드로이드 책이랑 몇가지를 정리하면서 간단하게 다시 함 정리할 겸해서 간단한 문서를 올려봅니다
Android에 대해서 여러가지 개발방법이 있습니다.
SDK, NDK, PDK 등등.....
(각각, Software Development Kit, Native Development Kit, Platform Development Kit)
0. 우선
제가 첨부한 파일을 먼저 보시고요.
1. SDK 를 이용한 개발방법
- Application을 개발할 때 사용합니다.
- emulator를 이용한 개발 방법이 되겠습니다.
- Android 소스를 볼 필요는 거의 없을 듯 하네요...^^
- PC에서 개발이 가능하고, 주로 JAVA API를 이용한 개발 방법이 되겠습니다.
※ Android 2.0서부터는 SDK가지고만 개발하기 힘들게 되어 있습니다.
예를 들어서 Multimedia player같은 경우 동작하지 않습니다(2.01부턴가 확실하지는 않네요....ㅎ)
이 경우 Android PDK를 손봐야 하는 것으로 알고 있습니다.
2. NDK를 이용한 개발 방법
- NDK는 asm/C/C++ Library를 Android에서 쉽게 이용할 수 있는 Application level의 툴입니다.
- JAVA class와 JNI관련 method를 등록해야하는 부분이 예전의 C/C++ 개발 엔지니어들이 접근하기
불편하기 때문에 그 부분을 자동화 한 것입니다.
- 위의 두가지 내용이 NDK의 사용용도라고 보시면 될 듯 합니다.
- 대부분의 엔지니어들이 잘 못 알고 있는 부분이 이 부분일 듯 합니다.
- NDK가지고는 Hardware제어가 불가능 하다고 보시면 됩니다 ==> 혹시 성공하신 분 있으면 방법 좀....쩝
- NDK의 경우 open되어 있는 부분이 너무나 적기 때문에 실제로 JAVA를 많이 이용하셔야 하는데
다행히 1.6 Android 버전서부터는 OpenGL을 오픈해줘서 video쪽은 사용이 가능하지만
여전히 audio부분은 JAVA를 이용하셔야 합니다.
- 참, 근래 SDL 포팅된 소스를 보면 audio 이 부분도 C/C++에서 접근할 수 있도록 trick을 써 놓기는 했습니다.ㅎㅎ
- 대부분의 게임은 이걸루 포팅될 가능성이 아주 높습니다.
==> 예전 개발 소스들이 거의 C/C++/ASM일테니깐요
3. PDK를 이용한 방법
- PDK는 안드로이드 소스를 가지고 개발하는 것입니다.
- 주로 포팅쪽에 가깝습니다
- 하드웨어 관련 application등의 개발은 이것으로 할 수 밖에 없다고 보여집니다.
- 1/2번의 개발방법을 다 사용이 가능한 만능이라고 볼 수 있죠
- 하지만, 봐야할 양이 엄청나고, 리눅스를 이용한 컴팔환경서부터 헉......소리 납니다.
- 그러므로 힘들죠....쩝
4. PDK의 동작방식 설명(첨부 문서에서의 개발방법 2/3을 보시면 됩니다)
1> 개발방법 2: native service를 이용한 방법
- 주로 안드로이드 내부의 각종 서비스들은 이런 방법으로 되어 있습니다.
- 멀티미디어, video/audio/camera관련등 속도와 관련된 부분은 대부분 이것을 이용하도록 되어있습니다.
- 각종 native service들이 직접 HAL을 통해서 hardware를 제어하는 구조입니다.
- 속도 관련/하드웨어 제어관련 서비스들이 이런 방식으로 짜겠죠?
2> 개발방법 3: native서비스가 아닌 java service에서 JNI통해서 직접 hal로 접근하는 방법
- 아주 안 좋은 방법중의 하나이지만, 기존의 특정 일을 처리하는 daemon process를 이용해야만 하는경우입니다.
- 하드웨어를 제어하는 방법 중 하나입니다.
- 주로 RIL, wifi, bluetooth가 이것에 속하게 되겠지요.
- 즉, 기존의 리눅스용 프로그램이 존재할 경우 android가 그 프로그램의 client역할을 하는 것입니다.
- 해서 기존의 리눅스용 프로그램 사용법을 아주아주 잘 알아야 합니다.
- 아주 안좋은 방법중의 하나라고 위에서 설명한 이유는 하드웨어 제어를 만일 daemon을 통하지 않고
직접할 경우 system이 멈춰버리는 경우까지 나올 수 있기 때문입니다. UI가 멈춰버리는 문제가 발생할 수도 있습니다.
- 하지만, daemon들로 주로 socket을 이용해서 접근하기 때문에 위의 멈추는 부분은 거의 없다고 봐야죠...^^
대략 이런 방법으로 개발할 수 있다고 보여집니다.
aesop에 오시는 분들은 주로 PDK를 이용한 방법을 많이 사용하시겠지만, 가끔 NDK때문에 질문이 들어와서
간단하게 정리해서 글을 올려봅니다.
그럼....
조준영님이 잘 못 이해하신듯 합니다.
어짜피 system/core/init/device.c는 PDK쪽에 있으니 NDK에서만 으로는 수정 할수가 없을거 같은데요
강제로 chmod로 변경 해 주면 되겠지만.
또 언급된 permission 에러라는게 /dev/xxx 노드의 permission 권한이 없어서 에러가 아니라.
NDK쪽에서 JAVA를 통해 jni통래 SurfaceFliner쪽 부분을 접근하면
/ServiceManager( 176): Permission failure:
> android.permission.ACCESS_SURFACE_FLINGER from uid=10046 pid=554
와 같은 에러 메시지가 발생합니다.
Maneifest.xml쪽에 ACCESS_SURFACE_FLINGER 를 추가해도 어플과 같은 유저레벨에서는 system level에 접근을
일부러 막아 놓은듯 합니다.
이쪽 permission 에러를 말한거 같습니다.
android에서의 permission은 두가지 입니다.
1. Linux쪽의 permission을 사용하는 경우와
2. Application permmssion 문제입니다.
저는 두가지 다 얘기를 한 겁니다.
device driver를 작성할때 아무나 읽을 수 있게 작성하는 경우도 있고, root만 읽을 수 있게 하는 경우가 있습니다.
보통은 device driver를 아무나 read/write 하는 경우가 드물죠...
그리고 android mechanism상 직접 app에서 device driver를 호출하게 되는 경우 device driver에서 stall되는 경우를 대비해서 직접은 제어하는 것을 권장하지 않습니다.
제가 말씀 드리는 부분은 위와 관련되어서 어떻게 처리하느냐 하는 것입니다.
그리고, NDK에서 device driver를 제어하는 것도 가능할지는 모르지만, 그런 부분은 PDK쪽에서 처리하는게 정상이라는 얘기지요.
처리할 경우도 그냥 처리하는게 아니라, 안드로이드가 하는 방식대로 처리하는게 좋다는 얘기고요.
안드로이드는 새로운 분야라 공부할께 너무 많은것 같아서 엄두가 안나는게 요즘 생각이구요 ...
안드로이트 커널포팅 & 어플 제작 ... 만만하게 보고 덤빌 분야가 아니라서 .....
안드로이드 시작 가장 효과적으로 공부하는 방법이 궁금하네요 ???