Flutter : 나를 괴롭혔던 SDK Version 불일치
SDK XML version을 이해할 수 없습니다.
// flutter build apk --debug
Warning: SDK processing. This version only understands SDK XML versions up to 3 but an SDK XML file of version 4 was encountered.
This can happen if you use versions of Android Studio and the command-line tools that were released at different times.
프로젝트 내내 나를 괴롭혔던 SDK XML version 문제.
뭐. 별 이상없이 작동을 해서 원인을 분석해볼 생각을 못했다.
그러다 마음을 잡고, 플러터로 빈 프로젝트를 하나 만들었다.
크롬으로 실행, 이상무
윈도우앱 만들기, 이상무
그 다음 저거... flutter build apk --debug ...
여지 없이 저 에러를 띄운다.
뭐가 문제일까? Cursor, Cloude, ChatGPT, MS-Copilot, Perplexity, Genspark 모두에게 물어본다.
다 비슷한 대답을 한다. 그 중에서 Cursor가 내놓은 답.
음, 오류가 두개 섞여 있고, 플러터를 업그레이드 하면 해결이 된단다.
flutter upgrade ...
젠장, 해결이 안된다.
...를 며칠째 반복중.
결국 AI가 잘못 가르쳐 주고 있다고 받아들였다.
AI가 아닌 사람의 목소리를 듣기 위해 구글 검색을 해본다.
StackOverFlow 와 Tistory 블로그를 탐색해본다.
음, 알겠다.
다시 Warning log 로 돌아온다.
"Android Studio 와 command-line tool 의 version 이 서로 다른 시기에 배포된 것 같다."
음, 그럼 command-line tool 만 새로 설치해주면 되겠군.
Android Studio를 실행하고, SDK Manager를 띄웠다.
Android Studio에서 뭔 tool을 설치하는 메뉴는 여기밖에 없기에.
SDK Platforms : 안드로이드 버전, API 버전이 다른 이유
이건 컴파일할 때 불러올 안드로이드 API 를 말한다.
현재 폰이 "Galaxy A52" 이고 펌업을 해서 "소프트웨어 정보 - 안드로이드 버전"이 14다.
참고로 "안드로이드 버전"과 "API 버전"은 따로 간다.
"안드로이드 버전"은 소프트웨어 뭉치 덩어리다.
폰에 깔려 있는 "안드로이드 설치버전"이라고 보면 된다.
이거 기계어로 바뀌어져 있다. 속칭 "Binary" 라고 부른다.(이진법 - 기계어가 2진법을 움직인다.)
코딩을 하려면 개발자가 읽고 쓸 수 있는 방법이 있어야 한다.
이걸 API 라는 함수 세트를 만들었다.
개발자들은 이 API 세트를 기준으로 코딩하면 된다.
함수 명칭이나 용법 같은 건 공식 문서에 잘 나와 있다.
처음에는 안드로이드 버전, API 버전이 둘다 1.0 이었다.
그런데 폰을 팔다보면 구매자들이 혈당측정기 같은 걸 붙여달라고 한다.
안드로이드 버전은 0.1씩 올라가는데, API 버전은 +1씩 한다.
개발함수가 세트로 많이 들어가기 때문이다.
그래서 지금은 "안드로이드 버전"이랑 "API 버전"이 많이 달라졌다.
개발하다 보면, 저거 업그레이드 방식이나 변화량이 달라서, 버전 명명규칙을 다르게 가져가는 게 맞다는 걸 알게된다.
음, 그런데 저건 command-line tools은 아니니 PASS
SDK Tools
이건가?
처음에는 "Android SDK Command-line Tools(latest)" 만 정확히 다시 깔아봤다.
체크 해제한 다음 Apply, 다시 체크한 다음 Apply 하면 지웠다 다시 까는 거다.
그런데 문제해결이 안된다.
젠장... 아무거나 다 지웠다 깔아볼까?
- Android SDK Build-Tools 35
- Android SDK Command-line Tools(latest)
- Android SDK Platform-Tools
이 3개를 지웠다 다시 깔아본다.
그리고 다시 Cursor IDE ...
flutter build apk --debug
엇, 그랬더니 된다.
맨 위에 SDK XML 버전 어쩌고 저쩌고가 사라졌다.
젠장. 젠장. 젠장. 화가 난다.
AI의 할루시네이션
ChatGPT, Cloude, Perplexity, MS-Copilot ...
이 문제를 해결하려고 안 해본 질문이 없다.
AI는 "버전 불일치" 라는 키워드에 꽃혀 무조건 최신버전으로 업데이트를 하란다.
아주 짠듯이 모든 AI가 동일한 대답을 한다.
명확한 할루시네이션이다.
그럴 듯한 명령어까지 적혀 있고, 동작을 어느 정도 하니까 진짜 믿었다.
하지만, 컴파일 환경이 점점 복잡해지면서 에러와 경고 메시지의 선후를 가릴 수 없게 되었다.
나도 깜빡 속아넘어갈 수 밖에 없었다.
문제 해결
(1) 로그 메시지에서 출발했다.
AI는 추정한 걸 대답해준다.
로그 메시지는 직접적인 원인을 대답해준다.
직접 원인을 이야기해줄 땐 누군가의 생각을 물어볼 게 아니라,
그 이야기를 들어야만 한다.
(2) 빈 프로젝트 파일을 만들었다.
코드가 복잡해지니 에러가 섞인다.
한 번에 한 개씩 잡아가기로 하자.
빈 프로젝트 파일을 만들었다.
Flutter 가 만들어내는 가장 표준적인 Framework 다.
에러가 전혀 없어야 정상이다.
그렇다면 Android Studio 쪽인데...?
이렇게 환경을 좁혀놓고, 하나씩 잡아가니 문제가 해결된다.
원인을 찾으려고 기술문서를 읽게 된다.
이해가 된다. 공부가 된다.
배경 이해
Android Studio 가 복잡한 이유는 탄생배경과 성장환경이 굉장히 중구난방이어서 그렇다.
그걸 해결하려고 그 때 그 때 뭔가를 하다보니, 개발환경이 이렇게 복잡해진 것.
특히 Java와의 분쟁 때문에 kotlin으로 갈라지면서 더 환경은 복잡해졌다.
덕분에 새로운 언어와 프레임워크가 나오게 된 계기가 되었지만...
시사점
(1) LLM 은 추론엔진이지 정답을 가르쳐주는 선생님이 아니다.
문제가 안풀리면 전통적인 방식으로 사람이 풀어야 한다.
(2) LLM 은 말을 잘하는 사기꾼과 같다.
충분히 많은 데이터를 학습했다면 그 답이 정답일 확률이 높지만,
데이터 학습이 부족했다면 그럴 듯하게 거짓말을 한다.
그 차이를 사전에 식별하기는 어렵다.
그냥 자꾸 삽질을 해야 한다.
끝.