android

[Kotlin] 객체 할당 없는 for loop

Kotlin에서는 배열이나 컬렉션을 다룰 때 forEach, forEachIndexed, map 등을 통해 내부 항목들을 접근해서 연산을 수행할 수 있다. 이러한 함수들은 인덱스를 직접 관리할 필요가 없어서 편리하긴 하지만, Range나 Iterator같은 부가적인 객체를 생성한다는 단점이 있다. 대부분의 경우에는 객체 한두개 정도 추가 할당하는 것이 큰 문제가 되지 않겠지만, 안드로이드에서 View 클래스의 onDraw 메서드를 오버라이드할 때에는 메서드 내에서 새로운 …

[Kotlin] 객체 할당 없는 for loop Read More »

Check App Standby Bucket using ADB command

A new power management feature called App Standby Bucket has beed added in Android 9(Pie).(https://developer.android.com/about/versions/pie/power) App Standby Bucket allows Android system to categorize priorities of apps in 5 buckets as follows; Active Working set Frequent Rare Never Apps go into one of those buckets according to how actively they are used. An important thing to …

Check App Standby Bucket using ADB command Read More »

ADB로 App Standby Bucket 확인하기

안드로이드 9부터는 App Standby Bucket이라는 전원 관리 기능이 추가되었다.(https://developer.android.com/about/versions/pie/power) App Standby Bucket이란 안드로이드 시스템이 앱을 처리하는 우선순위를 아래와 같이 크게 다섯 가지로 분류하는 기능이다. Active Working set Frequent Rare Never 사용자가 앱을 얼마나 자주 사용하는지에 따라 각 버킷으로 이동하게 되며 정확한 기준은 (어뷰징을 생각한다면 당연히) 알려져있지 않다. 한 가지 주의할 부분은 앱이 어느 버킷에 있느냐에 …

ADB로 App Standby Bucket 확인하기 Read More »

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

대략 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 »