HOME > android

안드로이드 - MediaStore(Media Provider)에 파일 저장하는 방법

Media provider는 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더입니다. Scoped Storage가 적용되면서 미디어 데이터를 저장할 때는 MediaStore를 이용하기를 권장하고 있습니다. P와 Q에서 MediaStore에 데이터를 저장하는 방법을 알아보고, 차이점을 알아보겠습니다.

19 Oct 2019

안드로이드 - MediaStore(Media Provider)에서 미디어 파일 정보 읽기

Media provider는 단말에 저장된 이미지, 동영상, 오디오 파일의 정보를 제공하는 프로바이더입니다. MediaStore는 앱이 Media provider가 제공하는 파일들을 접근할 수 있도록 도와주는 API들의 묶음입니다. MediaStore의 API들이 어떤 의미인지 이해하고, 그 API를 통해 Media provider에 쿼리를 하여 데이터를 얻으면 됩니다.

19 Oct 2019

안드로이드 - CTS(Compatibility Test Suite) 테스트하는 방법

Android CTS는 Compatibility Test Suite의 약자입니다. CTS는 안드로이드의 호환성 테스트로, 제조사에서 안드로이드 단말을 만들면 CTS 테스트를 통과해야 판매를 할 수 있습니다. CTS는 안드로이드의 파편화를 어느정도 막아주며, 테스트 코드에서 요구하는 성능을 충족시키도록 합니다.

16 Oct 2019

안드로이드 - Clean Architecture 연습하기

평소에 코드의 가독성을 향상시켜주고, Boilerplate 코드를 줄여주며, 유지보수가 쉽게 만들어주는 기술들을 배우려고 노력했습니다. Fernando님의 블로그를 보면서 공부하는데 도움이 되었습니다. 샘플앱은 MVVM, FP, Dagger2, AAC 등의 기술을 사용합니다. 그리고 확장성, 모듈화, 테스트 가능한 코드를 만드는데 좋은 구조를 알려줍니다.

13 Oct 2019

안드로이드 - Parcelable을 구현하여 Intent로 데이터를 전달하는 방법

Parcel은 추상화된 객체로 데이터와 객체를 갖고 있는 컨테이너입니다. 프로세스간 데이터를 전달하려면 클래스에 Parcelable을 구현해야 합니다. 안드로이드는 내부적으로 Parcel 객체를 marshall/unmarshall을 수행하여 다른 프로세스에 전달해 줍니다. Parcelable을 구현했다면 인텐트를 통해 다른 프로세스로 전달할 수 있습니다.

09 Oct 2019

안드로이드 - Cleartext HTTP ... not permitted 예외 해결 방법

Exoplayer에서 Http의 mp3파일을 스트리밍하려고 했는데, Cleartext HTTP traffic to www.soundhelix.com not permitted와 같은 에러를 만났습니다. 원인은 Android Pie부터 Http 접근을 허용하지 않기 때문입니다. usesCleartextTraffic=true로 설정하면 Http 접근이 허용 됩니다.

06 Oct 2019

안드로이드 빌드 에러 - Calls to Java default methods are prohibited in JVM target 1.6

안드로이드 스튜디오를 코틀린 코드를 빌드하면서 아래와 같은 에러를 만났습니다. calls to Java default methods are prohibited in JVM target 1.6. Recompile with -jvm-target 1.8. build.gradle에서 java 버전을 변경하면 에러가 해결됩니다.

06 Oct 2019

안드로이드 - systrace로 성능 분석하는 방법

안드로이드의 systrace는 시스템 성능을 분석하기 위한 툴입니다. 안드로이드 플랫폼에는 atrace라는 모듈이 있는데, systrace는 이 모듈에 trace를 추출하도록 요청합니다. 파일로 trace가 추출되면, Chrome 브라우저에서 결과를 확인할 수 있습니다.

06 Oct 2019

Android - File-Based Encryption과 Direct Boot

Encryption은 데이터를 암호화하는 과정을 말합니다. Full-Disk Encryption, File-Based Encryption가 있습니다. Direct Boot는 File-Based Encryption에 실행되는 앱을 지원하기 위한 정책입니다. Encryption와 Direct Boot에 대해서 알아보겠습니다.

05 Oct 2019

안드로이드 boot.img의 커널과 램디스크를 수정하는 방법

unpackbootimg와 mkbootimg를 이용하여 boot.img의 kernel 및 ramdisk를 수정할 수 있습니다. 디바이스에서 boot.img를 받고, 커널과 램디스크 영역을 수정하여 디바이스에 flash하는 방법을 정리하였습니다.

18 Aug 2019

안드로이드 UIAutomator로 UI 테스트, 가장 쉽고 빠른 가이드

UIAutomator는 UI를 테스트하는 라이브러리입니다. UIAutomator는 블랙박스 테스팅이며, 두개 이상의 앱을 함께 테스트할 수 있습니다. UiDevice, Until, By, BySelector 클래스를 지원하며 이 클래스들로 테스트 코드를 작성할 수 있습니다.

15 Aug 2019

삼성 안드로이드 오딘(Odin), Linux, Windows 실행 파일 다운로드

오딘(Odin)은 삼성 갤럭시 폰에 펌웨어 바이너리를 다운로드하는 툴입니다. 안드로이드 디바이스의 내부 스토리지는 몇몇 파티션으로 나누어져 있고, 펌웨어 바이너리에서 해당 파티션에 맞는 파일을 알아서 flash해줍니다. Linux, Windows 실행 파일을 다운로드 할 수 있습니다.

11 Aug 2019

안드로이드 - UsageStatsManager로 앱 실행 기록 가져오기

UsageStatsManager는 앱 실행 기록을 제공하는 서비스입니다. 앱 기록을 Query할 수 있는 API를 제공하며, DAY, MONTH, YEAR의 시간 단위(Interval)로 구분된 결과를 받을 수 있습니다. 이것은 android.permission.PACKAGE_USAGE_STATS 권한을 요구합니다.

09 Aug 2019

안드로이드 - UID(User Id), GID(Group Id)와 Security

Android는 리눅스의 UID(User Id)와 GID(Group Id)를 사용하여 앱마다 다르게 권한을 설정합니다. 앱이 어떻게 UID와 GID를 할당받는지 알아보고, 권한을 어떻게 확인하는지 알아보겠습니다. 또한 보안 측면에서 어떻게 사용되는지 알아보겠습니다.

07 Aug 2019

안드로이드 - 코드로 앱(apk) 설치, 삭제하는 방법

안드로이드에서 코드로 앱(apk) 설치 및 삭제하는 방법을 설명합니다. 앱은 Google PackageInstaller에게 앱을 삭제하거나 설치하도록 요청할 수 있습니다. 설치 요청하려면 REQUEST_INSTALL_PACKAGES 권한이 있어야 하고, 삭제를 요청하려면 REQUEST_DELETE_PACKAGES 권한이 필요합니다.

02 Aug 2019

안드로이드 Q - Thermal API로 발열 상태 모니터링

Android Q에서 디바이스의 발열 상태(Thermal status change)를 알 수 있는 API를 제공합니다. 발열 상태는 THERMAL_STATUS_NONE, THERMAL_STATUS_LIGHT 등 총 7개입니다. 리스너는 addThermalStatusListener로 등록하며 인자로 OnThermalStatusChangedListener 객체를 전달해야 합니다.

30 Jul 2019

안드로이드 - Assets에서 파일을 읽는 방법

Assets은 이미지, String이 아닌 파일 등을 apk에 저장하고 앱에서 읽을 때 사용할 수 있습니다. Assets을 사용하려면 Assets 폴더를 만들고 파일을 저장해야 합니다. 그리고 AssetManager를 통해 파일을 읽어와야 합니다. 이 글에서 Assets 폴더를 만들고 AssetManager로 파일을 읽는 방법에 대해서 알아봅니다.

28 Jul 2019

안드로이드 Drawable을 Bitmap으로, Bitmap을 Drawable로 변경하는 방법

Drawable을 Bitmap으로 변경하는 방법 및 Bitmap을 Drawable로 변환하는 방법을 소개합니다. 또한 AdaptiveIconDrawable을 Bitmap으로 변환하는 방법을 알아봅니다. 안드로이드의 리소스들은 기본적으로 Drawable로 가져옵니다. 하지만 간혹 코딩을 하다보면 Bitmap을 인자로 받는 애들이 있고, 이 때문에 변환이 필요합니다.

28 Jul 2019

안드로이드의 다양한 Notification 종류와 구현 방법

Android의 다양한 Notification 종류와 구현 방법에 대해서 정리하였습니다. 먼저 Notification Channel을 등록해야 하고, Notification은 BigText, BigPicture, Inbox, Messaging, Media Style 등으로 구현할 수 있습니다. 또한 Head Up으로 화면에 띄우거나, Reply 버튼을 추가할 수도 있습니다.

27 Jul 2019

안드로이드 Q - 저장소(Storage)의 크기 및 여유 공간 가져오기

fstatvfs 또는 statfs 등을 사용하면 파일 또는 폴더의 크기를 알 수 있습니다. 하지만 안드로이드 Q부터 새로운 외부 저장소 정책 Scoped Storage이 적용되기 때문에 Storage Access Framework를 통해서 파일에 대한 접근권한을 얻어야 합니다.

21 Jul 2019

안드로이드 - JSON을 파싱하는 방법

Android에서 JSONObject로 JSON(JavaScript Object Notation)을 파싱하는 방법에 대해서 정리하였습니다. JSON은 Object, Array, Key-Value 타입으로 이루어져 있으며 Value는 String, Int, Long, Boolean 등의 타입을 지원합니다.

21 Jul 2019

안드로이드 스튜디오에서 Adaptive, 일반 아이콘 만들기

안드로이드 스튜디오에서 아이콘을 쉽게 만들 수 있는 Image Asset Studio를 제공합니다. 이것을 이용하면 Adaptive 아이콘 및 일반 아이콘을 쉽게 만들 수 있습니다. 또한 플레이스토어에 앱을 등록할 때 필요한 512x512 사이즈의 이미지도 생성됩니다.

20 Jul 2019

안드로이드 - invalid channel for service notificaiton 에러 해결 방법

Android에서 startForeground()로 bacground 서비스를 foreground로 변경할 때 발생하는 "invalid channel for service notification" 에러 해결 방법입니다. 안드로이드 O부터 노티피케이션을 등록할 때 ChannelId를 먼저 등록해야 합니다.

20 Jul 2019

안드로이드 Q - Background Activity 실행 제한

구글은 Q에서 사용자와 상호작용하지 않는 앱이 백그라운드에서 액티비티를 실행하지 못하도록 제한하였습니다. 백그라운드에서 액티비티를 실행해야 하면 노티피케이션으로 사용자에게 알림을 주어 실행하도록 할 수 있습니다. 자신의 앱이 백그라운드에서 액티비티를 실행시킨다면 새로운 정책에 맞게 수정이 되어야 합니다.

19 Jul 2019

안드로이드 앱이 32/64bit 기기에서 동작하도록 만들기

최근 구글 플레이스토어는 64비트를 지원하는 앱만 등록되도록 정책을 변경하였습니다. Analyze APK를 이용하여 앱이 32 또는 64비트를 지원하는지 확인하고, 64비트를 지원할 수 있게 만드는 방법을 설명합니다. 또한, abilist 프로퍼티를 확인하여 디바이스가 어떤 아키텍처를 지원하는지 확인하는 방법을 소개합니다.

05 Jul 2019

안드로이드 스튜디오에서 so 라이브러리를 추가하는 방법

Android Studio 프로젝트에 네이티브 라이브러리인 so 라이브러리를 추가하는 방법과, Apk에 라이브러리가 포함되었는지 확인하는 방법을 알아보겠습니다. 프로젝트에 포함시키려면 jniLibs 폴더 아래에 armeabi-v7a, arm64-v8a 등, 아키텍처별로 폴더를 만들고 so 라이브러리 파일을 넣어야 합니다.

04 Jul 2019

Android App Bundle로 Apk 크기를 더 작게 만들기

안드로이드 앱 번들은 Apk의 사이즈를 줄이기 위한 목적으로 P에서 소개되었습니다. 앱 번들은 리소스를 분할하여 필요한 것만 전달하는 기술입니다. 앱 번들의 구조와 동작 원리에 대해서 알아보고, 기반 기술인 Split apk, Dynamic delivery, Dynamic feature에 대해서 알아보겠습니다.

09 Jun 2019

안드로이드 Q - Background Location 권한 제한

개인정보 강화를 위해 Q에서 위치 권한을 세분화하였습니다. 사용자는 앱이 위치 정보를 Foreground 또는 Background에서만 사용하도록 제한할 수 있습니다. 그래서 앱이 실행되지 않으면 위치 정보를 얻지 못할 수 있습니다. 새로운 정책에 대해서 기존 앱은 어떻게 대응을 해야 하는지 설명하였습니다.

09 Jun 2019

안드로이드 Q - 새로운 저장소 정책, Scoped Storage 알아보기

Q에서 외부 저장소를 다루는 새로운 정책 Scoped Storage가 소개되었습니다. 이전과 가장 큰 차이점은 SAF(Storage Access Framework)를 사용하도록 강제하는 부분입니다. SAF를 통해서 디바이스가 사용자의 모든 파일을 알지 못하게 하고 필요한 파일만 접근 권한을 부여하도록 만들었습니다. 구글의 이런 정책은 보안을 향상시키기 위한 목적입니다.

08 Jun 2019

안드로이드 Q - Settings Pannel에 대해서 알아보기

세팅 패널(Settings Pannel)은 3rd party 앱에서 직접 세팅의 UI를 패널로 띄우는 기능입니다. 패널로 띄우면 자신의 앱을 가리지 않기 때문에 불필요한 앱 전환이 필요없습니다. 세팅 패널은 4개의 설정을 지원합니다.(Internet, Wifi, NFC, Volume)

01 Jun 2019

안드로이드 Q - Mainline, APEX에 대해서 알아보기

Android Q의 Mainline과 APEX는 부분적으로 시스템 업데이트를 할 수 있도록 만들어줍니다. Treble이 OS 업그레이드 속도를 높이는데 도움이 되었다면, Mainline과 APEX는 업그레이드 없이 모듈단위로 업데이트가 가능하도록 만들었습니다. 또한, 디바이스들이 공통 모듈을 사용하게 하여 파편화를 막아주는 역할을 합니다.

31 May 2019

안드로이드 스튜디오 - "GC overhead limit exceeded" 에러 해결 방법

Android Studio에서 앱을 빌드할 때 GC overhead limit exceeded 에러가 발생하였습니다. 해결방법은 gradle.properties에서 메모리 사이즈 늘리도록 설정을 변경하는 것입니다. OOM이 발생하는 원인을 제거할 수 있겠지만, 원인찾기가 어려워 메모리 사이즈를 늘려 해결하였습니다.

18 May 2019

안드로이드 - INSTALL_FAILED_TEST_ONLY 에러 해결방법

adb로 apk를 설치할 때 INSTALL_FAILED_TEST_ONLY 에러가 발생할 때가 있습니다. TestOnly로 빌드된 apk라서 그렇습니다. -t옵션을 주어 설치를 하거나 AndroidManifest.xml에서 testOnly 속성을 제거해야 합니다. 그럼 TestOnly 앱으로 빌드되지 않아 에러가 발생하지 않습니다.

17 May 2019

안드로이드 - JobScheduler로 백그라운드 작업 실행하는 방법

Android의 JobScheduler는 앱이 백그라운드 작업을 예약할 수 있는 서비스입니다. 조건을 세분화하여 디바이스가 충전 중일 때 Job이 동작하도록 만들 수도 있습니다. JobScheduler, JobService, JobInfo에 대해서 알아보고 간단히 예제를 만들어 보았습니다.

04 Mar 2019

안드로이드 앱(apk)을 decompile하는 다양한 방법

Android apk를 decompile하는 방법을 소개합니다. Apk는 zip으로 압축된 파일입니다. 압축을 풀면 여러 리소스 파일들과 실행 파일인 dex(Dalvik Executable)파일이 있습니다. 몇개의 툴(Apktool, dex2jar, jd-cmd)을 이용하여 이 파일들을 decompile하면 사람이 읽을 수 있는 코드 형태로 변환이 가능합니다.

08 Feb 2019

안드로이드 - DownloadManager로 파일 다운받는 방법

Android의 DownloadManager는 HTTP 파일을 다운받는데 도와주는 시스템 서비스입니다. 앱은 저장될 위치의 URI와 다운받을 HTTP URI를 DownloadManager에 알려주기만 하면 알아서 받아줍니다. 또한, 내부의 백그라운드 서비스에서 다운을 받기 때문에 앱에서 쓰레드를 생성할 필요는 없습니다.

13 Jan 2019

Android Jetpack - Paging 소개 및 구현 방법

안드로이드 Paging 라이브러리는 RecyclerView에 데이터를 페이지 단위로 효율적으로 데이터를 로드하고 화면에 출력하도록 도와줍니다. 페이징은 구현하기 귀찮은 리스트뷰를 쉽게 구현할 수 있도록 도와줍니다. DataSource, PagedList, PagedListAdapter, PositionalDataSource 등과 함께 사용됩니다.

30 Dec 2018

안드로이드 ViewModel, LiveData, Room을 사용하는 좋은 예제

Android Architecture Component인 ViewModel, LiveData, Room을 함께 사용하는 샘플을 소개하려고 합니다. Paging을 소개하는 튜토리얼에서 다양한 AAC의 컴포넌트를 사용합니다. 이 샘플은 GitHub의 API를 이용하여 검색하는 키워드의 결과를 화면에 출력해줍니다.

29 Dec 2018

Android Jetpack - WorkManager 소개 및 구현 방법

안드로이드 WorkManager는 background task 구현, 스케쥴 등을 쉽게 처리할 수 있도록 만든 기능입니다. WorkManager는 내부적으로 JobScheduler를 사용하며 JobScheduler를 지원하지 않는 단말은 AlarmManager 또는 BroadcastReceiver를 사용하도록 구현되었습니다.

22 Dec 2018

Android Jetpack - Room 소개 및 구현 방법

안드로이드 Room은 SQLite를 추상화한 객체이며, ORM(Object Relational Mapping)입니다. 룸은 3개의 주요 Component(Entity, Database, DAO)로 구성되어 있습니다. Room은 RecyclerView, ViewModel, LiveData 등과 함께 사용될 수 있습니다.

17 Dec 2018

Android Jetpack - LiveData 소개 및 구현 방법

안드로이드 LiveData는 데이터를 저장하고 변화를 관찰 할 수 있는 객체입니다. LiveData에 옵저버를 등록할 수 있으며 데이터가 변경될 때 알려줍니다. RxJava의 Observable과 유사합니다. LiveData는 ViewModel과 함께 사용됩니다.

15 Dec 2018

Android Jetpack - ViewModel 소개 및 구현 방법

안드로이드 ViewModel는 View에서 사용되는 데이터를 우리가 쉽게 관리하는데 도와줍니다. Jetpack ViewModel은 MVVM 패턴에서 우리가 알고있는 ViewModel과 좀 다릅니다. ViewModel에서 Context를 사용하려면 AndroidViewModel를 사용해야 합니다.

13 Dec 2018

Android Jetpack - Lifecycle 코드 및 구조 분석

안드로이드 Lifecycle 및 LifecycleOwner와 LifecycleRegistry의 구조에 대해서 알아봅니다. 프레임워크 코드를 분석하여 내부적으로 어떻게 동작되는지 간단히 설명하였습니다. 이 글은 AndroidX 코드를 기반으로 분석하였습니다.

11 Dec 2018

Android Jetpack - Lifecycle 소개 및 구현 방법

안드로이드 Lifecycle은 액티비티의 상태에 따라 처리되는 코드를 쉽게 관리할 수 있게 도와주는 라이브러리입니다. Lifecycle을 사용하면 기존 코드를 더 읽기 쉽고, 관리하기 쉬운 코드로 만들 수 있습니다. Lifecycle은 LifecycleOwner, LifecycleObserver의 객체와 함께 사용됩니다.

10 Dec 2018

안드로이드의 명시적, 암시적 인텐트(Explicit, Implicit Intent) (2)

인텐트는 보통 명시적, 암시적 인텐트라고 합니다. 또한 인텐트로 액티비티를 실행할 때 리졸빙 과정을 거칩니다. 인텐트의 속성들을 알아보고 인텐트를 해석할 때 어떤 원리로 동작하는지 상세히 설명하였습니다. 예제 중심으로 이해하기 쉽게 정리하였습니다.

06 Dec 2018

안드로이드의 명시적(Explicit), 암시적(Implicit) 인텐트 완벽히 이해하기!

인텐트는 보통 명시적(Explicit), 암시적(Implicit) 인텐트라고 합니다. 인텐트를 실행하거나 전달할 때, 인텐트를 분석하여 어떤 컴포넌트를 실행할지 찾습니다. 인텐트의 Action, Category, mime type 등 설정하는 값에 따라 어떤 액티비티가 실행되는지 인텐트에 대해서 자세히 분석하였습니다.

05 Dec 2018

안드로이드 - PreferenceFragment 구현 방법

Android PreferenceFragment는 아래와 같은 설정화면을 쉽게 구현해주는 컴포넌트입니다. 매우 적은 코드와 간단한 XML 레이아웃 코드를 추가하여 구현할 수 있습니다. 어떻게 PreferenceFragment를 사용하는지 알아보겠습니다.

03 Dec 2018

안드로이드 - Spinner(스피너) 구현 방법 (AndroidX, Kotlin)

Android Spinner(스피너)는 드롭다운 메뉴입니다. 스피너를 클릭하면 선택가능한 메뉴가 보이고, 이 메뉴 중 하나를 눌렀을 때 출력 값을 다르게 할 수 있습니다. 간단히 XML로 스피너를 생성하는 방법과 리스너를 등록하는 방법을 소개합니다. 또한 어댑터를 생성하여 스피너를 구현하는 방법을 알아보겠습니다.

02 Dec 2018

Android Jetpack - DataBinding 구현 방법

안드로이드 DataBinding은 코틀린에서 레이아웃을, 레이아웃에서 코틀린의 데이터를 직접 참조하는 라이브러리입니다. MVVM 등의 패턴과 함께 사용됩니다. One-way Binding와 Two-way Binding으로 구현할 수 있습니다. 예제와 함께 데이터 바인딩을 구현하는 방법에 대해서 설명하였습니다.

24 Nov 2018

안드로이드 - RecyclerView 구현 방법 (AndroidX, Kotlin)

Android에서 많은 데이터를 한번에 보여주려고 하면 메모리 등 자원 문제로 버벅이거나 심하면 OOM(Out of Memory)이 발생할 수 있습니다. RecyclerView는 이런 성능문제를 해결하고 데이터를 효율적으로 보여주는 View입니다. 여기서는 코틀린과 AndroidX로 구현하는 방법을 알아보겠습니다.

23 Nov 2018

Android Jetpack - Navigation으로 Drawer 구현

네비게이션은 Drawer를 지원하는데요. Navigation을 이용하여 Drawer를 구현하는 방법을 알아보겠습니다. 간단히 샘플앱을 만들어보죠. 먼저 프로젝트를 생성하고 의존성 라이브러리를 모두 추가합니다. 이 글은 AndroidX를 사용하기 때문에 그렇지 않다면 마이그레이션이 필요합니다.

21 Nov 2018

Android P - Non-SDK 인터페이스는 제한

Android 9, 파이(API 28)부터 Non-SDK 호출은 제한이 됩니다. 앱 안정성의 문제로 구글은 Android 9부터 이런 동작을 제한한다고 합니다. Greylist, Blacklist, whitelist, light-greylist, dark-greylist를 두어 규제의 속도를 늦추고 있습니다.

19 Nov 2018

Android Jetpack - Navigation 사용 방법, 튜토리얼로 알아보기

안드로이드 네비게이션은 UI 전환을 쉽게 구현하는데 도와주는 라이브러리입니다. 개발자가 정의한 UI Graph를 기반으로 화면을 쉽게 전환하고, 유지보수가 매우 쉬워집니다. Navigation을 사용한 간단한 앱을 만들어 봄으로 써, Navigation의 기본적인 사용 방법을 설명합니다.

19 Nov 2018

Android Espresso의 Custom Matcher 구현 방법

지난 글에서 Matcher가 어떻게 동작하는지 코드 분석을 했었습니다. 이번에는 Custom Matcher를 직접 구현해보겠습니다. 이해를 돕기 위해 TextView의 text를 비교하는 Custom Matcher를 구현해보겠습니다. 에스프레소의 내부 구조를 이해하는데 도움이 되었으면 좋겠습니다.

18 Nov 2018

Android Espresso의 Matcher의 역할 및 동작 원리 분석

Matcher는 에스프레소에서 UI의 요소가 의도된 대로 출력되었는지 확인하는데 사용되는 객체입니다. ViewAssertions.matches(...)는 인자로 주어진 Matcher에 정의된 기준으로 View의 요소가 의도된대로 설정되었는지 판단할 수 있습니다. 어떻게 동작하는지 Espresso 코드를 분석해보겠습니다.

17 Nov 2018

Android Espresso를 사용하여 UI를 테스트하는 방법 (3)

안드로이드 Espresso는 안드로이드 UI를 테스트하는데 도움을 주는 라이브러리입니다. 이번 글에서는 에스프레소를 이용하여 EditText를 테스트하는 코드에 대해서 알아보겠습니다.

16 Nov 2018

Android Espresso를 사용하여 UI를 테스트하는 방법 (2)

안드로이드 Espresso는 안드로이드 UI를 테스트하는데 도움을 주는 라이브러리입니다. 이 글에서는 Intents.intending과 Intents.intended에 대한 내용을 소개합니다. 그리고 Espresso로 EditText를 테스트하는 방법을 다룹니다.

15 Nov 2018

Android Espresso를 사용하여 UI를 테스트하는 방법 (1)

안드로이드 Espresso는 안드로이드 UI를 테스트하는데 도움을 주는 라이브러리입니다. 에스프레소를 이용하여 어떻게 UI를 테스트하는지 간단히 알아보겠습니다. 샘플 코드는 Kotlin으로 작성되었으며 AndroidX를 사용하였습니다.

14 Nov 2018

안드로이드 - NotificationListener를 이용하여 노티 정보 받기

Android의 NotificationListenerService는 Notification에 대한 정보를 받을 수 있는 객체입니다. 안드로이드 SDK는 NotificationManager에 직접 listener를 등록하는 코드는 제공하고 있지 않습니다. 정보를 받고 싶다면 NotificationListenerService를 상속받은 새로운 서비스를 구현하여야 합니다.

10 Nov 2018

안드로이드 - 실행가능한 Activity인지 확인하기

Android에서 실행 가능한 액티비티는 말그대로 실행할 수 있는 액티비티를 말합니다. 어떤 액티비티를 실행했을 때 실행이 안될 수 있는데요. 미리 체크를 한다면 다른 예외처리를 할 수 있기 때문에, 액티비티 실행 전에 꼭 체크를 해야 합니다.

22 Oct 2018

안드로이드 - 런처(Launcher)화면에 보이는 앱 리스트 가져오기

Android 앱을 만들어 디바이스에 설치하면 Launcher에 내 앱이 보입니다. 그 이유는 기본적으로 아래와 같은 인텐트필터를 내 액티비티에 설정했기 때문입니다. Launcher는 이 인텐트필터를 등록한 액티비티를 찾아서 화면에 보여줍니다. Launcher가 어떻게 이 앱들을 가져오는지 코드로 확인해보겠습니다.

22 Oct 2018

안드로이드 - StorageStatsManager로 App 크기 계산하기 (StorageStats)

Android의 StorageStatsManagerService는 Storage stats에 대한 정보를 제공해주는 Service입니다. App이 디바이스에서 차지하는 size를 계산할 때 사용할 수 있습니다. App뿐만이 아니라 UID, User 별로 차지하는 정보도 알 수 있습니다.

06 Oct 2018

쉘 명령어로 안드로이드 emulator를 실행하는 방법 (우분투)

Android의 system 파티션은 기본적으로 read only로 설정되어있습니다. writable로 변경하려면 emulator를 실행할 때 옵션을 writable로 설정하면됩니다. 안드로이드 스튜디오에서 AVD manager로 실행할 때는 옵션을 줄 수 없어, shell command로 실행해야 합니다.

12 Aug 2018

안드로이드 - CTS hostside를 gradle로 빌드하는 방법

CTS(Compatibility Test Suite)는 안드로이드의 호환성테스트입니다. AOSP를 받으면 CTS를 빌드할 수 있습니다. CTS를 빌드하여 의존성있는 jar 라이브러리를 얻었고 이것과 함께 gradle로 CTS hostside 코드가 빌드되도록 해보았습니다.

06 Jul 2018

안드로이드 Adaptive Icon 적용하는 방법

안드로이드 어댑티브 아이콘(Adaptive Icon)에 대해서 소개합니다. Adaptive Icon을 사용하면 여러 스타일의 아이콘으로 변경할 수 있게 합니다. 삼성, 화훼이 등 여러 제조사는 아이콘을 자신들에 맞게 변경하였고, 이 때문에 아이콘의 중요한 부분이 잘리는 일이 빈번했습니다. 구글은 이런 문제를 해결하기 위해 Adaptive Icon을 개발하였습니다.

23 Jun 2018

Android 에뮬레이터 - kvm permission denied 문제 해결

우분투에서 Android Studio의 Emulator가 동작안하는 문제가 있었습니다. 해결 방법은 kvm group에 나의 user를 추가하는 것이었습니다.

01 Jun 2018

안드로이드 - WIFI로 adb 연결하기

adb wifi를 이용하면 무선으로 adb로 디버깅을 할 수 있습니다. 하지만 사전에 usb cable을 연결하여 설정이 필요합니다. usb케이블을 연결하여 tcpip 명령어로 port 번호를 변경하여 adbd를 재시작해야합니다. port번호는 5555가 default입니다. 그리고 wifi에 연결된 디바이스의 IP주소를 알아야합니다.

20 May 2018

Android의 앱 데이터 폴더 경로 및 내부/외부 저장소 설명

Device에 App이 설치되면 App마다 사용할 수 있는 저장공간이 있습니다. 앱은 apk파일, 내부 저장소, 외부 저장소에 파일을 저장할 수 있는 공간이 있습니다. 또한 누구나 사용할 수 있는 공용 공간이 있습니다. 각 폴더의 차이점과 접근할 때 필요한 권한들을 정리하였습니다.

10 Mar 2018

안드로이드 - Activity를 Full screen으로 만들기(Statusbar 숨기기)

앱을 풀스크린으로 실행시키거나, 상태바(Statusbar)가 UX와 어울리지 않을 때 제거하고 싶을 때가 있습니다. Statusbar를 숨기는 방법은 크게 두가지가 있습니다. 첫번째는 AndroidManifest.xml에 Activity의 theme를 설정하거나, 두번째는 Java에서 Code로 설정하는 방법입니다.

05 Mar 2018

안드로이드 - SharedPreferences에 ArrayList를 저장하는 방법

Android의 SharedPreferences는 1개의 키에 대해서 1개의 String을 저장합니다. 하지만 1개의 Key에 대해서 ArrayList 형식의 데이터를 저장할 수도 있습니다. DB를 쓸 정도는 아닌데, SharedPreferences를 사용하기에는 번거롭네. SharedPreferences에 ArrayList를 저장할 수 있으면 좋을텐데... 하고 말이죠.

05 Mar 2018

안드로이드 - Messenger를 이용하여 Remote Service 구현하기

Android의 Remote Service는 App의 Main process와 다른 Process에서 실행되는 Service를 말합니다. 안드로이드에서는 RPC(Remote Procedure Call)를 Binder를 통해서 지원을 하는데, AIDL과 Messenger로 구현할 수 있습니다. 이 두가지 방법에 대해서 알아보겠습니다.

05 Mar 2018

안드로이드 - Autosizing TextView 구현 방법

Autosizing TextView는 TextView 내에서 글자 양에 따라 자동으로 글자 크기를 조절해주는 기능입니다. 선형적으로 증가 또는 감소하는 Granularity가 있고, 주어진 Size들에서만 변경이 되는 Preset Size가 있습니다. 이 기능을 사용하면 쉽게 TextView의 가독성을 높일 수 있습니다.

24 Jan 2018

안드로이드 - Downloadable Font에 대해서 알아보기

Android의 Downloadable Font는 App이 Font Provider를 통해서 Font를 다운받아 사용할 수 있는 기능입니다. App size가 줄어드는 장점과 기본 Font는 Googe Play Service가 제공하기 때문에 Font 관리가 편하다는 장점이 있습니다. 다른 App과 공유를 하고 싶으면 Provider를 구현해야 합니다.

16 Jan 2018

안드로이드 O - 앱 카테고리(App categories) 살펴보기

Android Oreo(8.0)에서 소개된 App category에 대해서 정리하였습니다. App category는 Data Usage, Storage Usage 등의 앱에서 자신의 앱이 어떻게 분류되었으면 좋을지 선택하는 것입니다. 예를들어, PlayStore에서 App category를 이용하여 Game app을 분류할 수 있습니다.

10 Jan 2018

안드로이드 - Button, TextView를 구현하는 방법

Button은 버튼 입력을 받고, TextView는 Text를 표현할 때 사용하는 View입니다. 물론, 이들은 ViewGroup이 아니기 때문에 다른 View들의 위치를 정하는 일은 할 수 없습니다. 보통 UI는 모두 xml파일에 정의하고, 이벤트 처리는 Java에서 합니다.

06 Jan 2018

Ubuntu에서 Android10 소스 다운로드 및 빌드

안드로이드10이 공개되었씁니다. 안드로이드 source는 많은 git project들로 이루어져있습니다. Full Build를 하려면 우리는 각각의 git project를 다운받아서 폴더별로 정리를 한 뒤에 Build를 해야 하는데요. 매우 귀찮은 작업이기 때문에, Google에서는 REPO라는 툴을 만들어 이를 이용하여 쉽게 source를 관리하고 있습니다.

04 Jan 2018

안드로이드 - ConstraintLayout 구현 방법

Android의 ConstraintLayout는 유연하게 다른 View들을 배치할 수 있는 ViewGroup입니다. 이 Layout은 Android SDK에 포함되어있지 않기 때문에 Android Support Library로 API Level 9부터 지원을 하고 있습니다. 사용하려면 Android Support Library를 gradle에서 load를 해야 합니다.

16 Sep 2017

안드로이드 - LinearLayout 구현 방법

Android의 LinearLayout은 세로 또는 가로의 단일 방향으로 모든 하위 View 객체를 정렬하는 ViewGroup입니다. Orientation 속성은 LinearLayout의 하위 View들을 정렬하는 방향을 정합니다. layout_weight는 내부 객체들의 크기를 비율로 정해주는 방식입니다.

03 Sep 2017

안드로이드 - RelativeLayout을 사용하는 방법

RelativeLayout은 부모(Parent) View 또는 자식(Child) View의 상대적 위치 관계를 정의하여 UI를 배치하는 Layout입니다. LinearLayout은 가로 또는 세로 방향으로 View가 순서대로 배치되었지만 RelativeLayout은 객체간의 상대적인 위치 관계를 정의하지 않으면 배치가 되지 않습니다.

03 Sep 2017

안드로이드 - Layout의 기본적인 속성들에 대해서 알아보기

ViewGroup 객체는 View 객체를 상속하고 있습니다. 이런 관계처럼 이 둘은 공통적으로 갖고 있는 속성들이 많습니다. 이번 튜토리얼에서는 기본적으로 알야야 하는 속성에 대해서 알아보겠습니다.

02 Sep 2017

안드로이드 - View와 ViewGroup에 대해서 알아보기

안드로이드에서 UI 요소들은 크게 View와 View Group 객체로 이루어져 있습니다. Java에서도 UI Layout을 정의할 수 있지만 가장 간단한 방법은 layout에 xml파일로 정의를 하는 것 입니다. 이번 튜토리얼에서는 안드로이드 프로젝트에서 UI Layout을 어떻게 정의하는지 알아보겠습니다.

01 Sep 2017

안드로이드 - Activity Back Stack에 대해서 알아보기

Android의 Activity Back Stack은 Activity의 작업을 관리하는 자료구조로 마치 Stack(후입선출)처럼 동작합니다. 동일한 Activity가 여러번 실행되었을 때 Activity의 Stack을 어떻게 할지 등 다양한 변수가 발생하는데, Android는 개발자가 의도한 UX에 맞게 Activity가 동작하도록 여러 속성을 지원합니다.

21 Aug 2017

안드로이드 - Activity Lifecycle(생애주기) 알아보기

Android의 Activity Lifecycle이란 Activity가 생성되고 종료되기 까지의 상태(State)를 말합니다. Activity는 6개의 주요 Callback method를 제공해주는데 Activity의 상태가 변경될 때마다 각각의 Callback method를 호출해줍니다.

20 Aug 2017

안드로이드 - Toast & Log를 출력하는 방법

Android의 Toast와 Log 출력 방법에 대해서 알아봅니다. Toast는 사용자에게 알림 등의 메시지를 주는 용도로 사용합니다. Log는 개발을 하면서 이 코드가 정상적으로 작동하는지 확인하는 디버깅 용도로 사용합니다. Toast는 화면 아래쪽에 뜨는 메시지입니다.

19 Aug 2017

안드로이드 - XML에 대한 간단한 설명

XML(Extensible Markup Language)은 W3C에서 많은 종류의 데이터를 저장, 관리 등의 목적으로 개발되었습니다. Android에서는 XML은 AndroidManifest.xml, Layout 파일, Resource 파일 등 다양한 곳에서 사용됩니다. 개발자는 XML을 이용해 데이터를 쉽게 표현하고, Android OS(framework)는 개발자가 표현한 XML을 파싱하여 데이터를 구조화합니다.

19 Aug 2017

안드로이드 - 다른 Activity 실행하는 방법

매우 기본적인 튜토리얼입니다. 안드로이드 프로젝트를 생성하고 Activity를 생성하고 실행해보겠습니다.

18 Aug 2017

안드로이드 - Project 구조 알아보기

안드로이드 스튜디오로 프로젝트를 만들 때 왼편에 디렉토리 구조를 볼 수 있습니다. 각각의 폴더가 무슨 의미인지, 파일은 어떤 용도로 사용되는지 자세히 알아보겠습니다.

17 Aug 2017

안드로이드 - 첫번째 App 만들기

Android Studio 설치 및 SDK를 모두 설치하였다면 Android 개발환경을 모두 갖춘 것입니다. 다른 것을 학습하기 전에, 먼저 Android Studio에서 Project를 생성하고 빌드하여 내 디바이스에 앱을 설치해보겠습니다.

15 Aug 2017

Android 설치 방법 (Windows)

Android Studio를 설치하기 전에 Java를 설치해야합니다. JDK는 Java Development kit으로 개발용 JAVA입니다. 아래 링크로 들어가서 자신의 운영체제에 맞게 JDK를 다운받아 설치합니다.

14 Aug 2017