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
)


 


Related Posts:

  • Jenkins in Docker, 로컬 안드로이드 sdk 를 이용하여 github 프로젝트 빌드하기 Jenkins in Docker에서 커스텀도커로 로컬의 android_sdk 를 젠킨스에서 접근할수 있도록 했다.https://yunhos.blogspot.com/2021/01/jenkins-in-docker.html젠킨스에서 github의 안드로이드 프로젝트를 빌드해보자.간단하다.0.manage jenkins -> configure system 에서Global Section ->… Read More
  • [Android] Deeplink 를 android studio 에서 테스트 하기  Run > Edit Configurations 해서 Launch -> URL(또는 deeplink?) -> 주소란에 tutsplus://deeplink 물론 사전에 소스에서 인텐트필터로 위의 주소로 왔을떄 받아들일 준비를 해야한다.    <activity android:name="com.example.matthew.deep… Read More
  • OpenSTF 를 mac os 의 docker 에서 실행해서 Android 단말테스트 과정을 좀더 쉽게 하자 Android단말 테스트할때 기종별로 OS버젼별로 손에 들고 하는게 귀찮을때 다른 큰회사들은 어케하나 고민해보았다. 물론 에뮬에서도 버젼별 기종별 해보는 것이 가능하지만 앱테스트시에는 실기기에서 하는것을 기본으로 해야 되서...다행히 Smartphone Test Farm 이라는 솔류션이 있어서 usb로 실기기를 연결하면 웹인터페이스로 여러개의 연결된 기기를 마우스를 이용하여 테스트할수 있다… Read More
  • [Android] Flavors 간단 사용법 Flavors각상황(Dev, Stage, Product) 별로 패키지명과 리소스/API주소등을 달리하고 싶을때앱빌드시에 테스터에게 전달할 파일따로/ 리리스용 파일따로 분리해서 리소스도 다르게 해서 패키징 하고 싶을때가 있다.이떄 Gradle 의 Android속성중에 productFlavors 라는걸 이용하면 각 상활별로 APK 를 만드는게 가능하다.사용예   fl… Read More
  • [Android] Kotlin Multiplatform Mobile, 즉 Kotlin KMM사용해보기Android, IOS,웹 애시당초 같은 로직을 언어마다 따로 만든다는게 잘못된거 아닌가? 그냥 C++ 하나 정도면 사람이 프로그램하는게 전혀 문제가 없는데, 뭘또 계속 만드는지...여튼 이런 환경에서 Kotlin 이 어느정도 답을 제시하고 있다.Kotlin MPP 프로젝트는 IntelliJ에서 해도 되고, 익숙한 Android Studio Plugin (Kotlin Multiplatform Mobi… Read More

0 comments:

댓글 쓰기