내 멋대로 안드로이드 - 1

2022. 7. 15. 20:36모바일프로그래밍/안드로이드

728x90

오래 전에 쓴 글이라, 두서가 없을 수 있으며 내용상으로도 정확한 내용이 아닐 수 있습니다.

다만, 열심히 뭔가를 해본 경험에 대한 이야기 일 수 있습니다~~

 

안드로이드란 과연 무엇일까? 라는 생각을 가끔 하곤 했습니다 자바일까? 그건 안드로이드 자바라고 하고 그럼 환경?

리눅스커널을 사용한다는 데 그러면 뭐가 리눅스지? 하는 여러가지 의문점들을 내멋대로 탐험하기 위해서 그리고 여태까지 내가 탐험하고 머리속으로 생각한 주관적인 안드로이드가 무엇인지 스스로도 정리도 할겸 해서 이렇게 글을쓰게 되었습니다

- 2011. 3. 7. 14:26

안드로이드란 무얼까?

사실 뭐라고 해도 상관이 없을 것 같습니다 왜냐하면 지금 안드로이드로 개발하고 있다면 그게 안드로이드 이고 지금 안드로이드를 쓰고 있다면 그게 자신의 안드로이드 일테니까... 

다만 그것이 나의 날개가 되어 줄수 있다고 하면 어떤 날개가 될 수 있을 것인지 그 날개를 내가 달아도 되는 것인지 여러가지 물음에 대해서 생각해보고자 합니다 

물론 문서로 작성해도 되지만 귀찮기도 하고 문서로 만들면 저도 안보는 데 그런 생각이 들어서 그냥 두서 없이 제가 생각하는 안드로이드를 말해보고자 합니다

 

앞으로 제가 말할 내용은 이 부분에 대한 주관적인 제 생각일 뿐이고 거기에 의문이 있으시면 언제나 말씀 해 주시기 바랍니다

 

본론으로 들어가서

현재 안드로이드로 현재 내비게이션을 만들고 있고 그렇게 뚝딱 뚝딱하고 있는 환경은 안드로이드 에뮬레이터 환경이고 sdcard 2기가를 사용하는 설정으로 시작하였습니다 

 

(안드로이드를 설정하고 이를 구동하고 환경설정하는 방법은 사실 따로 지면을 할애 하지 않으면 안되고 또 현재 주제에서 벗어 나는 것이니 다음 기회로 미루기로 합니다. )

그럼 우선 에뮬 환경에서 안드로이드는 어떤 모습일까?

우선 에뮬레이터를 띄우고 (스킨을 좀 바꿨습니다.....이해 하시길)

 

안드로이드 화면이 떳습니다...잘 떳네요 이제 이 놈이 무엇인지 알기 위해서는 내부를 좀 쳐다 봐야 할 것 같으니 리눅스 커널 내부 시스템의 모습을 더 알아 보기 위해서 cmd 창을 띄우고 adb shell이라는 명령어로 현재 세팅되어 있는 리눅스 커널 내부를 한번 훑어 볼 수 있었습니다. 

 

우선 이 adb shell은 일반적인 23번 포트의 텔넷 통신 처럼 TCP 를 사용하는 것처럼 보이고 리눅스 커널이 구동 되더라도 디폴트로 이 서비스가 구동되지는 않는 것 같았습니다 물론 개발자 입장에서 보면 telenet 서버가 구동이 되어야 하는 것이지요

 

adb shell 하면 현재 서버가 떠 있질 않으면 서버를 띄우고 무슨 커맨드 창의 화면을 보여 줄 겁니다 

 

C:\Android\rndr_exts_src\Andro_java>adb shell
* daemon not running. starting it now *
* daemon started successfully *
error: device offline

오프라인은 무슨 내가 띄웠는데....쩝..

사실 서버를 띄우고 바로 클라이언트로 붙을려니 위와 같은 오류가 생겼으니 이제 한번 더 하면 되겠지요

간단한 텔넷 냄새가 나네요....그냥 #만 떠 있는데 어쩌라고...(ㅡ.ㅡ;;)

 

여하튼 어떤 사람에게는 친근 할테고 어떤 사람한테는 좀 생소한 화면에 뭔가가 나왔습니다

여기가 루트겟거니 하고 다음과 같이

ls -l 하면 아주 간단한 리눅스 명령어 이죠...리스트 보는...

다음과 같습니다 리눅스 시스템이기 때문에 우리가 여태까지 봐왔던 유닉스와 리눅스 시스템과 별반 틀리지 않는 디렉토리며 파일들이 있습니다 물론 빈약한 명령어와 함께 말입니다

 

 

위에서도 말했지만 sdcard라는 디렉토리는 환경설정을 만들때 부터 2기가로 잡아놓은 부분에 대한 파일시스템 이미지 이고 그외에서는 기본적으로 우리가 말하는 안드로이드 환경을 구동할 수 있는 설정이나 라이브러리가 들어 있는 디렉토리 입니다

오늘은 간단이 /system에만 들어가 보겠습니다 왜? 내 맘이니까...

리눅스 탐험하기' 시리즈가 아닌 관계로 여타 관계없는 디렉토리는 생략하고 몇몇 중요 디렉토리만 살펴 본다면 이게 아닐까 하는 생각이 번쩍 들었습니다 번쩍?....

음...우선 디렉토리별로 보면...

app: 그럼 우선 기본 에뮬에서 보이는 애플들이 어디로 가 있을까? 사실 어디엔가 가 있겠지요 여기가 아닐까? 역시나 기본적으로 설치된 사용자 애플리케이션이 apk 형식으로 있는 것이 보이 실 겁니다

Email도 있고 카메라도 있고 음악도 있고 많이 있네요 물론 오픈 소스이니까 안드로이드 사이트를 참고 하고 공부해서 뭐는 뭐다 이것은 뭐다 라고 말씀을 드리고 싶으나 그러면 제가 책을 내야 하겠지요 ... 책 제목은 "안드로이드 자바 이래도 돼?"로 하겠습니다 물론 말이 apk이지 자바에서 말하는 jar 즉 java archive와 별반 틀린 것이 없는 파일 들이고 이들이 일련에 클래스 패스 형태로 잡혀서 올라 오는 것이 아닌가 하는 생각이 들더 군요 (apk가 jar 명령어로 풀리는거 아세요?...당근이쥐...!)

근데 우스운 건 framework이라는 디렉토리에는 jar 파일이 떡 하니 수십개가 다음과 같이 존재 합니다

cd framework
# ls
ls
svc.jar(이건 그 Service View Controller???)
input.jar(이건 IME controller?)
core.jar
bmgr.jar(이건 업데이트 매니저?)
framework-tests.jar
android.policy.jar(여기 있었군요 정책 파일 이것도 인스톨 정책 과 암호화에 관련된 부분인거고)
ext.jar
am.jar
monkey.jar
android.test.runner.jar
com.android.im.plugin.jar
framework.jar
ime.jar(여기있네 IME)
framework-res.apk
services.jar
pm.jar

 

근데 왜!...너는 apk이고 나는 jar?? 이것이 우리들의 정책이야 하고 구글이 말하고 있는 것이 아닐까 하네요 내꺼는 apk 니꺼는(누구?..OO소프트?) jar

하지만 우리는 같은 아버지 (jar로 풀리니깐....쯧쯧 내생각임) 아버지가 같아야 자기 자식말고 배다른 자식 즉 진짜 자바 오타쿠들(나같은?)도 따라올거니깐.... 여하튼 넘어가서

 

bin:  현재 이 시스템에서 쓸수 있는 명령어 들이 보이실 겁니다 지면이 자꾸 길어지는 관계로 캡쳐는 생략합니다 오...sleep도 보이는 군요 사실 안드로이드 자바에서 사용하는 쓰레드의 구현이 바로 이 pthread인지 묻고 싶습니다 근데 누구한테 물어야 할지...(누구냐! 너는.......)

이렇게 해서 오늘의 역사적인 의문점이 남은 "lib" 라는 디렉토리도 있군요 그리고 그 리스트를 보니 다음과 같았습니다

이 리스트는 다 뿌려야 할 겉 같군요...

 

libsrec_jni.so libomx_sharedlibrary.so
hw libGLESv1_CM.so
libWnnEngDic.so libwebcore.so
libopencore_rtspreg.so libomx_m4vdec_sharedlibrary.so
libsonivox.so libsystem_server.so
libsysutils.so libomx_amrdec_sharedlibrary.so
libsoundpool.so libsurfaceflinger.so
libxml2wbxml.so libwnndict.so
libpvasfcommon.so libFFTEm.so
libEGL.so libsqlite.so
liblog.so libicudata.so
libomx_avcdec_sharedlibrary.so libhardware.so
libreference-cdma-sms.so libjni_latinime.so
libopencore_common.so libmediaplayerservice.so
libhardware_legacy.so libexpat.so
libjni_pinyinime.so libopencore_rtsp.so
libz.so libopencore_mp4localreg.so
libwbxml_jni.so libskiagl.so
libpixelflinger.so libm.so
libssl.so libnetutils.so
libmedia_jni.so browsertestplugin.so
libcutils.so libWnnJpnDic.so
libemoji.so libdl.so
libui.so libopencore_player.so
libdvm.so libthread_db.so
libctest.so libttspico.so
libopencore_mp4local.so libomx_mp3dec_sharedlibrary.so
libstdc++.so
libril.so
libwpa_client.so
libopencore_author.so
libcrypto.so
libcorecg.so
libcameraservice.so
libandroid_servers.so
libcerttool_jni.so
libnativehelper.so
libdrm1.so
libttssynthproxy.so
libomx_m4venc_sharedlibrary.so
libvorbisidec.so
libicuuc.so
libomx_aacdec_sharedlibrary.so
libwbxml.so
libagl.so
libpagemap.so
libandroid_runtime.so
libc_debug.so
libpvasflocalpb.so
libomx_wmvdec_sharedlibrary.so
libopencore_net_support.so
libomx_wmadec_sharedlibrary.so
libopencore_download.so
libopencore_downloadreg.so
libpvasflocalpbreg.so
libaudioflinger.so
libc.so
libexif.so
libdrm1_jni.so
libreference-ril.so
libomx_amrenc_sharedlibrary.so
libmedia.so
libutils.so
libsgl.so
libgtalk_jni.so
libicui18n.so

어차피 GNU의 네이밍이 lib~로 시작 한다고 하면 그 다음 것들이 바로 현재 이 시스템을 바쳐주고 있는 라이브러리 들이 아닐까 하네요 친근한 것들도 몇몇개 보이는 데 우선 눈에 띄는 것만 살펴 보면

 

libc.so : 이놈이 바로 기본 C 런타임 라이브러리 이겠지요

libstdc++.so : 이놈이 C++라이브러리 인거 같고요...

libGLESv1_CM.so: 이놈은 OpenGL 라이브러린거 같고...

libicui18n.so: 이놈은 언어 라이브러리...

libm.so : 이놈이 수학하는 라이브러리(^^;;)

_jni라고 되어 있는 놈들 중에서 달빅이 숨어 있을까 아니면 다른데 숨어 있을까 하는 생각이 드네요

libz라는 Zlib도 보이고 특이

libsqlite.so : 이놈이 데이터베이스인 sqlite라는 놈인거 같네요

libcrypto.so : 이놈은 대충 암호화 라이브러리 사실 자바에서 빼놓을 수 없는 두가지가 있다면 
저는 당연히 유려한(?) 네트웍 라이브러리랑 암호화 라이브러리가 아닐까 하고 감히 생각합니다

libwbxml.so : 이놈을 사용해서 xml 파싱을 할 수도 있는 걸까 하는 생각도 드네요...
'자바와 XML'이라는 유명한 오라일리의 책도 있지만 자바하면서 XML 함 안써보면 자바했다고 
말하지 말아야 하겠죠

libc_debug.so: 마지막으로 이놈 C 런타임을 디버그 할 수 있을 정도를 
해 주는 무언가 포스를 풍기는 파일인거 같네요...

 

흐..

여하튼 다~~ 저의 주관적인 생각이므로 틀렸더라도 용서 해 주시길 바라며 각각이 뭐하는 놈인지 파헤쳐야 될 수 있으니 파헤치면 라이브러리도 탐험해 볼까 합니다...

 

이런 라이브러리를 가지고 있으면 C/C++가 가능하고 3D까지 가능한 애플리케이션을 만들수 있다는 생각을 하는 것은 당연하다고 생각이 들더군요 왜냐하면 다 있으니까.... 하지만 실환경이 그럴까 할 수도 있겠지만 사실 아주 기본적인 내용만 제공하는 에뮬 환경이라고 고려 해 볼때 더 들어 있으면 있었지 덜 들어 있지는 않을 것이다란 생각이 듭니다만....

자 그럼 여기서 왜..왜! 자바인가 하고 생각해 보지 않을 수가 없습니다 물론 누군가 해답을 가지고 있다면 답변해 주어도 될 듯한데요

라이브러리 오픈된거 하고 다 만들어 놓고 왜 자바를 쓰라고 하는 것일까? 하는 것입니다 일단 이부분에 대한 제 생각은

 

첫번째 : 월등히 빠르다

두번째 : 이식성이 막강하다(아무데나 갖다 붙혀도 된다)

세번째 : 개발이 엄~청 쉽다( 아무나 만들수 있다)

 

정도가 아닐까요? ................... 정말 그럴까요?... 

정말?정말?정말????? 

위의 세가지 항목에 안드로이드 자바에 딱 맞아 떨어지는 해당 사항이 과연 있을까 하는 의문 사항이 듭니다 물론 아니라는 것이지요

 

사실 구글 입장에서 보면 여러가지 생각을 해보지 않았나 하는 생각이 드네요 근데 한가지 명확한 사실은 구글이 내놓은 모든 애플리케이션을 보면 사용자 친화적인 GUI를 만들려고 노력해 왔다는 것일 겁니다 

(구글 맵과 AJAX가 그랬고, 구글어뜨으가 그랬고 지금도 그렇고)

 

그런 상황에서 그런 GUI 환경을 내놓을 수 있는 그러면서 그럴싸하게 포장할 수 있는 (유식하게 캡슐화?) 달짝지끈한 언어를 찾고 있지 않았을까 하는 생각이 일단 들고 그런 구현을 위해서 고려해 볼수 있는 것들이 그렇게 넓지만은 않았을 것이라는 것입니다

 

제가 봤을 때 그런 것이라면 자바가 딱이지 않나요? 유창하게 오부젝트 오리엔티뜨 랭귀지라서 모든 소프트웨어 개발자가 한번쯤은 만들어 보았을 패턴 상속 등등등....도 되고! 

더 좋은 점은 JVM만 잘 구현 하면 (스팩은 있으니..날로 먹나?) 자바하고 실질적인 OS(리눅스커널)하고는 별개의 동작을 할 수 있으니 서로의 장점을 살릴수도 있고 말이지... 

 

하지만 그래서 딱 이거 하나 선택하기는 그러니 함 생각해 보자구요 

뭐 일단 생각 나는 것이

Win32 : 일단 마이크로 소프트라는 거부감이 있지 않았을까? 이거 돈 도 필요하겠지요 빌게이츠가 얼마나 사회에 기부했는데 이걸로 벌어야쥐...

XWindow: 이건 나도 잘 모르는 데 여하튼 여태까지 보아온 유닉스 리눅스 환경에서 GUI를 좋다고 하거나 내가 좋아 본적은 한번도 없고 뭐 태생적으로 서버는 GUI가 필요 했을까나?

매킨토시: 이건 돈들어야 하지 않나? 그리고 공짜 좋아해서 회장도 대머리인 구글이 돈들여가면서 할까??

Swing: 사실 공짜 같지만 자바의 라이선스 정책은 그게 아니라 돈줘야 한다구....

결국 자바로 가져 가는 것은 맞는데 구현만 구글식으로 한 DalVik 머신을 제공하게 된 것이 아닐까 하는 생각이 드네요 

 

물론 순전이 나의 생각입니다 믿거나 말거나

여하튼 구글 입장에서도 정말 많은 일을 해지요 리눅스 커널 환경 구축했지 

그거 구축하면서 개발 환경 이를때면 bionic 같은 C/C++ 런타임 라이브러리 그리고 자바GUI를 모방도 해야 되지 하지만 또~옥 같이는 못만드니 이벤트도 모두 구현해야지 자바라면 생각나는 것들에 대해서는 구색이라도 갖추어야 했으니......말이죠

 

어떻게 하다가 이렇게 유추가 되는 군요 이거 내멋대로 탐험을 한번만 할려고 지면을 할애 했는데 이번거 같고는

턱도 없을 거 같아서 이름 뒤에다 -1을 붙입니다

 

다음 번에는 다른 디렉토리도 검색 해 보고 내가 인스톨한 애플리케이션은 어디로 갔을까? 라는 궁금증

 만약 그걸 알면 잘 하면 그냥 아무거나 거기에다 집어 넣으면 될 거 아닌가 하는 생각도 들고...

네이티브 라이브러리를 만들어서 수동으로 구동 할려면 사실 라이브러리를 어디에서 뒤져야 할지 알아야 하니 그런 부분이라던지 오늘 제가 말씀 드린 자바를 선택한 나름의 이유가 맞다면 당연이 안드로이드 자바 API에는 그런 내용만 묻어 있어야 하니 그런 내용만 묻어 있는 지 알아 보기로 하겠습니다

 

모쪼록 여기까지 읽어 주셨다면 감사하고 위에서 말한 이 모든 내용은 전적으로 제 주관적인 생각으로 창작한 것임을 밝혀 드립니다

728x90