출처 : http://www.androidside.com/bbs/board.php?bo_table=B46&wr_id=15314
Android 2.3 Platform Highlights For Me…
2010년 12월 7일. 드디어 말 많고 탈 많던 안드로이드 2.3 진저브레드가 공개되었습니다. 연초만 하더라도, 버전이 3.0 으로 올라가며, UI Framework 전반에 걸쳐 큰 변화가 있을 것으로 알려져있었습니다만, 결국 UI 의 전반적인 조정은 다음 버전인 허니컴으로 미루어졌네요. 결과적으로, 일반 사용자들이 보기에는 기존 2.2 프로요와 큰 차이점을 발견할 수 없을 수도 있겟습니다. 그래도 이리저리 뜯어보니 어플리케이션 개발자들에게는 상당히 반가운 내용들이 많이 포함되어 있네요. 개인적으로! 유용하다고 생각되는 기능들에 관하여 정리해 보았습니다.
아참. 시작하기에 앞서, 안드로이드 개발자 블로그에 올라온 진저 브레드 소개글을 번역한게 있으니, 한번 살펴보시면 좋을 거 같습니다 ^^;

Concurrent GC (Garbage Collector)
우선, 첫 번째 무엇보다도 반가웠던 소식은 바로 GC 의 성능이 크게(?) 개선될 조짐이 있다는 점 입니다. 기존 안드로이드 플랫폼에서 제공된 GC 는 STW(Stop the World – 모두다 멈춰라!) 방식이였기 때문에, GC 가 동작중인 상황에서는 전체 어플리케이션이 프리즈 되는 현상이 있었습니다. 어플리케이션 개발자 입장에서는 이를 회피하기 위해 최대한 캐쉬를 사용하거나 Package 영역에 변수를 사용하거나 하는 등등 여러가지 노력을 기울이곤 했습니다다. 제 경험상 프로파일을 돌려 보면 GC 가 차지하는 작업 시간이 대게 10% 내외이더군요.
하지만, 안드로이드 2.3 에서 Concurrent GC 기법이 적용됨에 따라, 개발자의 별다른 노력 없이도 (만세~~!) 어플리케이션의 성능이 향상될 수 있을듯 보입니다. 관련해서 내용을 잘 정리해 놓은 위키 페이지가 있습니다. 결론적으로 Concurrent GC 는 Application 의 Thread 의 Block 을 최소한으로 줄이며 (비록 전체 Throughput 관점에서는 손해를 보더라도), GC 작업을 수행하도록 설계되었다고 합니다.
Proguard 통합
어플리케이션 개발자로서 자신의 어플리케이션을 난독화 하는 것은, 물론 하면 좋지만 실재로 하기에는 너무 너무 귀찮은 작업입니다. 특히나, 독립적인 빌드 서버를 운영하는 메이저한 업체가 아니라 개인 개발자의 경우라면 더욱 그러하겠지요. 저도 Proguard 관련해서 몇몇 문서를 번역 하기는 했지만, 실재로 회사에서 작업하는 어플리케이션을 위해 한 번 적용해본 것이 전부;;; 자작 어플에 대해서는 생각도 못하고 있었답니다.
하지만, 아마도(?) 이제는 걱정 끝. 진저 브레드 공개와 함께 업데이트된 ADT 플러그인을 사용하면 빌드 시점에 통합적으로 Proguard 가 적용된 APK 파일을 생성할 수 있게 된 것으로 보입니다. (실재로 테스트 한 것은 아닙니다만…) 그리고, Proguard 와 구글의 마켓 라이센스 서비스가 결합되면 현재 여러가지로 문제가 많은 어플리케이션 불법 복제 문제가 조금 수그러들지 않을까 기대하고 있습니다. 자신의 어플리케이션이 불법 복제되는 것 보다 개발자의 마음을 우울하게 만드는 것은 오직 한 가지 뿐. (바로 자신의 어플리케이션이 철저하게 사람들의 관심을 끌지 못하는 것 ㅠㅠ) 그런 우울한 사태를 회피하기 위해서 구글이 야심차게 준비한 LVL(License Verification Library) 와 Proguard 를 적극 활용해 보시면 어떨까요?
이와 관련되서, 어플리케이션을 크래커들로부터 보호하는 방법 이라는 내용의 개발자 블로그 번역글이 있으니 참고해 보셔도 좋습니다.
StrictMode
또 한가지, 재미있는 기능(?)이 추가되었습니다. 안드로이드 어플리케이션을 개발할 때, 가장 디버깅 하기 힘든 문제 중에 하나가 바로 ANR(Application Not Responsing) 관련 버그라고 할 수 있습니다. ANR 은 특정 어플리케이션이 일정 시간 내에, 키 입력과 같은 사용자 이벤트를 처리하지 못하면 플랫폼 상에서 해당 어플리케이션을 종료시키며 발생하는 오류입니다. 이를 회피하기 위해서 다양한 방법을 (Handler 나 AsyncTask 등) 활용하게 되지요. 그런데 문제는 혹시라도 이러한 조치를 깜박한 경우… ANR 은 항상 발생하는 것이 아니라 때와 상황에 따라 발생할 수도 그렇지 않을 수도 있습니다. 그런고로, 왠만큼 열심히 테스팅을 하지 않으면 이러한 잠재 결함을 미처 해결하지 못하고 어플리케이션이 릴리즈… 나중에 다양한 폭탄을 맞을 수가 있습니다.
public void onCreate() {
if (DEVELOPER_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.penaltyLog()
.penaltyDeath()
.build());
}
super.onCreate();
}
하지만 만일 개발자가 위의 코드 처럼 StrictMode 를 활용할 경우, 특정 스레드에서 ANR 을 야기할 수 있는 디스크 혹은 네트워크 I/O 작업이 발생하는 경우, 혹은 내부에서 호출하는 RPC 콜 내에서 이러한 작업이 일어나는 경우(Best Effort 라고 하는 군요)에 해당 사실을 확인 할 수 있습니다. 작은 규모의 어플리케이션을 개발할 때는 뭐 이런게 필요 있을까 싶을 수도 있겠습니다만, 어플리케이션 규모가 커지고 이런 저런 외부 라이브러리를 사용하게 되는 경우 굉장히 유용한 도구가 될 것이라고 생각되네요. 개인적인 감상으로는, 구글의 개발자들에 대한 사랑^^을 확인 할 수 있는 기능이 아닌가 싶습니다.
Download Manager
시스템 서비스로 재미있는 녀석이 하나 추가되었습니다. 바로 Download Manager 라는 녀석입니다. 음… 안드로이드 SDK 내용을 보니, 오랜 시간이 걸리는 HTTP 다운로드를 백그라운드에서 대신 담당해준다고 합니다. 그리고 Network 오류라거나 폰이 재부팅 되는 경우에도 해당 다운로드를 계속 재시도 하는 방식으로 동작한다고 하는 군요. 사용자가 다운로드를 캔슬 하거나 완료되는 경우에는 해당 내용을 Broadcast 형식으로 전달해 주고 말이지요.
사실 이 Download Manager 는, 2.3 이전에도 시스템상에 존재하던 서비스 였습니다. 대표적으로 내장 브라우저와 안드로이드 마켓 어플리케이션에서 해당 서비스를 사용하고 있었지요. 대신 시스템 권한을 갖지 못한 어플리케이션은 사용할 수 없던 제한적인 서비스 였습니다. 진저 브레드로 업그레이드 되면서, Download Manager 서비스가 공개됨에 따라, SD 카드 공간 제약 등, 이래 저래 외부에서 대용량 파일을 다운받을 일이 많을 안드로이드 어플리케이션 개발자들에게 큰 도움이 되지 않을까 싶습니다. 회사에서 하고있는 일과도 제법 관계가 있는 내용인지라 개인적으로도 관심있게 살펴보고 있답니다.^^
View Security
또 한가지 보안과 관련되어 중요한 업데이트가 있습니다. 바로 View Security 관련된 항목입니다. View 와 관련된 보안이라니… 도데체 View 에서 보안을 신경쓸 부분이 뭐가 있단 말인가… 싶습니다만, 이게 이외로 중요한 내용이더군요.
안드로이 휴대폰을 사용자는 간편하게 특정 View(예를 들어 구매 버튼 같은)를 클릭하는 것 만으로 광고를 보거나, 어플리케이션을 구매하거나, 중요한 금융거래를 할 수가 있습니다. 그런데 안드로이드는 플랫폼 소스가 전부 공개되어 있으며, 특정한 하드웨어 이벤트 등등을 임의로 발생시키는 방법도 다양하게 존재합니다. 따라서, 악의적인 어플리케이션이 임의로 부정 광고 클릭 이벤트를 발생 시키거나, 마치 특정 어플리케이션의 구매 버튼이 눌린 것과 같은 이벤트를 발생 시킬 수도 있습니다. 사용자의 동의 없이 말이지요. (개발팀에서 한가지 예로 든 방법은 바로 교묘히 디자인된 Toast 를 활용하는 것 입니다. 기발하네요.)
public void setFilterTouchesWhenObscured (boolean enabled)
Since: API Level 9
Sets whether the framework should discard touches when the view’s window is obscured by another visible window. Refer to the View security documentation for more details.
Related XML Attributes
Parameters
| enabled | True if touch filtering should be enabled. |
|---|
See Also
새롭게 추가된 setFilterTouchesWhenObscured 메서드를 사용하는 경우, 특정 View 가 현재 최상의 Window 에 위치하지 않는 경우, 해당 View 에 발생하는 터치 이벤트를 무시하도록 할 수 있습니다. 즉, 다시말해 사용자가 직접 해당 View 를 터치하는 경우에 한해서만 해당 터치 이벤트가 처리되게 된다고 합니다. 어플리케이션 사용자의 소중한 재산과 정보를 지키기 위해서 꼭 살펴보시면 좋겠네요.
Dalvik Runtime
기본적으로 지원되는 Dalvik Runtime 기반의 Java 라이브러리에도 몇가지 변경점이 눈에 띕니다. 주절 주절 설을 풀기 보다 안드로이드 플랫폼 문서에서 관련된 내용을 기준으로 간략하게 정리해 봅니다.
- 새로운 Collection 클래스 지원: Deque 와 NavigableMap 이 추가 되었습니다. Deque 는 다들 알고 계신 것 처럼, 앞으로도 뒤로도 아이템을 넣을 수 있는 Queue 이고, NavigableMap 은 지정된 Comparator 를 기반으로 특정 Key 값과 비교하여 가장 유사한 값이나 특정 Key 보다 큰 값을 갖는 아이템을 모두 가져오는 등의 기능을 수행하는 Collection 이라고 하는 군요. 예를 들어 특정 시간 이후에 발생한 이벤트만을 가져온다거나 하는 등등에 나름 유용할 듯 하네요.
- 새로운 Arrays 유틸 지원: asList(), binarySearch(), copyOf(), copyOfRange() 등의 유틸 함수가 추가적으로 지원된다고 합니다. 음.. 개인적으로 생명주기가 짧은 객체 사용을 피하기 위해서 Primitive 변수들은 Array 를 적극 활용하곤 하는데, asList 나 copyOfRange 등의 유틸이 추가됨으로서 관련된 코드 라인을 확 줄일 수 있을 듯 합니다. 럭키~
- 유니코드 관련된 기능이 추가되었습니다. 우선, 유니코드 정규화 관련되어 Normalizer 와 Normalizer.Form 클래스가 지원됩니다. 이 유니코드 정규화라는 저에게는 생소한 계념인데, 간단하게 의미상으로 동일한 유니코드 (예를 들어 ‘가’ 와 ‘ㄱ ㅏ’ 처럼)는 정규화 과정을 거치게 되면 모두 동일한 코드 값으로 표현된다고 하는군요. 보다 상세한 내용은 관련된 내용을 담고있는 웹페이지를 참고해 주세요. 또한, 이 정규화를 바탕으로 유니코드 기반의 도메인 네임을 지원할 수 있는 IDN(다국어 도메인) 클래스도 추가되었습니다.
- 네트워크 API 관련되어 InterfaceAddress 클래스와 NetworkInterface 가 추가로 지원됩니다. 사실 안드로이드 플랫폼 상에서 자신의 IP 주소 값을 가져오는 것이 이외로 간단한 듯 하면서도 복잡한 일 중에 하나였는데 (애매한 문자열 파싱 과정을 거치는…), 이제는 그런일 없이 손쉽게 IP 주소값을 가져올 수 있을 듯 합니다. 그리고 추가로, Virtual NetworkInterface 등등에 관한 내용을 참조 할 수 있는 API 들도 추가 되었는데, 단순히 모바일 AP 관련되어 추가된 내용인지 아니면 가상 네트워크 인터페이스를 통한 VPN 등의 서비스를 준비 중인 건지 궁금합니다.
- String.isEmpty() 메서드가 추가되었습니다. 이제 지저분한 ( String.length() >= 0 ) 과 같은 코드와는 작별입니다~~~^^
- File API 가 추가되었습니다. 안드로이드 플랫폼 상에서 특정 디렉토리의 용량을 확인하기 위해서는 StatFs 클래스를 이용하여 조금 지저분한 코드가 필요했는데, 이제는 그럴 필요 없이 간편하게 getUsableSpace() 메서드등을 이용하여 확인 할 수 있게 되었습니다.
- HttpURLConnection 을 위한 CookieManager 가 추가되었고, javax.net.ssl server socket 의 구현이 개선되었다고 합니다. 에… 이부분은 제가 잘 모르는 부분이니 패스.
기타 등등
그 외에, 뭐 OverScroller(아이폰 용 트위터나 페이스북 어플에서 지원하는 OverScroll 기반의 업데이트 GUI 같은 기능을 쉽게 구현할 수 있겠네요.) 라던가 AudioEffect(말하는 톰 같은 어플이 쏟아질 거 같은 확실한 예감이…) 기능이라던가, 듀얼 카메라 지원, 인터넷 전화 지원, 자이로스코프 센서 지원, 큰화면 지원 등등(헥헥… 많군요…언제 다 살펴볼까나 ㅠㅠ) 여러가지 추가 사항이 있습니다. 개인적으로는 업무 상 꼭 필요한 내용은 아닌 거 같아서, 아… 이런게 있구나… 정도만 확인하고 넘어갔습니다만, 이와 관련되어 안드로이드 펍의 회색 님께서 플랫폼 하이라이트 문서를 번역해 두신 것이 있으니 꼭 한번 확인해 보시기 바랍니다.
