Android 8.1 (API 수준 27)에는 사용자와 개발자를 위한 새로운 기능과 성능을 제공합니다. 이 문서에서는 개발자를 위한 새로운 기능을 소개합니다.
Android Oreo(Go 버전)
<ph type="x-smartling-placeholder"></ph> Android Go는 Google Play에서 지원하는 Android 앱을 위한 Android 환경을 전 세계적으로 수십억 명이 인터넷에 접속합니다. Android 8.1부터 우리는 Android를 보급형 기기를 위한 훌륭한 플랫폼으로 만들고 있습니다. Android Oreo(Go 버전) 구성의 기능은 다음과 같습니다.
- 메모리 최적화. RAM이 1GB 이하인 기기에서 앱을 효율적으로 실행할 수 있도록 플랫폼 전체의 메모리 사용량을 개선했습니다.
- 유연한 타겟팅 옵션. 새로운 하드웨어 기능 상수를 활용하여 Google Play를 통해 RAM이 보통이거나 낮은 기기에 앱 배포를 타겟팅할 수 있습니다.
- Google Play.Android Oreo(Go 에디션)를 실행하는 기기에서 모든 앱을 사용할 수 있지만, Google Play는 수십억 사용자를 위한 앱 빌드 가이드라인을 구축하여 개발자가 수십억 명의 사용자에게 뛰어난 환경을 제공하기 위해 최적화한 앱을 쉽게 눈에 띄도록 표시합니다.
Google은 Android Oreo(Go 에디션) 실행 기기에 맞게 앱을 최적화하는 방법에 관한 추가 가이드라인으로 수십억 사용자를 위한 앱 빌드 가이드라인을 업데이트했습니다. RAM이 낮은 기기에 APK의 버전을 타겟팅하려는 대부분의 개발자는 기존 APK를 최적화하거나 Google Play의 다중 APK 기능을 사용하는 것이 Android Oreo(Go 에디션) 실행 기기를 준비하는 가장 좋은 방법입니다. 앱을 더 가볍게, 더 효율적으로 만들면 기기와 상관없이 모든 사용자에게 도움이 됩니다.
Neural Networks API
Neural Networks API는 TensorFlow Lite(Google의 모바일용 크로스 플랫폼 ML 라이브러리), Caffe2 등의 온디바이스 머신러닝 프레임워크에 빠른 계산 및 추론 기능을 제공합니다. TensorFlow Lite 오픈소스 저장소를 방문하여 필요한 파일과 문서를 다운로드하세요. TensorFlow Lite는 Neural Networks API와 호환되어 휴대기기에서 MobileNets, Inception v3, Smart Reply와 같은 모델을 효율적으로 실행할 수 있습니다.
자동 완성 프레임워크 업데이트
Android 8.1 (API 수준 27)은 자동 완성의 몇 가지 개선사항을 제공합니다. 앱에 통합할 수 있는 프레임워크입니다.
이제 BaseAdapter
클래스에는 어댑터에 있는 값을 문자열로 표현할 수 있는 setAutofillOptions()
메서드가 포함되어 있습니다. 이는 어댑터에서 값을 동적으로 생성하는 스피너 컨트롤에 유용합니다. 예를 들어 setAutofillOptions()
메서드를 사용하여 사용자가 신용카드 만기일의 일부로 선택할 수 있는 연도 목록을 문자열로 표현할 수 있습니다. 자동 완성 서비스는
데이터가 필요한 뷰를 적절하게 채울 수 있습니다.
또한 AutofillManager
클래스에 notifyViewVisibilityChanged(View, int, boolean)
메서드가 포함됨
의 가시성 변경에 대해 프레임워크에 알리기 위해 호출할 수 있는
볼 수 있습니다 비 가상 구조용 메서드의 오버로드도 있습니다. 그러나 비 가상 구조는 일반적으로
메서드가 이미 프레임워크에 의해 호출되었기 때문에 명시적으로 프레임워크에 알립니다.
View
클래스에 대해 자세히 알아보세요.
또한 Android 8.1에서는 SaveInfo
내에서 CustomDescription
and
Validator
지원을 추가하여 자동 완성 서비스가 저장 UI 어포던스를 맞춤설정하는 기능을 강화합니다.
맞춤 설명은 자동 완성 서비스에서
저장됩니다. 예를 들어 화면에 신용카드가 있는 경우
신용카드 은행 로고, 신용카드 마지막 4자리 숫자 표시
번호 및 만료 번호를 지정합니다. 자세한 내용은
CustomDescription
클래스를 참고하세요.
Validator
객체는 Validator 조건이 충족되지 않을 때 자동 완성 저장 UI가 표시되지 않도록 사용됩니다. 자세한 내용은 Validator 클래스와 하위 클래스인 LuhnChecksumValidator 및 RegexValidator를 참고하세요.
알림
Android 8.1에서는 알림이 다음과 같이 변경됩니다.
- 이제 앱은 초당 한 번만 경고음을 낼 수 있습니다. 이 속도를 초과하는 경고음은 대기열에 추가되지 않고 손실됩니다. 이 변경사항은 알림의 다른 측면에는 영향을 미치지 않습니다. 동작 및 알림 메시지는 계속 정상적으로 게시됩니다.
-
NotificationListenerService
및 RAM이 부족한 경우ConditionProviderService
가 지원되지 않습니다. 다음의 경우true
를 반환하는 Android 지원 기기ActivityManager.isLowRamDevice()
가 호출됩니다.
EditText 업데이트
API 수준 27부터 EditText.getText()
메서드는 Editable
를 반환합니다. 이전에는 CharSequence
를 반환했습니다. 이 변경사항은 Editable
가 CharSequence
를 구현하므로 이전 버전과 호환됩니다.
Editable
인터페이스는
기능을 제공합니다 예를 들어 Editable
도
Spannable
인터페이스를 구현하는 경우
콘텐츠를 EditText
의 인스턴스 내 콘텐츠로 사용하세요.
프로그래밍 방식의 세이프 브라우징 작업
Safe Browsing API의 WebView
구현을 통해 앱에서 다음 작업을 할 수 있습니다.
WebView
인스턴스가 탐색을 시도할 때 감지
Google이 알려진 위협으로 분류한 URL로 보냅니다. 기본적으로
WebView
에서는 사용자에게 알려진 위협에 대해 경고하는 전면 광고를 표시합니다.
이 화면은 사용자에게 URL을 로드하거나 안전한 이전 페이지로 돌아가는 옵션을 제공합니다.
Android 8.1에서는 빌드 시 다음과 같이 알려진 위협에 대응하는 방법을 보여줍니다.
- 앱에서 알려진 위협을 Safe에 보고할지 여부를 제어할 수 있습니다. 탐색을 탭합니다.
- 앱에서 다음과 같은 특정 작업을 자동으로 수행하도록 할 수 있습니다. 사용자가 안전 브라우징을 할 수 있는 URL을 발견할 때마다 알려진 위협으로 분류합니다.
참고: 알려진 위협으로부터 최적의 보호 기능을 사용하려면 다음 단계를 따르세요.
세이프 브라우징을 초기화한 후에
WebView
객체의 loadUrl()
메서드와 일치해야 합니다.
다음 코드 스니펫은 앱의 인스턴스에
WebView
: 보안 침해 발생 후 항상 안전한 위치로 돌아가
알려진 위협:
AndroidManifest.xml
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:valu>e=&qu<ot;true">;< / /a>pplication /manifest
MyWebActivity.java
Kotlin
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
자바
private WebView superSafeWebView; private boolean safeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); superSafeWebView = new WebView(this); superSafeWebView.setWebViewClient(new MyWebViewClient()); safeBrowsingIsInitialized = false; superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { safeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); }
MyWebViewClient.java
Kotlin
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
자바
public class MyWebViewClient extends WebViewClient { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. @Override public void onSafeBrowsingHit(WebView view, WebResourceRequest request, int threatType, SafeBrowsingResponse callback) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true); Toast.makeText(view.getContext(), "Unsafe web page blocked.", Toast.LENGTH_LONG).show(); } }
동영상 미리보기 이미지 Extractor
MediaMetadataRetriever
클래스에는 새 메서드 getScaledFrameAtTime()
가 있습니다.
지정된 시간 위치에 가까운 프레임을 생성하고 가로세로 비율이 동일한 비트맵 반환
비율도 소스 프레임으로 나타내지만 특정 너비와 높이의 직사각형에 맞도록 조정됩니다.
높이. 이는 동영상에서 미리보기 이미지를 생성할 때 유용합니다.
메모리를 낭비할 수 있는 getFrameAtTime()
보다는 이 메서드를 사용하는 것이 좋습니다.
소스 동영상과 해상도가 같은 비트맵을 반환하기 때문입니다. 대상
예를 들어 4K 동영상의 프레임은 16MB의 비트맵으로
썸네일 이미지가 필요합니다.
Shared Memory API
Android 8.1(API 수준 27)에서는 새로운 SharedMemory
API를 도입합니다. 이 클래스를 사용하면 익명의 애플리케이션을 만들고, 매핑 및 관리할 수 있습니다.
SharedMemory
드림
인스턴스를 만들 수 있습니다 메모리 보호 설정
위치:
SharedMemory
드림
및/또는 쓰기를 위한 객체를 제공하며
SharedMemory
드림
객체가 Parcelable이면 AIDL을 통해 다른 프로세스로 쉽게 전달할 수 있습니다.
SharedMemory
API는 NDK의 ASharedMemory
시설과 상호 운용됩니다.
ASharedMemory
님이 액세스 권한을 부여합니다.
파일 설명자에 매핑하여 읽기 및 쓰기에 매핑할 수 있습니다. 이 방법을 사용하면 앱 간에 또는 단일 앱의 여러 프로세스 간에 대량의 데이터를 편리하게 공유할 수 있습니다.
WallpaperColors API
Android 8.1(API 수준 27)에서는 라이브 배경화면이 시스템 UI에 색상 정보를 제공할 수 있습니다. 비트맵이나 드로어블에서 WallpaperColors
객체를 만들거나 직접 선택한 세 가지 색상을 사용하면 됩니다.
이 색상 정보를 검색할 수도 있습니다.
WallpaperColors
객체를 만들려면 다음 중 하나를 실행합니다.
WallpaperColors
생성 객체를 만들려면WallpaperColors
의 인스턴스를 만듭니다. 클래스에 기본 색과 보조 색, 3차 색을 전달하면 됩니다. 기본 색상은 null이 아니어야 합니다.WallpaperColors
생성 객체를 비트맵에서 반환하도록 하려면fromBitmap()
메서드를 사용하여 비트맵 소스를 매개변수로 전달할 수 있습니다.WallpaperColors
생성 객체를 드로어블로 가져온 경우,fromDrawable()
를 호출합니다. 메서드를 사용하여 드로어블 소스를 매개변수로 전달할 수 있습니다.
배경화면에서 기본, 보조, 3차 색상 세부정보를 검색하려면 다음 메서드를 호출합니다.
getPrimaryColor()
: 배경화면에서 시각적으로 가장 대표적인 색상을 반환합니다.getSecondaryColor()
은 배경화면에서 두 번째로 두드러진 색상을 반환합니다.getTertiaryColor()
메서드는 배경화면에서 세 번째로 두드러진 색상을 반환합니다.
라이브 배경화면의 중요한 색상 변경을 시스템에 알리려면 notifyColorsChanged()
메서드를 호출합니다. 이 메서드는 onComputeColors()
수명 주기를 트리거합니다.
새 WallpaperColors
을 제공할 기회가 있는 이벤트
객체를 지정합니다.
색상 변경의 리스너를 추가하려면 addOnColorsChangedListener()
메서드를 호출하면 됩니다. getWallpaperColors()
메서드를 호출하여 배경화면의 기본 색상을 검색할 수도 있습니다.
지문 업데이트
FingerprintManager
클래스에 다음과 같은 오류 코드가 추가되었습니다.
-
FINGERPRINT_ERROR_LOCKOUT_PERMANENT
– 사용자가 시도함 기기를 잠금 해제하지 못할 수 있습니다. -
FINGERPRINT_ERROR_VENDOR
– 공급업체의 지문 판독기에서 오류가 발생했습니다.
암호화 업데이트
Android 8.1에서는 여러 가지 암호화 변경이 실행되었습니다.
- Conscrypt에서 새로운 알고리즘이 구현되었습니다. Conscrypt 구현은 기존의 Bouncy Castle 구현보다 우선적으로 사용됩니다. 새로운 알고리즘은 다음과 같습니다.
<ph type="x-smartling-placeholder">
- </ph>
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
Cipher.getParameters().getParameterSpec(IvParameterSpec.class)
명 불참 GCM을 사용하는 알고리즘에서 더 오래 작동합니다. 대신getParameterSpec(GCMParameterSpec.class)
- TLS와 관련된 많은 내부 Conscrypt 클래스가 리팩터링되었습니다. 이후
개발자들은 때때로 이러한 정보에 액세스하는데, 심은 여러 번
이전 사용을 지원하지만 일부 세부정보는 변경되었습니다. 예: 소켓
이전에는
OpenSSLSocketImpl
유형이었지만 지금은 다음 유형입니다.ConscryptFileDescriptorSocket
또는ConscryptEngineSocket
, 둘 다OpenSSLSocketImpl
- null 참조가 전달될 때
IllegalArgumentException
을 발생시키는 데 사용되었던SSLSession
메서드가 이제NullPointerException
을 발생시킵니다. - RSA
KeyFactory
는 더 이상 인코딩된 키보다 큰 바이트 배열에서 키를 생성할 수 없습니다. 키 구조가 전체 버퍼를 채우지 않는KeySpec
를 제공하는generatePrivate()
및generatePublic()
호출은InvalidKeySpecException
을 초래합니다. - 소켓이 닫혀서 소켓 읽기가 중단되면 Conscrypt가
읽기에서 -1을 반환합니다. 이제 읽기가
SocketException
을 발생시킵니다. - 루트 CA 인증서 모음이 변경되어 대량의 오래된 인증서가 대부분 삭제되었지만 WoSign 및 StartCom의 루트 인증서도 삭제되었습니다. 이 결정 사항에 관한 자세한 내용은 Google 보안 블로그 게시물 WoSign 및 StartCom 인증서에 대한 신뢰 최종 삭제를 참고하세요.