4. 6.0 마시멜로의 새로운 기능이 필요하다면?
사용자가 잠자는 동안에도 작업이 진행되어야 한다면?
항상 정확한 시간에 작업이 이루어져야 한다면?
체크리스트 #1
targetSdkVersion을 올려야 합니다!
5. 체크리스트 #2
targetSdkVersion을 올리지 않더라도,
앱을 수정해 재배포 해야합니다.
마시멜로에서 앱을 실행했더니 죽는다면?
강제로 권한을 제거하면 심각한 문제가 발생한다면?
백그라운드에서 WiFi / Bluetooth Scan 작업을 수행해야 한다면?
13. Runtime Permissions
앱 설치 시 권한 확인 없이 바로 앱 설치/업데이트 가능
앱 실행 중 권한 여부를 확인 한 후 권한 요청 필요
사용자는 설정화면을 통해 언제든지 앱의 권한을 변경 가능
14. 새로운 권한 모델은 ‘Dangerous’ 수준의 권한에만 적용 됨
CALENDAR, CAMERA, CONTACTS, MICROPHONE, LOCATION, PHONE, SENSORS,
SMS, STORAGE
Runtime Permissions
Normal 수준 권한은 메니페스트에 선언하면 바로 사용 가능
INTERNET, USE_FINGERPRINT, ACCESS_NETWORK_STATE,
RECEIVE_BOOT_COMPLETED, etc…
15. “설정 > 애플리케이션 > 앱 선택 > 권한”
내 앱이 사용하고 있는 Dangerous 수준 권한 확인하기
체크 리스트
표시되는 권한이 없다면?
축하합니다 : ) Dangerous 수준 권한이
메니페스트에 선언되지 않았고, 앱은 런
타임 권한 모델에 영향을 받지 않습니다.
16. 권한 확인
권한 요청 이유 설명
권한 요청
콜백 확인 후 처리
App System
Runtime Permissions Flow
권한 요청을 위한 대화창은 시
스템에서 생성 및 관리 됨
Activtiy LifecCycle에 주의
(onPause / onResume 호출)
17. 권한 확인
권한 요청 이유 설명
권한 요청
콜백 확인 후 처리
App
Runtime Permissions Flow
ContextCompat#checkSelfPermissions
ActivityCompat#shouldShowRequestPermissionRationale
ActivtiyCompat#requestPermissions
OnRequestPermissionsResultCallback
#onRequestPermissionsResult
Runtime Permission Sample App 코드를 확인하세요.
19. 시스템 권한으로 변경된 권한들
다른 앱 위에서 팝업을 띄우기 위해 사용되던
SYSTEM_ALERT_WINDOW 권한과 시스템 설정 값을 강제로 변경하기
위해 사용되던 WRITE_SETTINGS 권한은 더이상 일반적인 방법으로 획
득할 수 없습니다.
고급 권한 설정을 통해
사용자가 직접 변경 가능합니다.
20. 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
21. 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
22. android {
useLibrary ‘org.apache.http.legacy'
…
}
안드로이드 2.3 이 후 버전 부터는 HttpUrlConnection 사용이 권장 됩니다.
HttpUrlConnection 기반의 오픈 소스 라이브러리 Volley 혹은 OkHttp를 검토해보세요.
Apache Http Client 삭제
ApacheHttpClient 가 꼭 필요하다면 build.gradle 파일에
컴파일 의존성을 추가해주세요.
23. Access to Hardware Identifier
WifiManager.getScanResults()
BluetoothDevice.ACTION_FOUND
BluetoothLeScanner.startScan()
…
ACCESS_FINE_LOCATION 혹은 ACCESS_COARSE_LOCATION
권한이 없으면 주변 Wifi / Bluetooth 디바이스를 발견할 수 없습니다.
다음과 같은 메서드가 정상적으로 동작하지 않습니다.
24. 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 플래그를 컴파일 옵션에 추가해서 다시 빌드하세요.
25. 그 외 변경/삭제된 API
BrowserBookmark
android.provider.Browser.getAllBookmarks()
android.provider.Browser.saveBookmark()
Notification
Notification#setLatestEventInfo()
AudioManager
AudioManager#setStreamSolo()
AudioManager#setStreamMute()
34. Doze 대응을 고민하기 전에
여러분의 앱은 사용자가 잠자고 있는 동안에도
처리해야할 중요한 작업이 있나요?
예> 알람시계, 실시간 메시징
그렇지않다면, 너무 걱정하지마세요.
사용자가 화면을 켜는 순간 Doze 모드가 바로 종료됩니다.
35. API Level 23
Doze 와 AlarmManager
Doze 모드에서도 작업이 수행 되어야한다면...
AlarmManager#setAndAllowWhileIdle
AlarmManager#setExactAndAllowWhileIdle 메서드를 사용합니다.
두 메서드 모두 배터리 사용량에 나쁜 영향을 미칠 수 있습니다. 따라서...
Doze 모드가 아니면,
>알람은 개별 앱 당, 최대 1분에 한 번 동작합니다.
Doze 모드 상에서는,
>알람은 개별 앱 당, 최대 15분에 한 번 동작합니다.
36. API Level 21
Doze 와 AlarmManager
Doze 모드에서 동작하는 알람 시계를 구현하려면...
AlarmManager#setAlarmClock 메서드를 사용합니다.
AlaramClock이 설정되면...
StatusBar에 아이콘이 표시되고,
설정된 알람 시간 조금 전에 Doze 모드에서 벗어납니다
37. 상황에 맞춰 올바른 API를 사용하세요!
보다 자세한 설명이 필요하면
왼쪽 그림을 클릭! 하세요.
38. 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"
}
}
39. Doze 모드 올바르게 대응하기
현재 디바이스가 Doze 모드인지 확인할 수 있습니다.
현재 앱이 Whitelist에 포함되어 있는지 확인할 수 있습니다.
디바이스 IDLE 상태 변화를 확인할 수 있습니다.
PowerManager#isDeviceIdleMode
PowerManager#isIgnoringBatteryOptimizations
ACTION_DEVICE_IDLE_MODE_CHANGED 브로드캐스트 인텐트
40. 배터리 최적화 무시
Doze 중에도 네트워크 연결이 꼭 필요한 경우, 사용자에게 특정 앱의 배터리 최적화를 무시
할 것을 요청할 수 있습니다. 하지만 주의하세요. 불필요한 요청은 GooglePlay 정책에 위배
될 수 있습니다.
1. 메니페스트 상에
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 권한 선언
2. 다음 형태의 Intent 생성 후 엑티비티 실행
• ACTION: ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
• DATA URI: package:[app package name]
3. “배터리 최적화를 무시할까요?” 대화창 표시
41. 런타임 권한 체크 리스트
권한 설정에서 강제로 권한을 제거한 후에도
앱이 기대한 방식으로 동작하나요?
42. 런타임 권한
안드로이드 6.0 에서는 23 타겟으로 빌드되지 않은 앱도,
설정 메뉴를 통해 사용자가 앱의 권한을 강제로 제거할 수 있습니다.
사용자에게 위험성을 경고하는
대화창이 표시됩니다.
43. 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
런타임 권한
44. 타겟 버전과 관계없이 권한을 갖고 있는지 확인할 수
있는 API가 추가되었습니다.
PermissionChecker#checkSelfPermission
런타임 권한
46. WiFi / Bluetooth Scan
체크리스트
백그라운드 상에서 WiFi / Bluetooth Scan
작업을 수행하시나요?
47. 주변 디바이스 정보를 활용하면 사용자 위치를 알 수 있습니다.
targetSdkVersion이 23 미만인 경우 Location 권한이 없으면,
WiFi / Bluetooth Scan 작업은 앱이 포그라운드 상에서 동작할 때만
정상적으로 동작하며, 백그라운드 상에서는 동작하지 않습니다.
(빈 리스트를 반환합니다.)
Location 권한이 없는 경우...
48. 안드로이드 개발자 사이트
안드로이드 6.0 API 소개 비디오 플레이리스트
구글 코리아 개발자 블로그
Google Developer Group Korea
GDG Korea Android
OneStore 개발자 센터 블로그
참고자료 / 참고사이트