안드로이드 11 주요 변경점 요약

[Google / GDG Korea 가 주최하는 안드로이드 11 웨비나] 의 안드로이드 11 호환성 확보하기 밋업을 들으며 필기했던 내용 공유합니다.

출처 : Google / GDG Korea 가 주최하는 안드로이드 11 웨비나

30분으로 끝내는 Android 11 요약 정리

  • 사용자 정보 보호
    • Android 9
      • 백그라운드에서 마이크 / 카메라 등 센서 정보 사용 제한
      • 새로운 CALL_LOG 권한 그룹 추가
      • WI-Fi 스캔 기능은 정밀한 위치 권한 요구
    • Android 11
      • 권한 자동 재설정
        • 타깃 SDK가 Android 11 이상인 앱의 경우, 사용자가 사용하지 않는 앱의 런타임 요청 권한이 자동으로 초기화됨 ( 타깃 SDK 버전이 11미만인 경우에도 사용자가 명시적으로 해당 기능 적용 가능 )
        • 사용자가 몇개월간 사용하지 않는 경우 권한 해제
        • 평균적으로 60 ~ 90개의 앱이 스마트폰에 설치되지만, 25개만 이용 하고 75%는 한번만 사용 → 사용 안하는 앱이 개인정보를 가지고 있을 수 있음
      • 패키지 공개 상태
        • 타깃 SDK가 Android 11 이상인 앱의 경우, 디바이스에 설치 된 다른 앱 목록을 알 수 없음
        • 특정 패키지 설치 여부를 꼭 확인 할 필요가 있는 경우, 앱 매니페스트에 미리 선언
        • Content provider → QUERY_ALL_PACKAGES 설치된 앱 목록을 확인 할 수 있는권한이지만, Google play 정책으로 사용이 제한 될 수 있음
      • 일회성 권한
        • 타깃 SDK 버전과 관계 없이, 카메라 / 마이크 / 위치 권한에 적용
        • 이번만 허용 이라는 옵션, 앱이 포그라운드에 있는 경우에만 허용 -> 일정시간이 지나면 권한 해제
      • 백그라운드 위치 엑세스
        • 타깃 SDK 버전과 관계 없이, 위치 권한 요청 시, 항상 허용 옵션이 제외됨 ( 시스템 설정 화면에서 항상 허용 옵션을 킬 수 있음 )
        • 단순한 요청 allow / deny 였고, fore / background 관계 없이 허용했음
        • 백그라운드 위치 권한은 런타임 퍼미션에선 아예 빠짐
        • 포그라운드 위치 권한을 획득한 후에 별도 ui를 통해 허용 받아야함
        • 권한 받기 상당히 어려워짐 → 사용자들의 개인정보 보호
      • 범위지정저장소 적용
        • 타깃 SDK가 Android 11 이상인 앱의 경우 반드시 적용
        • 별도 권한 요청 없이 적용 ( 앱별 디렉토리에 자유롭게 읽고 쓰기 가능 / 공유 저장소에 파일 생성 가능 / 자신이 생성한 파일은 읽기 및 쓰기 가능 )
        • MediaStore / Downloads + other files 로 나뉨
          • 다른 앱은 원칙적으로 Download 폴더에 있는 파일은 접근 불가
        • MANAGE_EXTERNAL_STORAGE → 특별한 경우 아니면 사용 불가 ( 백신 / 파일 탐색기 앱 … 만 사용 가능 )
      • 카메라, 마이크 포그라운드 서비스 타입
        • 타깃 SDK가 Android 11 이상인 앱의 경우 적용
        • 매니페스트 상에 올바른 타입 선언을 하지 않은 경우, 포그라운드 서비스에서 카메라, 마이크 접근 금지 ( 10에서의 위치 데이터 정보 얻는것과 유사 )
        • 하나의 서비스가 두개이상의 타입을 가지는것 가능
      • 데이터 액세스 분석
        • 권한이 필요한 기능을 수행하는 코드를 확인
        • 앱에 포함된 SDK에서 사용하는 경우도 확인 가능
  • 사용자를 위한 혁신
    • 대화 공간 기능
      • 알림 영역 최상단에 별도의 대화 공간이 추가됨
      • MessagingStyle이 적용 된 알림을 해당 공간에 표시
      • 버블 및 중요 대화 표시 등 대화와 과련된 추가 기능을 제공
      • 서로 다른 앱이라도 표시됨
    • 버블
      • 안드로이드 11 버전에서는 개발자 미리보기 형태로 지원
      • 앱이 버블 기능을 지원하는 경우, 사용자는 원하는 대화를 버블 형식으로 표시 가능
      • 버블을 탭하면 등록된 액티비티가 화면 가장 전면에 표시
    • 중요 대화
      • 대화 알림을 길게 누른 후 대화 중요도 설정 가능
      • 중요 대화는 방해 금지를 무시할 수 있음
    • 새로운 미디어 컨트롤 UI
      • Android 11 베타 2 버전부터 기본 지원
      • MediaSession을 포함한 MediaStyle 알림 사용 시 , 자동으로 새로운 UI 적용
      • 빠른 설정 패널상에 위치, 쉽게 미디어 컨트롤 가능
      • 미디어 출력 장치를 손쉽게 변경 가능
      • MediaBrowserService가 요구사항을 만족하면, 디바이스 재부팅 후에도 미디어 컨트롤 UI가 유지됨
    • 외부 장치 컨트롤
      • IOT 디바이스들을 쉽게 제어할 수 있는 화면 추가
      • 픽셀폰은 전원버튼 꾹
      • 스마트 조명 등, 외부 장치를 빠르게 확인하고 컨트롤 할 수 있는 UI제공
      • 개발자는 ControlsProviderService를 구현하여 직접 구현 가능
      • 사용자는 여러 ControlsProvider중 하나를 선택 가능 ( 노티 와 비슷한 방식 )
      • 미리 정해진 템플릿을 활용 하여 UI를 표현 ( 현재는 정적버튼, 토글, 범위, 토글 + 범위 , 온도 템플릿 존재 )
    • 키보드 전환 애니메이션
      • 앱에서 키보드 전환 애니메이션을 확인하고, 앱의 동작을 변경 할 수 있는 새로운 api 제공
      • 사용자가 원하는대로 키보드 전환 애니메이션을 변경 할 수 있음
      • System window 애니메이션에 따른 콜백 불림
        v.onApplyWindowInsetsListener = ...
        v.windowInsetsAnimationCallback = object {
          fun onProgress(insets: WindowInsets) {
            v.setY(calculateYFor(insets))
          }
        }
        
      • System Window 애니메이션 조절
      • 앱 내 동작에 따라 키보드 조절 가능 키보드 Triggering 주체가 view 가 됨
          v.windowInsetsControler
            .controlInputMethodAnimation() { anim ->
              anim.setInsetsAndAlpha(calcInsets(), ...)
            }
      
    • 키보드와 통합된 자동 완성 제안
      • Autofill framework
      • Jetpack Autofill
        • Autofill에서 원하는 데이터를 키보드에 제안 할 수 있는 새로운 api 추가
        • Autofill에서 가져온 데이터를 키보드에 표시 할 수 있는 새로운 api 추가
      • 키보드 자동완성 앱 구현할경우 고려
    • 이미지 복사 및 붙여넣기
      • 크롬 브라우저에서 이미지 복사 기능 지원
      • G-board의 키보드 제안 팁에 이미지 클립보드 표시
      • Jetpack RichContentReceiverCompat
        • 쉽게 이미지 붙여넣기 기능을 구현할 수 있도록 도와줌
  • 새로운 디바이스 지원
    • 다양한 종류의 화면 ( foldable / … )
    • Hinge 센서 타입
      • Android 11 에서 추가
      • 디바이스가 접힌 각도 확인 가능
      • 디바이스마다 개별 처리가 필요 할 수 있음
    • Jetpack windows manager
      • android 11 이전에도 사용가능
      • 윈도우 타입, 영역, 상태정보 확인 가능
      • 디바이스의 자세 정보를 확인 가능 ( 완전히 열려있는지, 반쯤 접혔는지 등등 … )
    • 다양한 화면 크기 지원
      • 앱 동작 중 윈도우 크기 변화에 대응하는 코드 구현
      • 테스트 후 매니페스트 상에 지원 가능한 비율 / 크기를 선언
      • 멀티 윈도우 모드를 지원 여부를 확인
      • Android 호환성 정의 문서
        • 최소 윈도우 크기 : 320dp
        • 멀티 윈도우 최소 윈도우 크기 : 220dp
        • 화면 비율 : 앱이 정의한 값을 준수
      • 다양한 디바이스 테스트
        • Chrome OS등은 테스트 어려움
        • preform activity test
        • 다양한 폴더블 기능도 테스트 가능 한 기능 준비중임
      • 5G를 위한 기능
        • 무제한 네트워크 확인
          • 통신사와 협력을 ㅇ통해 무제한 네트워크 여부를 보다 정확하게 파악
        • 네트워크 속도 예측
          • 예측된 속도의 정확성이 향상됨
        • 5G 연결 여부 확인
          • PhoneStateListener
    • 출시일정 ?
      • July ~

호환성 확보하기

  • 사용자 정보 보안을 위한 Android 11 업데이트
    • 사용자 정보 보호 → 엄청 많은데, 왜 ?
      • 개인 정보 보호라는 관점에서 스마트 디바이스가 너무 중요해서
    • 사용자 정보 보호 원칙
      1. 최소한의 권한만 요청
      2. 필요할 때 권한 요청
      3. 사용자가 권한을 허용하지 않은 경우 올바르게 처리
        1. 앱 올바르게 사용 가능해야함
      4. 사용자가 예상할 수 없는 상황에서 사용자 정보에 접근하지 않음
      5. 사용하는 라이브러리에 주의
        1. 모르는 사이에 라이브러리에서 접근 할 수 있기 때문
    • 데이터 액세스 분석
      • 어떤 코드에서 어떤 권한을 사용하는지 알기 어려움
      • Legacy를 사용하면 더 어려움
      • 어떤 코드에서 권한이 필요한 api호출이 일너나는지 알 수있는 콜백
        • 콜백 등록

        pic1.png

        stacktrace에서 확인 가능

      • 속성 태그 기능
        • createAttributtionContext

        pic2.png

      • 맵을 그릴 수 있음

        pic3.png

    • 일회성 권한
      • 앱이 카메라 / 마이크 / 위치 권한 요청 시 이번만 허용 권한 요청 사용 가능
      • 홈 / 앱 전환 등 백그라운드로 들어가면 시스템 내부 타이머 돌아감 → 타이머 만료되면 권한 제거 됨
      • 앱 resume시 타이머 초기화
      • 일정 시간 → 아직 정해진 건 없음 ( 충분한 시간이다 ! 라고만 말함 )
      • 일회성 권한인지 아닌지는 알 수 없음
      • 코드 수정 할 필요가 있나 ? ( 거의 없음 )
        // Persudo code 
        when {
          checkSelfPermission() == GRANTED -> {
      
          }
          shouldShowRequestPermissionRationale() -> {
            // Show request permission rationale 
          }
          else -> {
            requestPermissions(...)
          }
        }
      
      • 권한 요청 및 처리를 위해 Jetpack activity result api ( 알파단계 )
        • startActivityForResult 를 대체 할 수 있음
        • 개발자 사이트에선 적극권장됨
          // Request permission contract
          private val requestPermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) {
            isGranted -> // Do something if permission granted 
          }
        
          private fun requestBluetoothPermission() {
            requestPermission.launch(permission.BLUETOOTH)
          }
        
    • 카메라, 마이크 포그라운드 서비스 타입
      • 타깃 SDK가 android 11 이상의 앱의 경우 적용
    • 백그라운드 위치 권한
      • Android 10 vs Android 11
      • 항상 허용 없어지고 이번만 허용 생김

      pic4.png

      pic5.png

      • 점진적 권한 요청 ?
        • 포그라운드 위치 권한 획득 후에, 백그라운드 위치 권한을 요청 해야함
        • 포그라운드 위치 없이 백그라운드 요청 → 자동 거부
        • target SDK가 11 이상인 경우

        pic6.png

        • target SDK가 11 미만인 경우 ( 호환성 차원으로 제공 )

        pic7.png

        • 점진적 권한 요청 ( target SDK가 11 미만인 경우 )

        pic8.png

        • 권한 대화 상자 ( dialog )

        pic9.png

      • 권한 자동 재설정
        • 타깃 SDK가 android 11 이상인 앱의 경우 사용자가 사용하지 않는 앱의 권한이 자동으로 거부됨
        • Android 11 미만에도 명시적으로 적용 가능
        • 런타임 권한 요청을 통해 부여된 권한들이 적용 대상
        • 권한 자동 재설정 알림 ( system 알림이 사용자에게 표시됨, 삭제할수도 권한 다시 줄수 도 있음 )
      • 다른 앱 위에 그리기 권한
        • 타깃 SDK 관계 없이 적용
        • SYSTEM_ALERT_WINDOWS 자동 획득
          • ROLE_CALL_SCREENING
          • MEDIA 캡처중인 앱
        • ACTION_MANAGE_OVERLAY_PERMISSION
          • 대상 패키지 지정 불가
          • 사용자가 명시적으로 앱을 선택해야만함
        • 점점 제한 세짐
      • READ_PHONE_NUMBERS
        • 전화번호를 가져오는 용도
        • 더욱 철저하게 관리 될 예정 ( 꼭 필요한 경우에만 사용하라 ) ```XML

        ```

      • 패키지 공개 상태
        • 타깃 SDK가 11 이상인 앱의 경우, 디바이스에 설치 된 다른 앱의 목록을 알 수 없음
        • 꼭 확인하려면 매니페스트에서 선언
        • 패키지 공개 상태

          pic10.png

        • 특정 패키지 설치 여부 확인
          • 확인할 패키지 이름을 명시적으로 선언해두는것
            <manifest>
              <queries>
                <package android:name="com.example.store" />
                <package android:name="com.example.service" />
                ...
              </queries>
              ...
            </manifest>
          
          • 특정 intent를 처리하는 앱 목록 확인 ( 이미지 공유가 가능한 앱을 확인 )
            <manifest>
              <queries>
                <intent>
                  <action android:name="android.intent.action.SEND" />
                  <data android:mimeType="image/jpeg" />
                </intent>
              </queries>
              ...
            </manifest>
          
          • 특정 Content Provider를 확인
            <manifest>
              <queries>
                <provider android:authorities="com.example.settings.files" />
              </queries>
              ...
            </manifest>
          
          • 모든 앱 목록을 확인
            • 정말 특별한 경우 아니면 Google Play 정책에 의해 허용 불가
            <manifest>
              <use-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
              ...
            </manifest>
          
      • Mac Address
        • 타깃 SDK 버전이 30 이상인 경우 정말로 Mac adress를 사용 할 수 없음

저장소 및 일반적인 호환성 확보 방안

  • 범위 지정 저장소란 ?
    • 앱 고유의 저장소에는 제한 없이 접근 가능
    • 미디어 다운로드 수정도 제약 없이 가능
    • 실행 시에 얻은 권한으로는 공유 미디어 읽기만 가능
    • 공유 미디어 변경 시 허가받아야함
    • MediaStore api를 이용 하는 경우 에만 적용 ( ndk 등을 이용 할 땐 불가 )
  • 미디어 수정
    • 본인의 앱에서 만든 미디어가 아닌 경우 요청
    • createWriteRequest
  • 휴지동과 즐겨찾기 기능 추가
    • createTrashRequest
    • createFavoriteRequest
  • Android studio 4.2 부터는 한번에 테스트 가능
  • Google play console → statistics에서 Time series 총 누적 사용 시간 알 수 있음
  • 앱 저장소의 격리
    • Android 11에서 동작하는 모든 앱은 타 앱의 외부 저장소에 접근 불가
  • 마이그레이션 팁
    • Use legacy flag ( for api 29 )
    • Storage access framework ( api 19 + )
    • use new api in mediastore to modify media
    • delete access to root level directory
    • use content provider
  • App compatibility Framework
    • 호환성에 영향을 미치는 기능을 끄고 켜가면서 디버깅 할 수 있음
    • 시스템 설정, ADB 명령어, 로그 출력지원, 그리고 targetSDK

Question ?

  • Query_all_packages 가이드라인 어디있나 ?
    • 구글 플레이 정책 아직 안나옴 ( 2020.07.17, Usecase가 명확한 앱이라면 허용, 아니면 허용 불가 )
  • 버블을 표시하지 않게는 못만든다.
  • 버블과 관련된 특별한 퍼미션이 추가되지는 않는다.
  • compileVersion == TargetSDK 버전이 권장됨
  • 버블 ui 커스터마이징은 불가, pending intent 는 개발자몫
  • exoplayer → notification 자체를 customview를 사용하지 않고, mediasession 과 연동시켜서 사용하면 새로운 미디어 컨트롤 ui 가 사용 될 것
  • 1회성 권한 허용으로 허용 된 경우 앱에서 현재 허용 된 퍼미션이 일회성인지, 영구적인지 알 수 있나 ?
    • 없다. 필요도 없다.