49
안드로이드 6.0 마시멜로 targetSdkVersion를 고민하는 개발자를 위한 안내서 양찬석 Developer Advocate, Google

안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Embed Size (px)

Citation preview

Page 1: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

안드로이드 6.0 마시멜로 targetSdkVersion를 고민하는 개발자를 위한 안내서

양찬석 Developer Advocate, Google

Page 2: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

말랑말랑한 안드로이드 마시멜로가 10월 5일 공개 되었습니다.

Page 3: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

23 올려야 할까요? 말아야 할까요?

Page 4: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

6.0 마시멜로의 새로운 기능이 필요하다면?

사용자가 잠자는 동안에도 작업이 진행되어야 한다면?

항상 정확한 시간에 작업이 이루어져야 한다면?

체크리스트 #1

targetSdkVersion을 올려야 합니다!

Page 5: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

체크리스트 #2

targetSdkVersion을 올리지 않더라도, 앱을 수정해 재배포 해야합니다.

마시멜로에서 앱을 실행했더니 죽는다면?

강제로 권한을 제거하면 심각한 문제가 발생한다면?

백그라운드에서 WiFi / Bluetooth Scan 작업을 수행해야 한다면?

Page 6: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

마시멜로의 새로운 기능

Page 7: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Fingerprint Authentication

지문 인식을 통해 사용자 인증 가능

지문 인식을 위한 전체 UI/UX 플로우 제공

지문 인식 대화 창을 활용하는 샘플코드 Fingerprint and Payments APIs (Video)

Page 8: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

App Linking

기존 Deep Link는 사용자가 실행할 앱을 선택 후 앱이 실행 됨

Page 9: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

App Linking

새로운 App Linking 을 활용하면,

앱 설치 시 자동으로 등록된 도메인 사이트 인증

이 후에는, 사용자 확인 과정 없이 바로 특정 앱으로 이동

App

Verify

웹 사이트

Page 10: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Voice Interactions

사용자가 마치 대화하는 것 처럼

앱의 특정 기능을 수행할 수 있도록 지원

Voice Interactions Codelab

Page 11: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Direct Share

‘공유하기’를 통해 특정 아이템을 공유할 때,

공유할 앱 뿐만아니라,

특정 대상(예> 주소록 내 사람)을 지정하여 공유 가능

Direct Share 샘플코드

Page 12: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

마시멜로 대상으로 앱을 빌드하면 달라지는 것들

targetSdkVersion 23

Page 13: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Runtime Permissions

앱 설치 시 권한 확인 없이 바로 앱 설치/업데이트 가능

앱 실행 중 권한 여부를 확인 한 후 권한 요청 필요

사용자는 설정화면을 통해 언제든지 앱의 권한을 변경 가능

Page 14: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

새로운 권한 모델은 ‘Dangerous’ 수준의 권한에만 적용 됨

CALENDAR, CAMERA, CONTACTS, MICROPHONE, LOCATION, PHONE, SENSORS, SMS, STORAGE

Runtime Permissions

Normal 수준 권한은 메니페스트에 선언하면 바로 사용 가능

INTERNET, USE_FINGERPRINT, ACCESS_NETWORK_STATE, RECEIVE_BOOT_COMPLETED, etc…

Page 15: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

“설정 > 애플리케이션 > 앱 선택 > 권한”

내 앱이 사용하고 있는 Dangerous 수준 권한 확인하기

체크 리스트

표시되는 권한이 없다면? 축하합니다 : ) Dangerous 수준 권한이 메니페스트에 선언되지 않았고, 앱은 런타임 권한 모델에 영향을 받지 않습니다.

Page 16: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

권한 확인

권한 요청 이유 설명

권한 요청

콜백 확인 후 처리

App System

Runtime Permissions Flow

권한 요청을 위한 대화창은 시

스템에서 생성 및 관리 됨

Activtiy LifecCycle에 주의

(onPause / onResume 호출)

Page 17: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

권한 확인

권한 요청 이유 설명

권한 요청

콜백 확인 후 처리

App

Runtime Permissions Flow

ContextCompat#checkSelfPermissions

ActivityCompat#shouldShowRequestPermissionRationale

ActivtiyCompat#requestPermissions

OnRequestPermissionsResultCallback #onRequestPermissionsResult

Runtime Permission Sample App 코드를 확인하세요.

Page 18: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

google.com/design/spec/patterns/permissions.html

Page 19: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

시스템 권한으로 변경된 권한들

다른 앱 위에서 팝업을 띄우기 위해 사용되던

SYSTEM_ALERT_WINDOW 권한과 시스템 설정 값을 강제로 변경하기

위해 사용되던 WRITE_SETTINGS 권한은 더이상 일반적인 방법으로 획

득할 수 없습니다.

고급 권한 설정을 통해

사용자가 직접 변경 가능합니다.

Page 20: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

SYSTEM_ALERT_WINDOW 올바르게 처리하기

권한 확인

권한 요청 엑티비티 실행

App

Settings.System.canDrawOverlays()

Start Activtiy ACTION_MANAGE_OVERLAY_PERMISSION action and app package url in data field (eg> package:com.my.app)

onPause onStop

onRestart onStart

onResume

Page 21: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

WRITE_SETTINGS 올바르게 처리하기

권한 확인

권한 요청 엑티비티 실행

App

Settings.System.canWrite()

Start Activtiy with ACTION_MANAGE_WRITE_SETTINGS action and app package url in data field (eg> package:com.my.app)

onPause onStop

onRestart onStart

onResume

Page 22: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

android { useLibrary ‘org.apache.http.legacy' …}

안드로이드 2.3 이 후 버전 부터는 HttpUrlConnection 사용이 권장 됩니다.

HttpUrlConnection 기반의 오픈 소스 라이브러리 Volley 혹은 OkHttp를 검토해보세요.

Apache Http Client 삭제

ApacheHttpClient 가 꼭 필요하다면 build.gradle 파일에

컴파일 의존성을 추가해주세요.

Page 23: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Access to Hardware Identifier

WifiManager.getScanResults() BluetoothDevice.ACTION_FOUND BluetoothLeScanner.startScan() …

ACCESS_FINE_LOCATION 혹은 ACCESS_COARSE_LOCATION

권한이 없으면 주변 Wifi / Bluetooth 디바이스를 발견할 수 없습니다.

다음과 같은 메서드가 정상적으로 동작하지 않습니다.

Page 24: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

23으로 타겟을 올린 후, 멀쩡한 so 파일을 불러올 수 없다면?

Shared library with text relocations

target 23 미만에서는 다음과 같은 경고가 발생하지만, 사용 가능했던 라이브러리는

linker XXX has text relocations. This is wasting memory and is a security risk. Please fix.

target 23 이후는 ‘dlopen(3)’ 오류와 함께 사용 불가합니다.

Shared Library 컴파일 할 때

-fPIC 플래그를 컴파일 옵션에 추가해서 다시 빌드하세요.

Page 25: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

그 외 변경/삭제된 API

BrowserBookmark android.provider.Browser.getAllBookmarks() android.provider.Browser.saveBookmark()

Notification Notification#setLatestEventInfo()

AudioManager AudioManager#setStreamSolo() AudioManager#setStreamMute()

Page 26: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

기존 앱이라도 꼭 확인 해봐야 할 변화들

targetSdkVersion <= 23

Page 27: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Open SSL 체크 리스트

마시멜로에서 앱이 정상적으로 실행되나요?

Page 28: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

안드로이드 6.0부터는 OpenSSL대신 BoringSSL 라이브러리가 사용됩니다.

NDK를 사용하는 경우, OpenSSL 라이브러리에 대해 직접 링크를 연결하지 마세요(예:libcrypto.so 및 libssl.so)

앱이 실행하자 마자 죽는다면? 의심해 보세요.

OpenSSL이 사라집니다

Page 29: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

안드로이드 플랫폼 API를 이용해 SSL을 활용할 수 있습니다.

꼭 필요한 경우 앱 패키지내에 Shared Library 파일을 직접 추가하세요. (libssl.so , libcrypto.so)

OpenSSL이 사라집니다

Page 30: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Doze 체크 리스트

만일 여러분의 앱이, AlarmManager를 활용하거나, GCM등 푸시 서비스를 사용하면서,

반복적으로 작업을 수행하거나, 정확한 시간에 특정 작업을 수행해야 한다면...

테스트가 필요합니다!

Page 31: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

디바이스는 잠이 듭니다. 아주 깊이 ZZZ...

Doze

만일 오랜 시간 동안 (1시간 정도)

1. 배터리가 충전 중이 아니고 2. 스크린이 꺼져 있고 3. 디바이스가 움직이지 않을 때,

Page 32: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

네트워크를 사용할 수 없고,

애플리케이션이 요청한 WakeLock을 무시하고,

AlarmManager, JobScheduler, SyncAdapter를 통해 예약된 작업이 지

연됩니다.

디바이스가 잠이들면...

Page 33: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

잠이든 디바이스는...

Doze 모드 중간 중간 미뤄둔 작업을 처리하기 위해 Maintenance 모드에 진입합니다. (약 5분간)

Page 34: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Doze 대응을 고민하기 전에

여러분의 앱은 사용자가 잠자고 있는 동안에도

처리해야할 중요한 작업이 있나요?

예> 알람시계, 실시간 메시징

그렇지않다면, 너무 걱정하지마세요.

사용자가 화면을 켜는 순간 Doze 모드가 바로 종료됩니다.

Page 35: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

API Level 23

Doze 와 AlarmManager

Doze 모드에서도 작업이 수행 되어야한다면...

AlarmManager#setAndAllowWhileIdle

AlarmManager#setExactAndAllowWhileIdle 메서드를 사용합니다.

두 메서드 모두 배터리 사용량에 나쁜 영향을 미칠 수 있습니다. 따라서...

Doze 모드가 아니면, >알람은 개별 앱 당, 최대 1분에 한 번 동작합니다.

Doze 모드 상에서는, >알람은 개별 앱 당, 최대 15분에 한 번 동작합니다.

Page 36: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

API Level 21

Doze 와 AlarmManager

Doze 모드에서 동작하는 알람 시계를 구현하려면...

AlarmManager#setAlarmClock 메서드를 사용합니다.

AlaramClock이 설정되면...

StatusBar에 아이콘이 표시되고,

설정된 알람 시간 조금 전에 Doze 모드에서 벗어납니다

Page 37: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

상황에 맞춰 올바른 API를 사용하세요!

보다 자세한 설명이 필요하면

왼쪽 그림을 클릭! 하세요.

Page 38: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Doze 와 GCM

Doze 모드 일 때, Normal Priority GCM 수신이 지연됩니다.

Doze 모드 중에서도 리얼타임 메세징이 꼭 필요하다면... High Priority GCM 을 사용합니다.

{ "to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...", "priority" : "high", "notification" : { "body" : "This week’s edition is now available.", "title" : "NewsMagazine.com", "icon" : "new", }, "data" : { "volume" : "3.21.15", "contents" : "http://www.news-magazine.com/world-week/21659772" } }

Page 39: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

Doze 모드 올바르게 대응하기

현재 디바이스가 Doze 모드인지 확인할 수 있습니다.

현재 앱이 Whitelist에 포함되어 있는지 확인할 수 있습니다.

디바이스 IDLE 상태 변화를 확인할 수 있습니다.

PowerManager#isDeviceIdleMode

PowerManager#isIgnoringBatteryOptimizations

ACTION_DEVICE_IDLE_MODE_CHANGED 브로드캐스트 인텐트

Page 40: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

배터리 최적화 무시Doze 중에도 네트워크 연결이 꼭 필요한 경우, 사용자에게 특정 앱의 배터리 최적화를 무시

할 것을 요청할 수 있습니다. 하지만 주의하세요. 불필요한 요청은 GooglePlay 정책에 위배

될 수 있습니다.

1. 메니페스트 상에

REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 권한 선언

2. 다음 형태의 Intent 생성 후 엑티비티 실행

• ACTION: ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS

• DATA URI: package:[app package name]

3. “배터리 최적화를 무시할까요?” 대화창 표시

Page 41: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

런타임 권한 체크 리스트

권한 설정에서 강제로 권한을 제거한 후에도 앱이 기대한 방식으로 동작하나요?

Page 42: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

런타임 권한

안드로이드 6.0 에서는 23 타겟으로 빌드되지 않은 앱도,

설정 메뉴를 통해 사용자가 앱의 권한을 강제로 제거할 수 있습니다.

사용자에게 위험성을 경고하는 대화창이 표시됩니다.

Page 43: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

targetSdk 가 23 미만의 앱에서 API 호출에 필요한 권한이 없는 경우, 안드로이드 플랫폼은 SecurityException 대신 민감한 정보에 접근하지 못하게 API 결과값을 조정합니다.

제거된 권한 메서드 이름 결과

android.permission-group.PHONE getLine1Number() null

android.permission-group.STORAGE Querying MediaStore Empty Cursor

android.permission-group.CAMERA openCamera() CameraAccessException

android.permission-group.CONTACTS Querying Contacts Empty Cursor

런타임 권한

Page 44: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

타겟 버전과 관계없이 권한을 갖고 있는지 확인할 수 있는 API가 추가되었습니다.

PermissionChecker#checkSelfPermission

런타임 권한

Page 46: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

WiFi / Bluetooth Scan 체크리스트

백그라운드 상에서 WiFi / Bluetooth Scan 작업을 수행하시나요?

Page 47: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

주변 디바이스 정보를 활용하면 사용자 위치를 알 수 있습니다.

targetSdkVersion이 23 미만인 경우 Location 권한이 없으면,

WiFi / Bluetooth Scan 작업은 앱이 포그라운드 상에서 동작할 때만

정상적으로 동작하며, 백그라운드 상에서는 동작하지 않습니다.

(빈 리스트를 반환합니다.)

Location 권한이 없는 경우...

Page 48: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

안드로이드 개발자 사이트

안드로이드 6.0 API 소개 비디오 플레이리스트

구글 코리아 개발자 블로그

Google Developer Group Korea

GDG Korea Android

OneStore 개발자 센터 블로그

참고자료 / 참고사이트

Page 49: 안드로이드 6.0 마시멜로 지원을 고민하는 개발자를 위한 안내서

여러분의 앱이 마시멜로에서 잘 동작하길 기원합니다...