올려보자, Android SDK Version
한줄 요약
요약이 불가능하다... 떠듬떠듬 이슈를 하나씩 파괴해 간다... 발생하는 sdk랑 gradle을 올리고 터지는 에러를 아래와 같은 순서로 하나하나 잡았다.
2024년 6월 15일 기준 세팅으로 요래조래 올려본다.
-
compileSdk 34
-
minSdk 26 : 작년 기준으로 많이 쓰는 앱들은 21정도를 쓴 것 같다 https://www.megumethod.com/blog/recommended-minimum-sdk-version-for-android-projects
-
오늘 기준으로 android 9.0(pie) 이상 버전이 95% 수준이 것 같다. 무난허게 오레오(26) 수준으로 진행해보자. https://gs.statcounter.com/os-version-market-share/android
-
targetSdk 34
1. 구글의 경고.
한참 전에 올려두었던 Rala가 삭제되었다! 경고 메세지는 다음과 같다.
앱이 Android 13(API 수준 33) 이상을 타겟팅해야 함 시행일: 2023년 8월 31일 경고 전송 일자: 2023년 8월 11일
2. compilesdkversion, targetsdkversion, minsdkversion
여기 잘 설명이 되어 있다. 요약하면 다음과 같다.
- minSdkVersion : 앱이 실행하는데 필요한 최소 SDK 버전
- targetSdkVersion : 앱이 타겟팅하는 SDK 버전
- compileSdkVersion : 컴파일 시 사용하는 SDK 버전
근데... Gradle 7.0.0으로 가면서 위치가 조금 옮겨졌다.
minSdk instead of minSdkVersion targetSdk instead of targetSdkVersion compileSdk instead of compileSdkVersion
3. Gradle
7.x이상으로 올려야 할 운명이다. 최선 버전에서 마이너 하나정도 빠진 버전으로 사용해보자. 8.4.0으로 간다
https://stackoverflow.com/questions/67250362/what-is-difference-between-compilesdk-and-compilesdkversion-in-android-studio-gr
4. android:exported
Android 12에서부터는 android:exported가 필수로 지정되어야 한다. 시작되는 액티비티와 플레이어용 서비스만 설정했던 것 같은데 전체 액티비티로 확장하였다.
Manifest merger failed : android:exported needs to be explicitly specified for element<activity#workshop.soso.jickjicke.ui.StartActivity>.Apps targeting Android 12 and higher are required to specify an explicit value for`android:exported` when the corresponding component has an intent filter defined.See https://developer.android.com/guide/topics/manifest/activity-element#exported for details.
https://developer.android.com/guide/topics/manifest/activity-element?hl=ko#exported
5. conatant expression required
switch문에서 언제부터 final을 쓸 수가 없었지 ㅎㅎㅎ switch문에서 final을 쓰기보다는 if-else로 전환하였다. android studio에서 자동완성으로 진행해준다.
에러
error: constant expression requiredcase R.id.delete_abrepeat:^
비포
switch(item.getItemId()) {case R.id.delete_abrepeat:...
애프터
if (item.getItemId() == R.id.delete_abrepeat) {...
6. No speakable text present
특정 레이아웃에서 에러를 띄우기 시작한다.
xml의 해당 위젯에 android:contentDescription을 추가
해주면 되는데, speakable text라는 글로 보아 시각 약자를 위한 접근성 대응을 위해 기본적으로는 에러를 강제하는 것 같다.
7. The style on this component requires your app theme to be Theme.MaterialComponents (or a descendant)
https://m2.material.io/develop/android/docs/getting-started
마테리얼 디자인 버전이 업그레이드 되면서 theme path? 이름? 속성이 변경되었다, Theme.AppCompat.Light.NoActionBar => Theme.MaterialComponents.Light.NoActionBar 근데 마테리얼 3를 쓰면 => Theme.Material3.Light.NoActionBar를 써야된다.
8. PendingIntent와 FLAG_MUTABLE | FLAG_IMMUTABLE
이제 쯤 잘 돌아갈 줄 알았는데...! PendingIntent쪽 에러가 뜬다. 31버전 이후로 PendingItent 사용시 FLAG_MUTABLE | FLAG_IMMUTABLE를 사용해야 한다고 한다. 이건 뭐지?
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.``` at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:5192)"https://developer.android.com/about/versions/12/behavior-changes-12?hl=ko#pendingintents"## 끝끝. 돌아간다. 감동이 있다. 소중한 나의 주말 안녕.## 참조[1] 안드로이드 버전 - "https://apilevels.com/"