2021년 1월 25일 월요일

[Android] 안드로이드 버젼 별 정리/IMEI대응책

 안드로이드 초기에는 그냥 막 아무렇게나 권한 요청하고 백그라운드에서 몰래 위치추적앱돌려서 유명해진 앱도 있고 했는데, 최근업데이트에서는 개인에 대한 정보, 보안 등이 매업데이트마다 강화되어 변경점이 생겼다.

버젼 히스토리를 보자.

플랫폼 버전API 레벨플랫폼 명버전 코드주요변경사항링크자료
Android 10.029QQAndroid Scoped Storage모드추가(앱별 파일샌드박스제한)
다크테마지원
백그라운에서 위치정보접근시 권한 요청
IMEI획등불가
Scoped Storage관련자료
Q정리
Android 928PieP백그라운드에서 센서제한(마이크,카메라등도포함)
SSID, BSSID를 얻기위해선location service도 활성화필요
getconnectionInfo, getScanResult제거
통화로그/전화번호 엑서스 제한
RGBA 처리
Android 8.127OreoO_MR1
Android 8.026OreoOPIP지원
앱에 말풍선지원
암시적 브로드캐스크금지
백그라운드 서비스/위치정보 엄격해짐
WebView자동완성기능무효화
입력폼 자동완성 프레임워크기능
Android 7.1.1
Android 7.1
25NougatN_MR1
Android 7.024NougatN화면분할지원
파일시스템권한변경
Vulkan API지원
알림창 바로답장지원
Doze모드
인스턴트앱지원
Android 6.023MarshmallowM
일부 권한에 런타임시에 요청하도록변경
Apache HTTP 클라이언트제거(HttpUrlConnection사용하도록권장)
Android 5.122LollipopLOLLIPOP_MR1머트리얼디자인적용
AOT컴파일러로 변경
Android 5.021LollipopLOLLIPOP
Android 4.4W20KitKat WearKITKAT_WATCH
Android 4.419KitKatKITKAT
Android 4.318Jelly BeanJELLY_BEAN_MR2
Android 4.2
Android 4.2.2
17Jelly BeanJELLY_BEAN_MR1
Android 4.1
Android 4.1.1
16Jelly BeanJELLY_BEAN
Android 4.0.3
Android 4.0.4
15IceCreamSandwichICE_CREAM_SANDWICH_MR1
Android 4.0
Android 4.0.1
Android 4.0.2
14IceCreamSandwichICE_CREAM_SANDWICH
Android 3.213HoneycombHONEYCOMB_MR2
Android 3.1.x12HoneycombHONEYCOMB_MR1
Android 3.0.x11HoneycombHONEYCOMB
Android 2.3.4
Android 2.3.3
10GingerbreadGINGERBREAD_MR1
Android 2.3.2
Android 2.3.1
Android 2.3
9GingerbreadGINGERBREAD
Android 2.2.x8FroyoFROYO
Android 2.1.x7EclairECLAIR_MR1
Android 2.0.16EclairECLAIR_0_1
Android 2.05EclairECLAIR
Android 1.64DonutDONUT
Android 1.53CupcakeCUPCAKE
Android 1.12BaseBASE_1_1
Android 1.01BaseBASE

롤리팝 부터는 개발자들이 공포를 느낄만큼 매년 굵직한 변화를 가져다 줬다.

현재단말에 기능에 따라서 분기 처리 해줘야 될때가 있는데,  Android OS에 기본적으로 포함된

Build.VERSION.SDK_INT 숫자값을 체크하여 현재 단말이 어떤 버젼인지 알수 있다.

대부분은 특정 버젼이하인지 체크할때 쓰는데, 

if(Build.VERSION.SDK_INT >= 19){ 

 }

또는 버젼의 코드네임을 이용하여

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES. KITKAT){

}

Android 10부터는 구글이 숫자로만 하겠다고 하니 코드네임은 앞으로는 쓸일이 없을지도 모르겠다.

이밖에 Build.VERSION에 포함된 상수들이 있는데, 릴리즈버젼인지 베타인지 등을 알려주는 상수등이 포함되어 있다.

이밖에 

Build 에는 아래와 같은 여러가지 상수들이 있다.

Build.BOARD

Build.BRAND

Build.CPU_ABI

Build.DEVICE

Build.DISPLAY

Build.FINGERPRINT

Build.HOST

Build.ID

Build.MANUFACTURER

Build.MODEL

Build.PRODUCT

Build.TAGS

Build.TYPE

Build.USER

Build.VERSION.RELEASE

안드로이드 OS가 아닌 단말기 마다 다르게 적용되는 통신관련정보(통신사, 전화번호, 단말ID등) 들은 TelephonyManager 라는 패키지를 통해 제공된다.  

https://developer.android.com/reference/android/telephony/TelephonyManager.html

권한이 필요하다.

<uses-permission android:name="android.permission.READ_PHONE_STATE>

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);

Android 10  에서 IMEI(고유식별번호)가 공백을 반환하기 때문에  단말초기기동시에 할당되는 값을 아래처럼 사용하면된다.

String androidId = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);
최신폰에서는 추천하는 방법이지만 예전폰에서는 단말회사에 따라 모두 같은 번호를 가질 위험성도 있다.
따라서 제일좋은 방법은 UUID를 생성해서 SharedPreference에 넣어두고 사용하는 방법이다.
https://ssaurel.medium.com/how-to-retrieve-an-unique-id-to-identify-android-devices-6f99fd5369eb

String androidId = Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID);
String tmSerial = "" + tm.getSimSerialNumber();
String tmDevice = "" + tm.getDeviceId();

UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
return deviceUuid.toString();

따이렇게 deviceId, SimSerial 을 다같이 조합해서 UUID를 만들면 어떤 OS 단말에서도 같은UUIS가 나오지 않게 된다. (고 스택님들이 https://stackoverflow.com/questions/2785485/is-there-a-unique-android-device-id
)


 


0 comments:

댓글 쓰기