Android 6.0 (API 수준 23)에는 새로운 기능 및 특징과 더불어 시스템 변경사항 및 API 동작 변경사항입니다. 이 문서에서는 앱에서 이해하고 고려해야 하는 몇 가지 주요 변경사항을 살펴보겠습니다.
이전에 Android용 앱을 게시한 적이 있는 경우 영향을 줄 수 있습니다
런타임 권한
이 릴리스에서는 새로운 권한 모델을 소개합니다. 여기에서는 이제 사용자가 직접 런타임 시 앱에 권한을 부여할 수 있습니다. 이 모델을 통해 사용자는 인벤토리 관리 시스템에 대한 권한을 부여하고 앱 개발자를 위해 설치 및 자동 업데이트 프로세스를 간소화합니다. 사용자는 설치된 여러 앱에 대해 개별적으로 권한을 허용하거나 취소할 수 있습니다.
Android 6.0 (API 수준 23) 이상을 타겟팅하는 앱에서
할 수 있습니다. 앱에 권한이 부여되었는지 확인하려면
새 checkSelfPermission()
메서드를 사용하여 축소하도록 요청합니다. 권한을 요청하려면 새
requestPermissions()
메서드를 사용하여 축소하도록 요청합니다. 앱이 Android 6.0 (API 수준 23)을 타겟팅하지 않더라도
사용할 수 있습니다.
앱에서 새 권한 모델을 지원하는 방법에 관한 자세한 내용은 다음을 참고하세요. <ph type="x-smartling-placeholder"></ph> 시스템 권한 사용을 참조하세요. 앱에 미치는 영향을 평가하는 방법에 관한 팁은 권한 사용 참고사항을 참조하세요.
잠자기 및 앱 대기
이 릴리스에는 유휴 상태의 기기 및 앱에 대한 새로운 절전 최적화 기능이 새롭게 추가되었습니다. 이러한 기능이 모든 앱에 영향을 미치므로 이러한 새로운 모드에서 앱을 테스트하도록 하세요.
- 잠자기: 사용자가 기기의 플러그를 뽑고 화면이 꺼진 상태로 움직이지 않으면 일정 시간 동안 기기가 잠자기 모드로 전환되어 시스템이 있을 것입니다. 이 모드에서 기기는 정기적으로 잠시 동안 정상 작동을 재개합니다. 앱 동기화가 발생할 수 있고 시스템은 보류 중인 작업을 모두 수행할 수 있습니다.
- 앱 대기: 앱 대기 모드를 사용하면 시스템에서 앱이 유휴 상태임을 파악할 수 있습니다. 사용자가 적극적으로 사용하지 않는 경우 시스템에서는 사용자가 요청하지 않으면 이러한 결정을 내립니다. 앱을 일정 시간 동안 터치 기기의 플러그가 뽑혀 있다면 시스템이 네트워크를 사용 중지합니다. 유휴로 간주된 앱의 동기화 및 작업에 액세스하고 이를 정지합니다.
이러한 절전 변경사항에 대한 자세한 내용은 다음을 참조하세요. 잠자기 및 앱 대기 최적화.
Apache HTTP 클라이언트 제거
이 Android 6.0 릴리스에서는 Apache HTTP 클라이언트에 대한 지원이 제거되었습니다. 앱에서 이 클라이언트를 사용하고
Android 2.3 (API 수준 9) 이상을 타겟팅하는 경우 HttpURLConnection
클래스를 사용합니다.
하세요. 이 API는 투명한 압축을 통해 네트워크 사용량을 줄이므로 더 효율적입니다.
응답 캐싱을 지원하며, 전력 소비를 최소화합니다. Apache HTTP API를 계속 사용하려면
먼저 build.gradle
파일에서 다음과 같은 컴파일 시간 종속 항목을 선언해야 합니다.
android { useLibrary 'org.apache.http.legacy' }
BoringSSL
Android는 OpenSSL에서
BoringSSL
있습니다. 앱에서 Android NDK를 사용하는 경우 암호화 라이브러리에 연결하지 마세요.
NDK API의 일부가 아닌 언어(예: libcrypto.so
, libssl.so
) 이러한
라이브러리는 공개 API가 아니며, 여러 버전과 기기에 걸쳐 예고 없이 변경되거나 중단될 수 있습니다.
또한 스스로를 보안 취약점에 노출시킬 수도 있습니다. 대신
JNI를 통해 Java 암호화 API를 호출하거나
선택할 수 있습니다.
하드웨어 식별자 액세스
이번 출시부터 Android는 사용자에게 더 강력한 데이터 보호를 제공하기 위해
기기의 로컬 하드웨어 식별자에 대한 프로그래매틱 액세스를
블루투스 API를 사용하는 앱에만 적용됩니다. 이
WifiInfo.getMacAddress()
및
메서드 BluetoothAdapter.getAddress()
개
이제 02:00:00:00:00:00
의 상수 값을 반환합니다.
블루투스 및 Wi-Fi 검색을 통해 근처 외부 기기의 하드웨어 식별자에 액세스하려면 다음 단계를 따르세요.
이제 앱에 ACCESS_FINE_LOCATION
또는
ACCESS_COARSE_LOCATION
권한:
참고: Android 6.0 (API 수준 23)을 실행하는 기기가 백그라운드 Wi-Fi 또는 블루투스 검색을 수행하는 경우 외부 장치에 다음과 같이 작업이 표시됩니다. MAC 주소로부터 전송된다는 것을 의미합니다
알림
이 출시에서는 Notification.setLatestEventInfo()
메서드가 삭제되었습니다. 사용
Notification.Builder
클래스를 사용하여 알림을 구성해야 합니다.
Notification.Builder
인스턴스를 재사용합니다. 먼저
build()
메서드를 사용하여
인스턴스 Notification
개를 업데이트했습니다.
adb shell dumpsys notification
명령어는 더 이상 알림 텍스트를 출력하지 않습니다.
대신 adb shell dumpsys notification --noredact
명령어를 사용하여 텍스트를 출력합니다.
알림을 받습니다.
AudioManager 변경 사항
볼륨을 직접 설정하거나 AudioManager
를 통해 특정 스트림 음소거
클래스는 더 이상 지원되지 않습니다. setStreamSolo()
메서드는 지원 중단되었으므로 다음을 호출해야 합니다.
requestAudioFocus()
메서드를 사용하세요. 마찬가지로
setStreamMute()
메서드
지원 중단됨 대신 adjustStreamVolume()
메서드를 호출하고 방향 값에 전달합니다.
ADJUST_MUTE
또는
ADJUST_UNMUTE
입니다.
텍스트 선택
![플로팅 툴바 내에 새로운 텍스트 선택 기능을 보여주는 화면](https://developer.android.com/static/images/android-6.0/text-selection.gif?authuser=0000&hl=ko)
이제 사용자가 앱에서 텍스트를 선택하면 다음과 같은 텍스트 선택 작업을 표시할 수 있습니다. 잘라내기, 복사, 붙여넣기 플로팅 툴바를 선택합니다. 사용자 상호작용 구현은 다음과 유사합니다. 에 설명된 대로 상황별 작업 모음에 <ph type="x-smartling-placeholder"></ph> 개별 뷰에 상황별 작업 모드 사용 설정
텍스트 선택을 위한 플로팅 툴바를 구현하려면 기존 앱:
View
또는Activity
객체에서 발신자:ActionMode
명startActionMode(Callback)
에서startActionMode(Callback, ActionMode.TYPE_FLOATING)
로 변환.- 기존
ActionMode.Callback
구현을 가져와서 확장합니다. 대신ActionMode.Callback2
하세요. - 이
onGetContentRect()
콘텐츠Rect
객체의 좌표를 제공하는 메서드 (예: 텍스트 선택 직사각형)이 있습니다. - 직사각형 위치 지정이 더 이상 유효하지 않고 이 요소가 무효화될 유일한 요소인 경우
invalidateContentRect()
메서드를 호출합니다.
Android 지원 라이브러리 버전 22.2의 경우 플로팅 툴바는
하위 호환 및 appcompat은 ActionMode
객체를 제어하고
기본값입니다. 이 경우, 부동 툴바가 표시되지 않도록 차단됩니다. 사용 설정
ActionMode
지원
AppCompatActivity
, 통화
getDelegate()
후 호출
반환 시 setHandleNativeActionModesEnabled()
AppCompatDelegate
객체 및 입력 설정
매개변수를 false
로 설정합니다. 이 호출은 ActionMode
객체의 제어권을
살펴봤습니다 Android 6.0 (API 수준 23)을 실행하는 기기에서 프레임워크가
실행 중인 기기에서 ActionBar
또는 플로팅 툴바 모드
Android 5.1 (API 수준 22) 이하에서는 ActionBar
모드만
지원됩니다.
브라우저 책갈피 변경 사항
이 릴리스에서는 전역 책갈피 지원이 제거되었습니다. 이
android.provider.Browser.getAllBookmarks()
및 android.provider.Browser.saveBookmark()
이제 제거되었습니다. 마찬가지로 READ_HISTORY_BOOKMARKS
및 WRITE_HISTORY_BOOKMARKS
도
권한이 삭제됩니다 앱이 Android 6.0 (API 수준 23) 이상을 타겟팅하는 경우
북마크 권한을 사용하거나 북마크 권한을 사용할 수 있습니다. 대신 앱에는
데이터를 내부적으로 북마크에 추가합니다.
Android Keystore 변경 사항
이번 릴리스에서는 Android 키 저장소 제공자는 더 이상 지원하지 않음 동적 검색 광고 ECDSA는 여전히 지원됩니다.
휴식 중일 때 암호화가 필요하지 않은 키는 보안 잠금 화면에서 더 이상 삭제되지 않습니다. 사용 중지 또는 재설정되는 경우 (예: 사용자 또는 기기 관리자) 키 저장 데이터 암호화는 이러한 이벤트 중에 삭제됩니다.
Wi-Fi 및 네트워킹 변경 사항
이 릴리스에서는 Wi-Fi와 네트워킹 API에 다음과 같은 동작 변경 사항이 추가되었습니다.
- 이제 앱에서
WifiConfiguration
객체의 상태만 변경할 수 있습니다. 확인할 수 있습니다 수정하거나 삭제할 권한이 없습니다. 사용자 또는 다른 앱이 만든WifiConfiguration
객체 -
이전에는 앱에서
enableNetwork()
disableAllOthers=true
설정으로, 기기가 다음과 같은 다른 네트워크에서 연결 해제되었습니다. 셀룰러 데이터 이 릴리스에서는 기기가 그러한 다른 네트워크에서 더 이상 연결을 해제하지 않습니다. 만약 앱의targetSdkVersion
이“20”
이하이면 선택한 앱에 고정됩니다. Wi-Fi 네트워크 앱의targetSdkVersion
이“21”
이상이면 멀티네트워크 API (예:openConnection()
,bindSocket()
및 새로운bindProcessToNetwork()
메서드)을 사용하여 네트워크 트래픽이 선택된 네트워크에서 전송되도록 합니다.
카메라 서비스 변경 사항
이 출시에서는 카메라 서비스의 공유 리소스에 액세스하는 모델이 변경되었습니다. 이전의 '선착순' 액세스 모델에서 우선순위가 높은 액세스 모델로 프로세스가 선호됩니다 서비스 동작에 대한 변경 사항은 다음과 같습니다.
- 카메라 하위 시스템 리소스(카메라 기기 열기 및 구성 포함)에 대한 액세스는 신청 절차의 '우선순위'에 따라 부여되며, 애플리케이션 프로세스 사용자에게 표시되는 활동 또는 포그라운드 활동은 일반적으로 우선순위가 더 높아서 카메라 리소스를 더 신뢰할 수 있습니다.
- 우선순위가 낮은 앱에 대한 활성 카메라 클라이언트는 우선순위가 높은 경우 "제거"될 수 있습니다.
애플리케이션이 카메라를 사용하려고 합니다. 지원 중단된
Camera
API에서 그 결과onError()
상태 다시 호출할 수 있습니다Camera2
API에서는 다음과 같은 결과가 발생합니다.onDisconnected()
호출되는 것을 볼 수 있습니다 - 적절한 카메라 하드웨어를 갖춘 기기에서는 별도의 애플리케이션 프로세스가 여러 개의 카메라를 따로 열고 여러 개의 카메라 기기를 동시에 사용할 수 있습니다. 그러나 다중 프로세스 사용 발생할 수 있으며, 동시에 액세스하면 열려 있는 카메라 기기가 이제 카메라 서비스에서 감지되고 허용되지 않습니다. 이 변경사항 다른 앱이 액세스를 시도하게 됩니다.
- 현재 사용자를 변경하면 이전 사용자 계정이 소유한 앱에 활성 카메라 클라이언트가 생깁니다. 있습니다. 카메라에 대한 액세스는 현재 기기 사용자가 소유한 사용자 프로필로만 제한됩니다. 실제로 이는 예를 들어 '게스트' 계정은 카메라 하위 시스템을 사용하는 프로세스입니다.
런타임
이제 ART 런타임이
newInstance()
메서드를 사용하여 지도 가장자리에
패딩을 추가할 수 있습니다. 이
변경사항은 Dalvik이 이전 버전에서 액세스 규칙을 잘못 확인하던 문제를 수정합니다.
앱에서
newInstance()
메서드와 사용자
액세스 확인을 재정의하려면
setAccessible()
메서드와 입력
매개변수를 true
로 설정합니다. 앱에서
v7 appcompat 라이브러리 또는
v7 recyclerview 라이브러리
이러한 라이브러리의 최신 버전을 사용하도록 앱을 업데이트해야 합니다. 그렇지 않은 경우
XML에서 참조되는 맞춤 클래스는 모두 업데이트되므로 클래스 생성자에 액세스할 수 있습니다.
이 릴리스에서는 동적 링커의 동작을 업데이트합니다. 이제 동적 링커는
라이브러리의 soname
와 경로의 차이점
<ph type="x-smartling-placeholder"></ph>
공개 버그 6670)로 대체되었으며, 이제 soname
로 검색이 가능합니다.
있습니다. 이전에 작동했지만 잘못된 DT_NEEDED
항목이 있는 앱
(일반적으로 빌드 머신 파일 시스템의 절대 경로)는 로드 시 실패할 수 있습니다.
이제 dlopen(3) RTLD_LOCAL
플래그가 올바르게 구현됩니다. 참고:
RTLD_LOCAL
가 기본값이므로 명시적으로 사용하지 않은 dlopen(3)
호출
앱에서 명시적으로 RTLD_GLOBAL
를 사용하지 않는 한 RTLD_LOCAL
가 영향을 받습니다. 다음으로 바꿉니다.
RTLD_LOCAL
, 이후 호출로 로드되는 라이브러리에서 기호를 사용할 수 없게 됩니다.
dlopen(3)
(DT_NEEDED
항목에서 참조되는 것과 다름)
이전 버전의 Android에서 앱이 시스템에 공유 라이브러리를 로드하도록 요청한 경우
시스템이 경고를 표시했지만 여전히 라이브러리 로드를 허용했습니다.
이 출시부터 앱의 타겟 SDK 버전이 23인 경우 시스템에서 이 라이브러리를 거부합니다.
또는 그 이상일 수 있습니다. 라이브러리 로드 실패 여부를 감지하는 데 도움이 되도록 앱은
dlopen(3)
실패, 그리고 dlerror(3)
호출 반환이 반환됩니다. 텍스트 재배치 처리에 관한 자세한 내용은 다음을 참고하세요.
가이드를 확인하세요.
APK 유효성 검사
이제 플랫폼이 APK에 대해 좀 더 엄격한 유효성 검사를 수행합니다. APK는 파일이 잘못된 경우 손상된 것으로 간주됩니다. 매니페스트에 선언되지만 APK 자체에는 없습니다. APK가 콘텐츠가 삭제됩니다.
USB 연결
이제 USB 포트를 통한 기기 연결은 기본적으로 충전 전용 모드로 설정됩니다. 액세스 방법 USB 연결을 통해 기기 및 콘텐츠를 전송하는 경우 사용자는 명시적으로 권한을 부여해야 합니다. 상호작용한다는 것입니다. 앱이 USB 포트를 통한 기기와의 사용자 상호작용을 지원하는 경우 상호작용이 명시적으로 사용 설정되어야 한다는 점을 고려해야 합니다.
Android for Work 변경 사항
이 릴리스에는 Android for Work에 대해 다음과 같은 동작 변경 사항이 포함되어 있습니다.
- 업무용 연락처를 개인적인 맥락에서 활용. Google 다이얼러
이제 사용자가 이전 통화를 볼 때 통화 기록에 직장 연락처가 표시됩니다.
설정
setCrossProfileCallerIdDisabled()
true
대신 Google 다이얼러 통화 기록에서 직장 프로필 연락처를 숨깁니다. 직장 연락처는 다음 경우에만 블루투스를 통해 기기에 개인 연락처와 함께 표시setBluetoothContactSharingDisabled()
를false
로 설정합니다. 기본적으로true
로 설정되어 있습니다. - Wi-Fi 구성 삭제: 프로필 소유자가 추가한 Wi-Fi 구성
예를 들어
addNetwork()
메서드)가 삭제됩니다. - Wi-Fi 구성 잠금: 다음에 의해 생성된 모든 Wi-Fi 구성
사용자는 더 이상 활성 기기 소유자를 수정하거나 삭제할 수 없습니다.
WIFI_DEVICE_OWNER_CONFIGS_LOCKDOWN
는 0이 아닙니다. 사용자는 여전히 본인의 Wi-Fi 구성을 생성하고 수정할 수 있습니다. 활성 기기 소유자는 다음을 비롯한 모든 Wi-Fi 구성을 수정하거나 삭제할 수 있는 권한이 있습니다. 다른 리소스도 마찬가지입니다. - Google 계정 추가를 통해 기기 정책 컨트롤러 다운로드: Google 기기 정책 컨트롤러 (DPC) 앱을 통해 관리가 필요한 계정이 기기에 추가됨 이제 계정 추가 흐름에서 사용자에게 적절한 WPC를 갖고 있어야 합니다. 이 동작은 다음을 통해 추가된 계정에도 적용됩니다. 설정 > 계정으로 이동하여 초기 기기 설정 마법사에서 확인할 수 있습니다.
- 특정
DevicePolicyManager
API 동작 변경사항: <ph type="x-smartling-placeholder">- </ph>
- 호출
setCameraDisabled()
메서드가 호출하는 사용자의 카메라에만 영향을 미칩니다. 호출하기에 앞서 카메라 앱에 영향을 줍니다. - 또한
setKeyguardDisabledFeatures()
메서드를 이제 기기 소유자뿐만 아니라 프로필 소유자에게도 사용할 수 있습니다. - 프로필 소유자는 다음과 같은 키가드 제한 사항을 설정할 수 있습니다.
<ph type="x-smartling-placeholder">
- </ph>
KEYGUARD_DISABLE_TRUST_AGENTS
및KEYGUARD_DISABLE_FINGERPRINT
, 이는 포드의 프로필의 상위 사용자에 대한 키가드 설정입니다.KEYGUARD_DISABLE_UNREDACTED_NOTIFICATIONS
관리 프로필에 있는 애플리케이션이 생성한 알림에만 영향을 미칩니다.
DevicePolicyManager.createAndInitializeUser()
및DevicePolicyManager.createUser()
메서드가 지원 중단되었습니다.setScreenCaptureDisabled()
메서드는 이제 지정된 사용자의 앱이 포그라운드에 있을 때 지원 구조도 차단합니다.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM
기본값은 SHA-256입니다. SHA-1은 이전 버전과의 호환성을 위해 계속 지원되지만 삭제될 예정입니다. 있습니다.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM
이제 SHA-256만 허용합니다.- 이제 Android 6.0(API 레벨 23)에 있던 기기 이니셜라이저 API가 제거되었습니다.
EXTRA_PROVISIONING_RESET_PROTECTION_PARAMETERS
이(가) 삭제되어 NFC 마주 대기 프로비저닝해도 초기화 보호 기기를 프로그래매틱 방식으로 잠금 해제할 수 없습니다.- 이제
EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE
를 사용할 수 있습니다. 기기 소유자 앱에 데이터를 전달할 수 있습니다. - Android for Work API는 직장 프로필,
지원 레이어 등이 있습니다. 새
DevicePolicyManager
권한 API에는 M 이전 앱에 영향을 미칩니다. - 사용자가 앱을 통해 시작된 설정 흐름의 동기화 부분에서 나가면
ACTION_PROVISION_MANAGED_PROFILE
또는ACTION_PROVISION_MANAGED_DEVICE
인텐트, 시스템 이제RESULT_CANCELED
결과 코드를 반환합니다.
- 호출
- 다른 API 변경사항:
<ph type="x-smartling-placeholder">
- </ph>
- 데이터 사용량:
android.app.usage.NetworkUsageStats
클래스의 이름이 바뀌었습니다.NetworkStats
입니다.
- 데이터 사용량:
- 전체 설정 변경사항:
<ph type="x-smartling-placeholder">
- </ph>
- 다음 설정은 더 이상
setGlobalSettings()
을 통해 설정할 수 없습니다. <ph type="x-smartling-placeholder">- </ph>
BLUETOOTH_ON
DEVELOPMENT_SETTINGS_ENABLED
MODE_RINGER
NETWORK_PREFERENCE
WIFI_ON
- 이제
setGlobalSettings()
를 통해 이러한 전역 설정을 설정할 수 있습니다. <ph type="x-smartling-placeholder">
- 다음 설정은 더 이상