상세 컨텐츠

본문 제목

[Android] 안드로이드 (Android) API 타겟(Target) 29로 업데이트 시 주요 변경된 권한과 동작 변경사항들

프로그래밍/안드로이드

by 우뇽킴 2020. 9. 12. 22:20

본문

안녕하세요~ 우뇽킴입니다.

 

지난번 블로그 게시글 소개 시 앱의 안드로이드(Android) API 타겟 29로 업데이트 하는 방법에 대해서 소개했었는데요~

 

(참고 : unyongkim.tistory.com/7 )
 

Android Studio에서 Google Play 업로드 대상 API 레벨 요구사항 충족(API Target Upgrade)하기

매년마다 구글 안드로이드에서는 새로운 버전의 OS가 나옵니다. 이미 몇년 전부터 마시멜로우(Android 6.0), 누가(Android 7.0), 오레오(Android 8.0), 파이(Android 9.0) 등의 이름으로 OS가 출시되어왔습니다.

unyongkim.tistory.com

 

이번 블로그 소개 글에서는 기존 앱 빌드 타겟이 28에서 29로 변경 시 달라지게 되는 변경된 권한들과 동작 변경사항들을 소개하고자 합니다.

 

 

1.  Scoped Storage 권한

Android 10 (API level 29)를 Target API로 설정한 앱이 Android 10이상의 단말기기에 설치되는 경우, 외부저장소(External Storage)에 대해 Scoped Storage(지정된 범위 저장소) 모드로 동작하게 됩니다.

 

지정된 범위 저장소(Scoped Storage)에 대한 자세한 개념에 대해서는 저보다 더 자세하게 설명된 블로그 글이 있어서 아래의 링크를 참고하시기 바랍니다.

 

(참고 : brunch.co.kr/@huewu/14)

 

 

안드로이드 Q Scoped Storage에서 살아남기

개발자를 위한 안드로이드 Q #6 | 시작하기 전에 이 포스트는 안드로이드 Q 베타 2 패치 버전을 기준으로 작성되었습니다. Q 정식 버전에서는 기능 및 API가 변경될 수 있습니다. 기능에 관한 소감�

brunch.co.kr

즉, API 29로 타겟팅되어 변경된 앱이 안드로이드10 이상의 기기에서 설치될 경우, '지정된 범위 저장소(Scoped Storage)'모드가 동작하며 아래와 같은 현상이 발생합니다.

 

사용자 저장소 접근권한 허용하더라도, 외부 파일 접근 불가능

 

이런 현상이 발생하는 것을 막기 위한 방법으로는 앱 사용자 입장에서는 '방법1'로 해결하고,

앱 개발자 입장에서는 앱 사용자를 위하여 '방법2'를 통하여 문제를 해결해야 합니다.

 

방법1 : 접근하기 위해서는 해당 파일이 앱이 설치된 폴더로 복사해서 가져와야 함.

방법2 : AndroidManifest.xml 에 requestLegacyExternalStorage="true" 설정 )

 

 

 

 

2 AndroidX

build.gradle에서 API 레벨 28까지 타겟팅된 앱까지는 안드로이드 지원 라이브러리(Android Support Library) dependencies가 아래와 같은 표시됩니다.(개발자가 어떤 안드로이드 지원 라이브러리를 쓰느냐에 따라 아래와 다를 수 있습니다.^^;)

 

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28+'
    implementation 'com.android.support:design:28+'
    implementation 'com.android.support:cardview-v7:28+'
}

 

그러나, API레벨 29부터 타겟팅되는 앱에서는 위와 같이 표기된 dependencies 내에 안드로이드 지원 라이브러리를 AndroidX로 마이그레이션(Migration)해주어야 합니다.

(AndroidX는 기존에 사용 중인 com.android.support.* 라이브러리들을 하나로 통합한 것이라고 생각하시면 됩니다.)

 

 

변경하는 방법은 간단합니다.

 

안드로이드 스튜디오에서 'Refactor > Migrate to AndroidX...'만 클릭하면, 바로 마이그레이션이 시작됩니다.

 

그럼 아래와 같이 변경됩니다.

 

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.cardview:cardview:1.0.0'

}

 

AndroidX에 대한 더 자세한 설명은 아래의 블로그에 더 자세히 설명되어있으니 참고하시기 바랍니다.

 

 

(참고 : eunplay.tistory.com/62)
 

[Android] AndroidX 개요

이번 시간은 Android Support Library를 대체하는 AndroidX에 대하여 알아보도록 하겠습니다 AndroidX 개요 - AndroidX는 Android팀이 Jetpack 내에서 라이브러리를 개발, 테스트, 패키지화, 버전 및 릴리스하기..

eunplay.tistory.com

 

 

 

 

3. 기기 고유 식별자(Device Unique Idenfider) 제한

 

이것은 안드로이드 안드로이드 10에서부터는 사용자의 기기에 '고유 식별자(Unique Idenfier)'에 대해서 제한을 합니다. (타겟 29로 설정과 상관없이 안드로이드10이 설치된 기기의 모든 앱에 해당)

 

즉, 더 이상 앱에서 사용자 기기에 기기 고유 식별자를 얻으려고 할 경우, 기기가 앱이 요청한 기기 고유 식별자를 더이상 제공하지 않는다는거죠.

 

개발자가 개발한 앱에서 앱이 설치된 사용자 기기에 아래와 같은 호출들이 있을 경우 영향을 받는데요.

 


Build.getSerial()

Build.SERIAL

TelephonyManager.getSerial()
TelephonyManager.getImei()
TelephonyManager.getDeviceId() 
TelephonyManager.getMeid()
TelephonyManager.getSimSerialNumber()
TelephonyManager.getSubscriberId()

getMacAddress() 


위의 메소드들을 호출하게되면, API Level 28까지는 반환값으로 고유기기식별자값이 반환이 되었으나,

안드로이드10 터는 이 반환값이 모두 NULL로 반환됩니다.

(단, getMacAddress()는 반환값이 02:00:00:00:00 으로 반환됩니다.)

 

앱 개발자가 사용자의 기기고유식별자로 푸시 서비스(Push Service) 또는

다른 타 서비스 호출을 이용하고 있었을 경우, 안드로이드10부터는 정상적으로 동작 못하기 때문에 기기 고유식별자를 이용하는 방법이 아닌 다른 방법을 이용해야 합니다.

 

기기 고유 식별자 제한에 다른 권장사항에 대한 자세한 사항이 브런치 @huewu님의 글에 자세히 소개되어 있어 참고하시기 바랍니다.

 

(참고 : brunch.co.kr/@huewu/9)
 

안드로이드 Q 기기 고유 식별자(IMEI 등) 제한

개발자를 위한 안드로이드 Q #3 | 시작하기 전에... 본 포스트는 디바이스 ID 관련된 내용을 다루며, 3월 14일 공개된 안드로이드 Q 베타 버전 기준으로 작성되었습니다. 이후, 정식 버전에서는 기�

brunch.co.kr

 

 

 

 

4. 백그라운드에서 Activity 시작에 대한 제한 

Android 10 이상 기기(타겟29 타겟팅하는 앱과 상관없이)에서 백그라운드에서 실행될 때 Activity를 시작할 수 있는 시점에 제한이 되는 사항이 추가 되었습니다. 이 제한은 사용자에 대한 방해를 최소화시키기 위한 제한사항이고,  반드시 Activity가 실행되어야할 경우, 직접 Acitivity를 실행하는 대신 노티피케이션(Notification) 기능을 활용해야 합니다.

 

 

 

 

개발하시는 Android API Level29로 타겟팅 시 참고하시기 바랍니다~

 

관련글 더보기

댓글 영역