android

때로는 과감히 소스를 까보자

대략 3년 전쯤, 잠시 내 손을 떠났던 프로젝트의 코드를 수정하는 동료가 기존에 (아마도) RadioButton으로 구현했던 Tab 버튼영역 UI를 TabLayout을 사용해 구현하는 방식으로 바꾸면서 각 탭 버튼들의 폭이 디바이스에 따라 다르게 그려지는 현상이 나타난다며 도움을 요청해왔다. 화면 디자인상 Tab은 통짜 이미지를 슬라이스해서 버튼을 만들고, 항상 가로를 가득 채우도록 확대/축소 되는 식이어서 정확히 지정된 폭으로 그려지지 않으면 […]

때로는 과감히 소스를 까보자 Read More »

Android에서 Base64 URL safe encode

Base64로 인코딩된 문자열을 URL에 담아서보내는 경우가 있다. 이 때 URL에서 사용되는 +, / 문자를 -, _로 치환시키는 등의 처리를 하게 되는데 이런 방식이 Base64 URL Encoding이다. Java에서는 Java 8부터 API로 제공된다. https://docs.oracle.com/javase/8/docs/api/java/util/Base64.html java.util.Base64 클래스 getUrlEncoder() 메서드를 호출해서 Base64.Encoder 객체를 가져오는 방법으로 사용한다. 안드로이드에서는 API 26부터 지원된다. https://developer.android.com/reference/java/util/Base64.html 그렇다면 min sdk 버전이 26 미만이면 외부 라이브러리를

Android에서 Base64 URL safe encode Read More »

RadioGroup의 생소한 동작

  RadioGroup에서 처음 check를 호출하면 onCheckedChanged가 두 번 연속 호출되는 현상이 나타남. 동일 현상에 대한 SO 답변 소스코드를 보면 그렇게 동작하도록 되어있다고 함 http://www.grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/widget/RadioGroup.java#RadioGroup.check%28int%29 실제로 따라가보니 리스너가 두 번 호출되는 플로우를 타고 있다. 의도대로 동작하게 하려면 RadioGroup이 아니라 RadioButton의 setchecked를 쓰라고 한다. V에서 click 이벤트 발생 -> P에서 처리 -> P가 V를 업데이트 (click 한

RadioGroup의 생소한 동작 Read More »

Associate Android Developer 응시 후기

Update 2017-03-25: 합격 통보 받았다. 합격 후기 Update 2017-03-21: 조금 전에 리뷰가 통과되었다는 메일을 받았다. 이제 exit interview만 남았다. 3월 14일에 구글 개발자 블로그에 Associate Android Developer 인증 프로그램에 관한 포스트가 올라왔다. 작년에 소개 영상을 보기는 했는데 그동안 완전히 잊고 있다가 이 포스트를 보고 생각이 났다. 사실 이쪽 업계 종사자들은 대체로 자격증을 포함한 각종 능력평가를

Associate Android Developer 응시 후기 Read More »

안드로이드 스튜디오 타겟 전환 단축키

어느 날 Tip of the day에서 실행 타겟을 바꾸는 단축키를 봤다가 유용한 것 같아서 기억해둬야지 했는데 며칠 새 잊어버렸다. Tip of the day를 다시 열어서 아무리 next를 눌러도 안나오고, 인터넷에서 android studio shortcut 등으로 아무리 검색해도 나오지 않아서 좌절. 그런데 디버깅하다가 우연히 다시 발견하게 되었다. Ctrl+Alt+R 원래는 breakpoint에서 Cmd+Alt+R을 눌러서 계속 진행하려고 했는데 손가락이 살짝

안드로이드 스튜디오 타겟 전환 단축키 Read More »

Android NDK로 3rd party 라이브러리 빌드하기

NDK를 사용하는 프로젝트에서 여러 개의 네이티브 라이브러리가 필요한 경우가 있다. 처음에는 jni/  하위 디렉토리에 라이브러리 소스코드를 전부 받아두고 Android.mk 파일을 적절히 구성해서 한번에 빌드해보려고 시도했었다. jni/ Android.mk (project source code…) libraryA/ Android.mk (library a source code…) libraryB/ Android.mk (library b source code…) jni/Android.mk 는 하위 디렉토리를 탐색하고, jni/libraryA/Android.mk 와 jni/libraryB/Android.mk 는 그 디렉토리의 Makefile을 바탕으로 빌드(make)를 실행하면 되지

Android NDK로 3rd party 라이브러리 빌드하기 Read More »

Android Studio에서 JNI 빌드하기

우선, https://codelabs.developers.google.com/codelabs/android-studio-jni 여기에 속아선 안된다! 아직 Android Studio에서는 공식적으로 지원하지 않는 것으로 생각하는 게 정신건강에 좋다. 오로지 android ndk를 위해서만 작성한 코드만 있다면 상관없지만, 3rd party 라이브러리같은 걸 Android Studio에서 소스 컴파일 해서 사용하는 것은 불가능하다. gradle 파일에 task를 추가하는 식으로 사용하는 것이 가장 효과적이다. 이 포스팅에서는 다음과 같은 방식을 추천한다. 디렉토리 구조 my_project/ my_module/

Android Studio에서 JNI 빌드하기 Read More »

gradle.properties 파일을 지역적으로 관리하기

각종 빌드 옵션이나 외부 프로젝트 경로를 gradle.properties 파일에 설정해두고 build.gradle에서 이를 참조하도록 설정하면 빌드를 관리하기가 편하다. 그러나 여러 명이 다양한 환경에서 개발하게될 경우, gradle.properties 파일이 버전관리 시스템에 들어가면 매우 불편한 상황이 생긴다. 2명의 개발자가 어떤 외부 라이브러리 프로젝트를 참조하기 위해 ext_lib_path라는 property를 아래와 같이 설정해두고 작업을 한다고 가정해보자. 개발자1: ext_lib_path=C:\Users\dev1\Libraries\ext_lib 개발자2: ext_lib_path=/home/dev2/libs/ext_lib 라이브러리의 위치는 물론

gradle.properties 파일을 지역적으로 관리하기 Read More »

BroadcastReceiver 사용 시 유의점

BroadcastReceiver는 onReceive가 처리되는 동안만 존재한다. 즉, onReceive()가 처리되는 도중에 또다시 같은 인스턴스의 onReceive()가 호출되지는 않는다. 매번 새로운 인스턴스가 생성된다. 비동기처리를 통해 결과를 가져오는 작업을 못함 비동기처리가 진행되는 도중 onReceive가 리턴하고나면 BroadcastReceiver 인스턴스는 이미 invalid 상태 API 11부터는 goAsync()를 통해 가능하긴 하다. PendingResult를 가지고 있다가 다 완료되면 PendingResult.finish()를 호출해서 종료 다이얼로그 같은 거 못 띄움 NotificationManager

BroadcastReceiver 사용 시 유의점 Read More »

adb를 통해서 임의의 인텐트 시작하기

커스텀 URL을 처리하거나 기타 암묵적(implicit) 인텐트를 처리하는 기능을 구현할 때 adb를 통해서 인텐트를 발생시키면 편리하게 테스트할 수 있다. 아래와 같은 형식으로 실행하면 된다. adb shell am start -a <action> -d <data> 예시 adb shell am start -a android.intent.action.VIEW -d http://www.example.com  

adb를 통해서 임의의 인텐트 시작하기 Read More »