관계, Networking 그리고 Programming 46

롤리팝에서 애드몹 크래쉬.

얼마전 발생한 버그 수정 이야기 하나. 주말이면 집에서 쉬지만, 구글 개발자 콘솔에 들어가 어플들의 현 상태를 둘러보는 것은 매일 쉬지 않는다. 지난 토요일, 집에서 느긋하게 커피를 한잔 마시면서 순위라던가 별점들을 살펴보는데, 앗 버그를 호소하는 사용자분의 댓글이 하나! Mint T Wallet의 무료버전에 달린 댓글로, 넥서스 7 안드로이드 5.0.1을 사용하시는데 우리어플이 열리지 않는다는 내용이었다. 우리가 넥서스 7 시료를 가지고 있긴한데, 최근에 있었던 어플 업데이트 이후에 안드로이드를 업데이트 했더랬다. 마침 동일한 환경의 시료가 있으니 테스트 가능. 실행을 해보니, 어라 진짜 죽네???!!! 다른 문제가 있는 것이 아니라 무료 버전에 삽입되어 있는 애드몹 광고 부분에서 로드를 하다가 죽는다..

재미있는 에러 하나. Spinner의 높이가 제대로 안 잡히네.

금 주에는 Mint T Wallet 의 업데이트를 위해 가열차게 달리는 중. 수정 중 다이얼로그에 Spinner를 하나 추가 할 일이 생겨서 테스트를 하는데 곤란한 일이 발생했다. Spinner의 목록이 제법 긴 편인데, dropdown 리스트의 아래쪽 부분이 안드로이드 OS에서 사용하는 메뉴바에 가려서 보이지 않는다. 그러니까 요렇게 화면을 full로 사용하는 단말에서는 문제가 안되는데, 요렇게 화면 아래 부분을 home key등 메뉴로 사용하는 넥서스 같은 단말에서는 Spinner가 이 메뉴에 가려버려서 문제가 된다. 더 이상한 건 어쩔 땐 이슈가 발생하고 어쩔 땐 이슈가 발생하지 않더라는 것. 테스트를 좀 더 해보니, 키패드가 떠 있는 상태에서 바로 Spinner가 있는 다이얼로그가 뜨면 이슈가 생..

아으나저으어으익!!!!!!!!!!!!!

이 바쁜 시기에 무려 2일을 낭비함. 아 놔. 다음 프로젝트를 위해 현재 Goole API와 연동할 일이 생겼는데... 샘플을 고대로 가져다 놨건만 계속 인증 오류가 뜨는 것이다. 대충 요러케 생긴... com.google.android.gms.auth.GoogleAuthException: Unknown 아 왜. 아 왜. 아 왜에~~~!!!샘플 다운로드 받고, Google API 홈페이지에 안내 나온대로 열심히 credential로 들어가 client ID도 만들었건만 계속해서 저노무 오류만 뜬다. 마음에 찝찝한 것 하나는 client ID를 만들 때 넣은 SHA1 Fingerprint가 자꾸 입력한 값이 그대로 나오지 않고 모두 lowercase로 되어 나온다는 것이 있긴 했으나, 홈페이지에서 알아서 ..

GridView와 ViewHolder

아오 마음 속 깊은 곳으로부터의 빡침을 느끼며... 나 이런 험한 말 자꾸 쓰면 안되는데, 쓸데없는 삽질을 연 이틀 하고 나니 마음에서 욕이 우러나옴...-_- 으아랏!!! 현재 개발 중인 프로그램 내에 GridView를 사용할 일이 생겼다. 음 일반적으로 리사이클을 위해 사용하는 ViewHolder 형식을 활용했다. 그런데 이노무 것이. 자꾸 첫 번째 칸이 안 나와. 왜. 어째서. 와이. 나니데. 나제. 왓. 시험 삼아 ViewHolder 재활용을 안 하고 매번 new로 만들어주니 문제가 생기지 않는다. 그러니까 ViewHolder 재활용 중에 생기는 문제란 말이지. 근데 어째서 생기는 거냐고. 크흡. 구글링을 시작했는데, 비슷한 질문이 가끔 보인다. 그런데 뭔가 명확한 답이 없다. 그러던 중 어떤 답..

NDK를 활용, 라이브러리 만들기 2 : 기본적인 동작 테스트

NDK를 위한 환경을 구성했으니, 아주 간단한 라이브러리를 만들어 동작을 테스트해 보기로 한다. 0. Base : 기본적으로 이클립스로 안드로이드 개발을 진행 중이며, 안드로이드 JNI 빌드를 위해 cygwin과 NDK를 환경을 구성했다. 1. 프로젝트 만들기. JNI를 테스트 해 볼 안드로이드 프로젝트를 만들어보자. JNI를 사용하지 않을 때와 별다를 것이 없으므로 안드로이드 프로젝트 생성에 대해서는 따로 설명을 적지 않는다. 안드로이드 JNI 빌드를 검색해 보면서 ndk 루트 폴더 안에 프로젝트 폴더를 위치 시키라는 내용을 반복해서 봤는데, 왜 그런지는 모르겠다. 특별한 이유를 검색하지 못해서 그냥 기존에 안드로이드 프로젝트를 위해 사용하던 workspace 폴더를 사용했고, 결과적으로는 기본적인 빌..

NDK를 활용, 라이브러리 만들기 1 : 환경 설정

나중에라도 잊어버리면 다시 찾아봐야지, 하고 진행한 절차를 적어둔다. 0. Base : 기본적으로 java와 이클립스, 안드로이드 SDK가 깔려 있고, 안드로이드 개발을 진행하던 중이었음. 1. Java path 등록 확인. JNI 개발을 위해 javah를 동작시키기 위해서는 환경 변수에 내 java 환경 path가 잘 등록 되어 있는지 먼저 확인해 두어야 함. 1.1 환경 변수를 열어서 JAVA_HOME을 등록 변수이름 : JAVA_HOME변수 값 : 자신의 자바 환경 나의 경우 "C:\Program Files\Java\jdk1.6.0_22" 1.2 CLASSPATH 등록 변수이름 : CLASSPATH변수 값 : .;%JAVA_HOME%\lib\tools.jar 1.3 path에 Java bin 폴더 ..

프로가드로 빌드한 앱 에러시 에러 위치 확인

사용자가 많아지면서 몇 건의 버그가 발생하였음. 지금까지는 함수 위치만 봐도 딱 알만한 재현경로였기 때문에 별 문제가 없었으나, 이번 건에서는 함수 내의 어떤 곳에서 NullPointerException이 발생하였는지 모르는 사태가 발생함. 아마도 다른 activity를 띄운 사이 아래쪽 activity가 내려가버려 문제가 발생한 듯... 하지만 재현경로는 없는 상황. 아이코? 에러가 발생한 소스 줄 번호가 안나오네? 뭐 일단 해당 함수에서 사용하는 변수들에 모두 예외처리를 하긴하였으나, 이번 함수는 짧았기에 망정이지. 버그 스택Caused by: java.lang.NullPointerExceptionat com.softseed.free.minttwallet.MainActivity.f(Unknown So..

Missing SDK Platform Android, API 19

2013년에 두 개의 앱을 내놓고, 12월을 맞이하였음. 쉬어가는 12월~ 다음 앱을 준비하면서 새로 나온 안드로이드 버전인 킷캣 SDK를 다운 받음. 킷캣이라는 4.4 버전을 내놓은 안드로이드. 이번 버전은 API 레벨 19인 녀석이다. Android SDK Manager를 열어 보니 음~ 어쩌고 저쩌고 4.4.2 (API19) 요녀석이 보이는 군. 음? 근데 뭔가 항목이 마이 부족하다? 일단 API19 라고 이름붙은 두 녀석을 체크하고 install 버튼을 클릭 클릭~ 하고 나니 다음과 같은 문구가 보이면서 설치가 진행되지 않는다. Missing SDK Platform Android, API 19 옹? 요거슨 무엇? 검색을 해보니 Android SDK Manager에서 "Tools > Clear ca..

setLayoutParams 에러

응홍홍홍... SlidingDrawer를 구현해 놓은 화면에서 가로모드 진입 시 이 drawer가 화면을 덮어버리는 문제를 방지하고자 onConfigurationChanged 함수에서 setLayoutParams을 다시 해주는 간단한 코드를 구현했다. 간단해.. 간단한거 아님...? 이라고 생각했는데 테스트하려 화면을 돌려보니 에러 발생. 으엥. java.lang.ClassCastException android.view.viewgroup.$layoutParam .......블라블라... 라는 에러 메시지를 로그 상에 토해 놓았다. 하하하하하... 아 뭐... 쫌 간단히 좀 가자 좀... 이놈아 나 오늘 기운 없다고!!! 라고 해봐야 이클립스가 알아 줄리 만무...그래.. 수정해야지 뭐. 이슈가 발생한 코..

File을 만들었는데, file not found라니?

오늘 오전 쓸데없이 두 시간쯤 허비하게 만들었던 에러. 파일을 만들고 이 파일에 write를 시도하니 file not found 에러가 발생한다. 대략 소스는 다음과 같았다. sendFile = new File(Environment.getExternalStorageDirectory() + File.separator + getPackageName() + File.separator + "Export/test.txt"); 외부 저장 매체 경로를 찾아, 내 프로그램명으로 폴더를 생성하고, 다시 export라는 폴더를 생성해서 그 아래에 test.txt라는 파일을 생성한 것이다. 자, 이 소스의 바로 아래에서 다음과 같이 file output stream을 만들라치면 sendFile에 대해 "file not fo..