올려보자, 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 required
case 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/"