올려보자, 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으로 간다
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/"export const _frontmatter = {"title":"올려보자, Android SDK Version","date":"2024-06-15"}