안드로이드 개발을 조금 해 보신 분들은 저보다 많이 아실테고
안드로이드 완전 초보분들에게 조금 도움이 될까봐 써 봅니다.


아이폰 개발을 하다 안드로이드 개발에 착수한지 딱 2개월이 되었네요

머리가 나빠서 그런지 저는 처음에 개념이 정확히 잘 안 잡히더라구요 거의 1달 반이 넘어서야 조금씩 이해가 되기 시작했습니다.

context란 무엇인지, intent란 무엇인지...   

context, intent, process, activity, service, thread 등등 문서에 다 나와있었고 몇번씩 읽어봤음에도 불구하고 그동안 가지고 있던 편견때문인지 잘 와닿지가 않았었지요.



애플리케이션하면 당연히 보통 하나의 프로세스를 떠올리게 되는데 안드로이드는 전혀 그렇지가 않더군요;

프로세스는 그저 안드로이드앱의 부속품일뿐이고...

그래도 특별한 옵션을 주지 않으면 하나의 프로세스에서 service와 activity, receiver, provider가 다 돌아가긴 합니다

안드로이드에서 애플리케이션의 종료는 process 종료를 의미하는 것이 아니기에 개발할때 그점에서 신중해야 하는 것 같습니다. activity나 service가 가진 자원들은 반드시 ondestroy에서 해제해주고  global 자원사용은 피해야 하겠더군요. global한 자원을 많이 쓰게 되면 이 자원의 해제시점이 좀 묘해져서 말이죠. singleton 을 쓰는 경우도 마찬가지구요. 그런면에서 안드로이드의 api들이 왜 줄줄이 context를 달고다니는지도 이해가 되는 측면입니다.

제가 이해한 바로는 각각의 context가 foreground에 있을 때 자원들을 메모리에 가지고 있다가 pause되기전에 저장해야 하는 것들은 전부 sqlitedb나 bundle에 저장 또는 로컬 파일에 저장을 해주고 메모리 자원은 다 해제를 해 줘야 하는데, 
문제는 이때 I/O의 속도가 충분히 빨라줘야 하는데  갤럭시S의 경우처럼 I/O속도가 비정상적으로 느린 경우 문제가 되더군요..

결국 저는 데이터를 global하게 메모리에 올리고 background에서 sqlitedb에 writeback하는 방법으로 개발을 했지만 메모리 사용이 늘어나는 것이 문제더군요. 

thread사용에 있어서도 background job을 실행하는 경우 thread를 context에 종속시키고(service, activity) 해당 context가 종료될때 thread도 제거해주어야 하는 것이 맞는 것 같구요. 그렇게 하지 않고 thread가 따로 놀게 되면 애플리케이션의 service, activity가 모두 종료되었음에도 불구하고 process는 inactive상태로 thread가 계속 돌게 될 것이구요... 
첬째는 사용자가 의도하는 바와 다르게 보이지 않는 job이 background에서 계속 돌고 있는 것이 문제요, 그 process는 inactive상태이기에 언제든지 kill이 될 수 있으므로 thread가 수행하는 job의 안정성을 보장못받는 것이 또 큰 문제네요.

그리고 그렇게 앱의 process가 inactive상태임에도 불구하고 thread가 돌거나 메모리를 먹고 있게 되는 경우가 많아지면 원래는 필요치 않아야 할 task killer가 필요해지는 모양세가 되구요..

갤럭시S의 경우는 특히나 아예 전면에 태스크매니저를 배치해 놔서 살아 있는 activity가 있을 경우 (home버튼으로 빠져나간 경우) 리스트에 떠서 종료를 눌러버리게 되는 것 같네요. 
그렇게 task kill을 해버리면 앱이 가진 모든 process가 종료되기에 부득이 service까지 종료되구요.  
이때 만약 persistent tcp connection을 유지해야 되는 메신저앱의 경우를 생각해보면 이렇게 task kill로 죽이면 connection을 유지하던 service가 죽어버리게 되니 메세지를 받을 수 없게 되네요.  


각설하고 개발하다보니 원래 안드로이드가 추구하는 방향이 감이 조금 올까 말까 하는데, 자유도가 높고 조금 추상적이다 보니 하나의 통일된 방향으로 가지 못하고, 제조사부터 시작해서 앱개발자들까지 제각각으로 만들다보니 뭔가 어수선한 느낌이 듭니다. 

아이폰과 안드로이드를 다 개발해 보니, 왜 상대적으로 안드로이드 마켓이 전체적으로 품질이 떨어지는지 이해도 되구요..
앱에 따라서 안드로이드가 아이폰에 비해 노력은 배 이상 들어가는데 품질은 본전도 안나오는 느낌이더군요

물론 부족한 경험과 실력 때문인면도 있겠지만, 안드로이드 개발 api와 문서, 그리고 (원래는 같아야 하지만) 폰마다 다른 구현, 심지어 문서대로 동작하지 않는 구현(문서도 보지 않고 만든 것인지...) 등이 많아서
정말 간단한게 아니면 기계마다 테스트가 불가능하니 개인개발자에게는 안드로이드개발이 그리 여의치는 않는 것 같네요.


이거 쓰고 보니 전혀 핵심이 없는 이야기만 줄줄이 썼네요 ㅎ

포인트는

아이폰이 자유도가 낮은 대신   정해진 길로만 가면 적은 노력으로 어느정도 품질되는 앱이 나오는 반면
안드로이드는 자유도가 높은 대신, 부실한 도큐먼트, 기계마다 다른 구현, 뭔가 아쉬운 api등으로 아이폰에 비해 시간투입대비 품질은 덜 나오는 편인 것 같다는 느낌이고,  2달 경험으론 여전히 미궁을 달리고 있다는 거네요... 아 이렇게 하면 된다~ 하는 뭔가가 없는 느낌, 사실 그건 개발자가 찾아야 하지만, 서버가 아닌 클라이언트 개발하는 입장에서는 플랫폼을 만든 주체가 가이드를 조금 더 잘 해줬으면 하는 바램이네요. 검색을 해도 안나오는게 많아서 발로 뛰어야 하는게 너무 많음;