카테고리 보관물: 쓸모있는 정보

개발자로써 느끼는 안드로이드폰들

1. 갤럭시S

분명 본래는 아이폰4와 경쟁하던 하이엔드 제품이었던것 같은데 어느샌가 극악의 동작환경으로 치부되는 폰이 되어있다. 삼성의 커스터마이징도 문제지만 가장 심각한 문제는 모비낸드를 써서 내장 메모리가 ‘너무’ 느리다는 것. 뭐, 루팅에 테그라크 패치를 하라고? 그건 사용자 입장이고 개발자는 당연히 순정을 가정하고 개발해야지..

메모리가 얼마나 느린지 기본 이클립스 설정으로는 앱을 설치하면서 timeout이 발생해버린다. ADB Connection Timeout 설정을 여유있게 줘야한다.
일단 뭐든 느리기 때문에 Handler로 딜레이를 줘서 실행하게 되는 것들이 많다.
갤S에서 잘 동작하면 대부분 다른 폰에서는 괜찮으므로 테스트용으로 적합하면서도 알수없는 렉이 많이 발생해 테스트폰으로 쓰기 짜증나기도 한다.
또한 개발을 할때는 앱을 수없이 깔아야하는데 앱을 설치하고 삭제하는 시간이 다른폰과 비교되게 느려서 작업효율의 저하가..

프로세서고 RAM이고 GPU고간에 체감 성능엔 스토리지가 중요하다는 것을 일깨워 준다. HDD와 SSD의 차이다.(HDD는 렉도 없다)

 

2. 넥서스원/디자이어

갤S와 비교하면 정말 빠릿하다. 메모리 속도가 빠르니 앱 설치, 삭제에 부담이 없다.
다만…
테스트를 좀하다보면 용량이 부족해서 설치를 할 수 없다고..

터치고자인점도 있지만 무엇보다 내장 용량이 너무 부족해서 흠이다. 마켓에서 기본앱들 업데이트 좀 받고 앱들 몇개만 깔면 끝이다.
기존앱을 덮어서 설치할때는 용량이 더 필요하므로 기존 앱을 지우고 삭제해야된다.
결국 앱 설치, 삭제의 부담이 더 커져있다.
그리고 앱을 몇개밖에 설치하지 못하는 스마트폰이라니.. 인터넷 서핑용 폰인가?
결국 갤스의 모비낸드나 넥원의 원낸드나 심각한 결점들이 있다..

또 디자이어는 2.2 프로요까지만 공식으로 지원해서 매우 실망스럽다. 그마나 제대로된 안드로이드의 시작인 프로요이지만 2.1, 2.2를 지원하려면 구린 것들이 꽤 있다. 2.3부터만 지원하게되면 삶이 꽤 편안해질텐데 실상은 2.1 점유율조차 그렇게 줄어들고 있지를 않다. 2.3 진저브레드 개발자 버전도 꽤 괜찮던데 왜 정식 배포를 안했을지..(특히 내장 메모리가 좀 더 여유있어짐)

그리고 htc 폰들도 은근히 커스터마이징으로 문제가 발생하는 경우들이 있다.

 

3. 옵티머스 시리즈

옵티머스 시리즈는 기본 테스트 폰으로는 사용하지 않고 필요시에만 테스트룸에서 빌려서 사용하는데, 옵티머스 시리즈에서만 문제가 발생하는 경우들이 꽤 있다.
거기다 기종이 너어어어어어무 많다. 거기다 테스트룸에 옵티머스 시리즈가 꽤 있는데도 CS오는 것들은 꼭 없는 기종이더라;

먼저 한가지 괴로웠던 것은 옵티머스에서 몇몇 기종은 앱 내부에서 Exception이 발생하면 앱 강제종료 창을 띄우는 것으로 보인다.
그래서 강제종료 창이 뜨더라도 실제로 앱은 멀쩡하게 돌아가는 경우들이 발생하기도 한다.
원인을 찾느라 꽤 애먹었었다;

그리고 카메라, 오디오 관련해서 스펙을 지키지 않거나 뭔가 구현이 제대로 안되어있는 것들이 있기도 하고
프로요->진저브레드같은 메이저 업데이트 이후에 문제가 많이 있다.

MC사업본부장이 하드웨어가 중요하지 소프트웨어는 금방 따라잡는다고 했던것만봐도 SW는 꽤나 소홀히하고 있다는 생각이 든다.
SW 완성도도 부족하고 OS 업그레이드도 매번 뒤쳐지던데 언제쯤 따라잡을려는 것인지 모르겠다.

개발자들 합숙까지 시킨다던데 회사의 역량내에서 모델을 찍어내는것이 좋지 않을까..

 

4. 넥서스S

레퍼런스폰이기도 하지만 확실히 안드로이드폰의 전환점이 되고 있는 것 같기도 하다. 용량도 넉넉하고 속도도 빠르다.
레퍼런스이니만큼 특별한 문제는 없는데 진저브레드로 넘어가면서 웹뷰나 쿠키관리에서 바뀐 점들이 있어서 문제가 되기도 했다.

싱글코어면서 괜찮은 성능을 내주는 듯

 

5. 갤럭시S2

진정한 하이엔드폰. 나온지도 꽤 되었지만 갤스와는 다르게 여전히 최고의 안드로이드폰이라고 할만하다. LTE폰들은 아직은 스냅드래곤폰들뿐이라 갤2의 엑시노스에 비교하면 버벅거림이 좀 느껴져서..

다만 디자인은 좀 아저씨틱하긴하다(그래도 갤스보단 꽤 고급스러워진듯)

더이상 펜타일이 아닌 아몰레드 디스플레이도 엄청난 발전

 

6. 갤럭시 노트

애매~하다.
핸드폰이라기엔 확실히 좀 큰 감이 있고 펜은 정작 그렇게 자주 쓰지않는 듯 하다.
갑자기 필기를 할 일이 많다면 유용할지도 모르겠다.

해상도가 크기 때문에 앱의 레이아웃이 깨질 수 있다.

그리고 국내 갤노트가 스냅드래곤이라 갤2에 비해 반응속도가 느린감이 있다.

 

7. 갤럭시 넥서스

안드로이드 4.0 ICS를 처음 탑재하고 출시한 폰.
중간에 태블릿 전용 3.0 허니콤이 있었지만 그래도 너무 급진적으로 바뀐것이 아닌가 싶다. (허니콤 망했었고..)
하단의 HW키가 없어지고 SW키로 변경되었는데 Menu키가 사라진것이 매우 어색하고 앱간 전환 버튼이 굳이 따로 있어야하는지 좀 의문.
HW키를 없앤것은 그래도 잘한 것 같다. 제조사별로 레이아웃이 뒤죽박죽이었으니.
Menu키는 구석의 …키로 쓸 수 있는데 ICS의 UX 정책을 잘 이해할 수 없는게 내장된 기본 앱들조차 Menu를 구현하거나 UI상에 Back키를 두거나 하는것이 일관성없이 뒤죽박죽.

어쨌거나 ICS부터는 Menu 버튼이 없다고 생각하고 구현을 하라고 한다.
그리고 ICS가 되면서 내부 API가 바뀌는 것들이 있고 이전과는 다르게 동작하는 것들이 좀 있어서 신경을 쓰게 만드는데 한동안은 ICS 점유율이 낮아서 별로 신경을 안썼었다.
그런데 갤2가 ICS를 지원하면서부터는 ICS도 고려해야하는 상황..

하단의 SW키가 하단바 앱의 경우 터치에 불편을 주기도 하고 어색해보이기도 한다. (안드로이드는 기본적으로 상단바이긴한데 아이폰을 따라서, 또는 터치의 편의성 때문에 하단바 앱들도 있다)
그리고 높은 해상도 역시 고려해야할 사항.

 

8. 갤럭시탭 8.9

갤럭시탭 10.1에선 괜찮은데 8.9에선 이상하게 동작하는 것들이 좀 있는 듯하다.
8.9 시료도 없고 쓰는 사람도 본적이 없어서;

개인적인 바램으론 사람들이 그냥 10.1이나 7을 써줬으면 좋겠다.. 삼성도 7.7, 8.9 이런거 만들지 말아줘.. 크기별로 디바이스 만들지 말아줘..

8.9나 마이너한 장치를 쓰기로 작정했다면 앱호환성에 대해선 기대를 한 수 접는게 좋고 개발자를 욕하기보단 화면 크기만 다를 뿐인데 다르게 동작하게 만든 제조사를 욕해줘..

 

그 외

의외로 듀얼스크린이 있다는 테이크 야누스를 포함한 테이크 시리즈들이나 베가 시리즈 등의 기기로는 CS가 별로 없었던 것 같다.

앱 호환성이 무난하게 괜찮거나 사용자들이 인내하며 쓰고 있거나 사용자들이 워낙 없기 때문이거나..

 

TextView에서 HTML 태그 사용하기

안드로이드에서는 Html.fromHtml()로 TextView에 HTML을 넣는게 가능하다.

TextView tv = (TextView)findViewById(R.id.text);
tv.setText(Html.fromHtml("Text with <br><font color='#ff0000'>Color</font> and <strong>Bold</strong>"));

문자열을 리소스에서 사용하려면 다음처럼 태그를 주의해서 적어야한다.

[strings.xml]

<string name="html_string">Text with &lt;br&gt;&lt;font color=\'#ff0000\'&gt;Color&lt;/font&gt; and &lt;b&gt;Bold&lt;/b&gt;</string>

[TestActivity.java]

TextView tv = (TextView)findViewById(R.id.text);
tv.setText(Html.fromHtml(getResources().getString(R.string.html_string)));

여러 process에서 CookieSyncManager를 사용할 경우 DB error

Application에서 CookieSyncManager, CookieManager를 생성하게끔 되어 있었는데 Service, IntentService 등을 사용하게 되면서 아래와 같은 에러가 자주 발생하였습니다.

01-13 16:44:46.674: E/Database(4298): CREATE TABLE android_metadata failed
01-13 16:44:46.690: E/Database(4298): Failed to setLocale() when constructing, closing the database
01-13 16:44:46.690: E/Database(4298): android.database.sqlite.SQLiteException: database is locked
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2113)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1966)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:887)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:965)
01-13 16:44:46.690: E/Database(4298): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:958)
01-13 16:44:46.690: E/Database(4298): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:576)
01-13 16:44:46.690: E/Database(4298): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
01-13 16:44:46.690: E/Database(4298): at android.webkit.WebViewDatabase.getInstance(WebViewDatabase.java:214)
01-13 16:44:46.690: E/Database(4298): at android.webkit.WebSyncManager.(WebSyncManager.java:65)
01-13 16:44:46.690: E/Database(4298): at android.webkit.CookieSyncManager.(CookieSyncManager.java:69)
01-13 16:44:46.690: E/Database(4298): at android.webkit.CookieSyncManager.createInstance(CookieSyncManager.java:96)

이런 에러가 발생한 이유는 여러개의 process에서 CookieSyncManager.createInstance()를 하면서 내부의 DB를 create하는데 이 DB는 multi-process를 지원하지 않기 때문으로 보입니다.

여러 프로세스에서 CookieSyncManager를 사용할 수 있는 방법은 찾지못하였고 메인 앱에서만 CookieSyncManager를 사용하는 식으로 해결하였습니다.

테스트해본 결과 한 프로세스에서 createInstance()를 한 후에 다른 프로세스에서는 getInstance()로 가져올 수는 없었습니다.
그리고 참고로 CookieSyncManager를 생성하지 못하면 CookieManager도 사용할 수 없습니다.

XCode 4에서 NSZombieEnabled, NSDebugEnabled 설정 사용하기

NSZombieEnabled는 메모리를 해제하는 대신 NSZombie로 둠으로써 EXC_BAD_ACCESS같은 문제를 해결할 때 도움을 줍니다.

XCode 3에서는 Executables에서 프로젝트의 executable에 오른쪽 버튼으로 Get Info를 해서 Arguments의 Variables to be set in the environment에 NSZombieEnabled라는 variable을 추가하고 값을 YES로 해주면 활성화가 됩니다. (참조)

XCode 4에서는 Products에서 오른쪽 클릭을 해봐도 Get Info가 없는 것을 알 수 있습니다.
위에 메뉴를 보면 Product가 있는데 여기서 Edit Scheme에 들어가도록 합시다.

이제 여기서 Arguments에서 Environment Variables에 NSZombieEnabled, NSDebugEnabled와 같은 속성을 추가하면 됩니다.

또 다른 방법은 Diagnostics에서 옵션을 활성화해 줄 수도 있습니다.

다른 옵션들은 잘 모르겠는데 디버깅에 도움이 되는 옵션들로 보여집니다.

EditText에서 키 이벤트 처리

EditText에서는 OnKeyListener로 back키나 Enter키 입력은 받을 수 있는데
문자열같은 일반적인 키입력은 이벤트로 넘어오지 않습니다.

이런 이벤트를 받으려면 TextWatcher라는 것을 써야하더군요.

간단히 TextWatcher를 구현해서 EditText에 addTextChangedListener()를 해주면 됩니다.

TextWatcher textWatcher = new TextWatcher() {

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
		// 텍스트가 변경되기전 입력한 내용에 대해
		// s는 변경할 수 없음
	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		// 텍스트를 변경된 후 변경 사항과 함께
		// s는 변경할 수 없음
	}

	@Override
	public void afterTextChanged(Editable s) {
		 // 텍스트가 변경된 후. 변경 사항은 알 수 없음
		// s는 변경 가능. 하지만 위 함수들이 다시 콜백됨을 유의
	}

};

editText.addTextChangedListener(textWatcher); // EditText인 editText에 textWatcher를 핸들러로 등록