Search Results for '안드로이드'

9 POSTS

  1. 2010/07/25 Android Custom Dialog (2)
  2. 2010/07/11 ndk-gdb
  3. 2010/06/10 앤디 루빈 인터뷰
  4. 2010/05/28 Rosetta를 소개합니다. (4)
  5. 2010/05/28 Android 2.2 Push API (C2DM)
  6. 2010/05/27 Bitmap of Android NDK r4
  7. 2010/05/26 Android NDK r4
  8. 2010/03/03 안드로이드 Debug Mode와 Signing
  9. 2009/08/01 assert() 작성

Android Custom Dialog

2010/07/25 00:08

안드로이드에서 커스텀 다이얼로그를 만들 때에는, 일반적으로 Activity를 많이 사용한다. Google이 제공하는ApiDemos에 그런 예제가 있기도 하고, 대부분의 책들에도 그렇게 설명이 되어있다. 하지만, 손 쉽게 OnClickListener 를 붙이고, 타이틀을 붙이고 할 수 있는 Dialog에 비해서, Activity로 팝업창을 만들게 되면, 상당히 불편하다. 잘 알려져있진 않은데, Dialog 를 완전히 customize 할 수 있는 방법이 없는 것은 아니다.

첫번째 링크 처럼 Dialog를 상속해서 customized dialog 를 만들거나, (두번째 링크 처럼) AlertDialog.Builder 까지 만들어버리면 된다. So Cool~

-- 이상한 나라의 종텐.


ndk-gdb

2010/07/11 11:04

Android NDK r4 에는 ndk-gdb 가 포함 되었다. ndk-build 로 빌드한 C/C++ 코드를 gdb로 까볼 수 있는 녀석이다. 주의 사항이 몇가지 있는데, {NDK}/docs/NDK-GDB.TXT 에 대부분 설명 되어있고, 당황했던 점으로는,

  • 디바이스가 Android 2.2 Froyo 이상이어야 한다. ㅠㅠ (에뮬로 되긴 하지만..)
  • Mac OS X 스노우 레오파드에서, armeabi가 아니고 ameabi 라는 얼토당토 않은 에러가 나는데, 이렇게 처리하면 된다.

디버깅 고고싱=3=3

-- 버그를 찾아 헤메이는 종텐.


앤디 루빈 인터뷰

2010/06/10 09:40

아는 사람들은 알겠지만, 안드로이드는 구글에서 2005년에 인수한 회사의 제품이다. 심지어, 그 회사 이름도 안드로이드였다. 그 회사의 사장이 "앤디 루빈"이라는 사람인데, 인수 후에는 구글의 부사장이 되었다. 이 아저씨가 얼마전에 삼성전자 갤럭시S의 론칭 행사에 방한했었는데, 인터뷰 기사가 있어서 소개한다.

http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=001&aid=0003319166

기자 분이 준비를 꽤 많이 해갔었나보다. 날카로운 질문들이 종종 있다. 기자가 공격을 하면, 앤디 루빈은 죄다 "그건 사실 장점이다"라면서 뻥을 치는데 -_-;; 그래 뭐, 구글에겐 장점이겠지만, 제조사, 앱 개발자, 소비자에겐 장점이 아닌 부분들이 참 많다. 다른건 대충 구글의 입장을 이해하겠는데, 딱 하나만 좀 지적하자면, -_-+

"구글TV는 인텔 CPU를, 넥서스원은 퀄컴의 CPU를 썼지만, 안드로이드는 동일하게 지원한다. 화면 크기나 CPU 종류에 상관없이 잘 구동된다는 것이 안드로이드의 주요 강점이다."

이 부분은 좀 납득하기 어렵다. 첫째로, 자바만을 이용해서 개발을 한다면, 달빅 가상머신이 있으니 상관이 없겠지만, NDK의 다음 버전에선 x86으로의 빌드가 지원될 예정이긴 한데, apk 이미지는 두개가 나올 수 밖에 없지 않나? 설마, apk 한개 안에서 두개의 바이너리 이미지를 넣는다 하더라도, 이미 만들어진 레거시들은? 아, 뭐, 하위 호환성은 별로 신경 안 쓸테니.. -_-.. 둘째로, 화면 크기에 상관없이 잘 구동된다는 점. 그래 뭐, dip(density independent pixel)같은 훌륭한게 있긴 하지만, 개발자들은 대체로 소화하고 있지 못하다. -_- 개발자가 소화한다 하더라도, 디자이너는 같은 이미지를 3벌을 만들어야 한다는걸 이해하지 못한다. -_- 아.. 그 밖에도 정말 마음에 안 드는 구석이 참 많은데, 궁시렁궁시렁...

구글이 안드로이드 마켓의 수익에는 큰 관심이 없는건, 여러가지 정책을 통해서 알겠는데, 안드로이드 마켓의 수익과 앱의 품질이 비례한다는 것을 좀 인지했으면 좋겠다. 반대로, 앱의 품질이 향상되면, 플랫폼의 입지도 높아지고, 오히려 더 잘 퍼질 것 같은데.. 지금의 정책은 여러가지로 좀 아쉽다.

그나저나, 앤디 루빈은 1980년도에는 Apple에서도 일을 했었고, 예전에는 Microsoft에서도 일을 했었고, Android OS를 만든 Android 社를 창업했었고, 지금은 Google의 부사장. -_-;; 뭐야 이거, 먼치킨 아냐?

-- 이상한 나라의 종텐.


Rosetta를 소개합니다.

2010/05/28 19:48

안드로이드 NDK를 이용하면 JNI가 가능하긴 하지만, 불편한 것이 한두가지가 아니다. 특히, JNI를 위한 껍데기 코드를 짜는 것에 굉장히 많은 시간이 낭비된다. 그래서, SWIG(Simplified Wrapper and Interface Generator) 같은 대안이 있긴 하지만, SWIG의 C++ to Java, Java to C++ 생성기는 enum을 사용하는데, 안드로이드 개발 가이드라인에서는, 성능 문제로 enum을 사용하지 말라고 권고한다. (실제로 좀 느리기도 하다.)

여러가지 이유로, 혼자 만들어서 안드로이드 NDK가 필요한 프로젝트들에서 사용하던 라이브러리가 있는데, 공개해야지 공개해야지 하다가, 이제서야 좀 가다듬고, NDK r4 가 나온 기념으로, NDK r4 형식으로 말아서 올린다.


http://bitbucket.org/jong10/rosetta 에서 최신버전을 다운받을 수 있으며, Python이 필요하다. 윈도우에서 개발하는 경우는, python이 cygwin 안에 설치되어 있어야 한다. 이 프로젝트를 받으면, 안드로이드 프로젝트 형식인데, 프로젝트 위치에서 ./build_all.sh 을 실행하면, 로제타로 C++과 Java를 위한 껍데기 코드가 자동 생성되고, 그 후에 C++이 NDK를 통해 빌드가 된다. 그 후에 이클립스 등에서 Java를 빌드하고 안드로이드 에뮬레이터나 기기에서 실행하면 된다. JNI 부분이 바뀌지 않고, 로직만 바뀌는 경우는, 기존처럼 ndk-build 를 이용하면 된다. 단지, 자동 생성되는 스텁 코드를 업데이트해야 할 경우만, ./build_all.sh 를 사용한다.

사용할 함수는 rosetta/settings.py 에서 등록해서 쓰면 되며, Java에서 C++ 함수를 호출하거나, C++에서 Java 함수를 호출할 때 필요한 stub code를 자동 생성해준다. 제약사항으로는, 호출 당하는 코드는 Singleton이어야 한다. (좀 큰 제약사항이지만, 이것을 극복하려면, 로제타 자체가 10배는 더 커진다. 인스턴스 관리를 동기화 해야 하므로.). 제약사항이 좀 맘에 안 들지만, 적당히 쓸만한 것 같고, 실제로 약 8개월 이상 진행된 모 통신사의 안드로이드 프로젝트에서, 로제타가 사용되었다.

아, 좀 더 치명적인 단점이 하나 더 있는데, 아직은 배열을 지원하지 않는다. 내가 좀 한가해지면, 지원하게 될 지도 모르지만. -_-;; 마지막으로, 치명적인 버그가 있다면 메일을 보내주시면 감사하고, 버그 패치도 같이 보내주시면 더욱 감사. :-)

-- 이상한 나라의 종텐.

p.s. 조만간, 시간을 내서, 좀 자세한 사용법을 써야겠다.. ㅠㅠ


Android 2.2 Push API (C2DM)

2010/05/28 13:01

Android 2.2 Froyo에는, 아이폰처럼 Push 알림을 위한 API가 추가되었다. Android C2DM(Android Cloud To Device Messaging)이라고 하는데, 아래 링크에 자세한 설명이 있다.

-- 이상한 나라의 종텐.


Bitmap of Android NDK r4

2010/05/27 00:16

Android NDK r4 에는, native 코드에서, Bitmap 을 사용할 수 있는 API가 제공된다.
<ndk>/docs/STABLE-APIS.TXT 에 설명이 있다. 다 좋은데, Android 2.2 Froyo 부터 가능하다. 아놔.

-- 이상한 나라의 종텐.


Android NDK r4

2010/05/26 15:52
안드로이드 NDK r4 가 새로 나왔다. 안드로이드 2.2 SDK와 같이 나온 것 같다. 디렉토리 구조가 또 바뀌었다. -_-;; 좋은 소식은, 이제서야, 안드로이드 프로젝트의 서브 디렉토리로, jni와 관련된 모든 내용이 들어갔고, 프로젝트 디렉토리 안에서 ndk빌드가 가능해졌고, ndk 프로젝트 만드는 방법이 매우 간단해졌고, 아무튼, 짱짱 편해졌다는 것.

안드로이드 NDK는, r1 이 나오기 전 부터.. SDK 1.5 의 특정 디렉토리를 해킹(?)해서 사용해왔는데, 이제서야 좀 구조가 제대로 갖춰진 느낌. 참고로, 어차피 Eclipse에서 안드로이드 개발을 하는 경우면, CDT를 깔고 C/C++ 코딩도 Eclipse에서 하고, 빌드만 콘솔(또는 cygwin)에서 하면 좀 더 편하다.

자세한 내용은, 이쪽으로.. http://developer.android.com/sdk/ndk/

-- 이상한 나라의 종텐.

1번 PC에서 컴파일한 apk를 폰에 올려서 작업하다가, 2번 PC에서 컴파일한 apk를 폰에 올리려고 하니깐, certification 어쩌구 하면서 에러가 난다. 그래서, 그 apk를 uninstall 하고 다시 해보니깐 된다. 여차저차해서 알아보니, signing이 되지 않은 상태의 앱은, PC마다 key가 달라서, 업데이트가 안되는 것 같다.

안드로이드는 uninstall을 할때, 관련된 db를 마이그레이션 하는게 아니고, 모두 지워버리기 때문에, -_-;; 꽤 난감한 시츄에이션. 1번 PC로 컴파일한 녀석을 사용하면, 업그레이드 버전도 모두 1번 PC에서만 컴파일해야 되기 때문이다.

"응? 왜???" 라고 생각되어 찾아보니, Signing Your Applications 라는 글이 있더라. 안드로이드를 여러달 만졌지만, 마켓에 올린 적은 없어서 그냥 배포할때만 쓰는 건 줄 알았는데.. 겸허한 마음가짐으로 찬찬히 읽어보면, Signing을 해야만, 여기서 컴파일하든, 저기서 컴파일하든, 같은 key를 이용할 수 있는 것 같고, 마켓에 올릴 수 있는 것 같다. 별도로 Signing을 하지 않으면, Debug Mode 에서는 기본적으로 각 PC마다 별도의 key가 생성되는데, 이는 임시 키로, 디버깅을 위해서 마련된 key이기 때문에, 해당 apk 파일은 컴파일한 후에 1년간만 사용할 수 있다는 것 같다.

에뮬에 올리는 경우야 어차피, 에뮬 자체를 공유하지 않으니깐 상관 없지만, 폰에 올리면서 여러 PC에서 작업하는 경우는 숙지하고 있어야 하는 것 같다. 배포할때는 물론이고.

아, 주의할 점은, 마켓에 올리지 않고, apk 파일을 직접 돌려서 공유한다고 하더라도, Signing을 하지 않았을 경우에, bin 폴더에 생성되는 apk 파일은, Debug Mode라는 점이다. Ant로 컴파일 할 경우엔, apk 이름에 debug 라는 단어가 붙었던 것으로 기억하는데, 이클립스에서 컴파일 할 때에는, 이런 단어가 붙지 않아서, release 모드로 오해하기 쉽다. (나만 그래? -_-;)

-- 이상한 나라의 종텐.

assert() 작성

2009/08/01 23:09

C언어에는 assert.h 에 정의된, assert()가 있다. 어제, 안드로이드 NDK 1.5를 이용하던 중에, NDK에서 사용된 assert()의 결과가 logcat에 나오질 않아서, 표준출력이 아닌 안드로이드 로그에 내용을 뿌리는 ASSERT()를 새로 만들었다. # 연산자를 이용했다.

// Header
#ifndef NO_ASSERT
	#define ASSERT(e)	((void)0)
#else
	#define ASSERT(e)	((e)?(void)0:_my_assert(#e, __FILE__, __LINE__))
#endif//NO_ASSERT

// Implementation
#include "android/log.h"
void _my_assert(const char* str_exp, const char* file, int line) {
	__android_log_print(ANDROID_LOG_ERROR, "ASSERT FAILED!", "(%s:%d): `%s`", file, line, str_exp);
}

__android_log_print를 실행한 후에, 프로세스를 종료하는 것이 맞겠지만, 아직, NDK쪽에서 프로세스를 종료하는 방법을 알아내질 못했다. libc의 exit()는 에러가 발생한다. 만약, 방법이 없다면, JNI를 이용해서 java.lang.System.exit()를 호출하는 수 밖에 없을지도.

-- 이상한 나라의 종텐.