저자는 Redmi Note 12 5G(코드명 sunstone)에 대한 서드파티 지원이 극히 부족하고, 공식 업데이트가 중단된 데다 Google 서비스도 없는 점을 불만으로 삼아 crDroid를 설치했다. 이 글은 플래싱 전 과정을 상세히 다룬다: 도구 준비(ADB, 언락, 펌웨어, ROM 등), Fastboot와 Recovery를 통한 시스템 설치, NikGapps로 Google 서비스 확보, 중국어 입력기 문제 해결, 그리고 코드명이 다른 기기에 플래싱할 때 발생하는 검증 문제를 해결하기 위해 AVB와 SELinux를 비활성화하는 방법을 소개한다. 또한 벽돌 방지를 위해 공식 펌웨어 백업을 강조하며, 이 모델은 커널 오픈소스가 불완전하고 중국 본토에서만 판매되어 해외 지원이 부족해 플래싱 위험이 높다고 지적한다.
Redmi Note 12 5G(sunstone)는 이미 샤오미의 업데이트 지원 목록에서 제외된 기기라 HyperOS 후속 업데이트를 받을 수 없고, 최신 공식 시스템은 OS2(OS2.0.6.0.UMQCNXM, 2025년 8월 12일)에 머물러 있습니다.
최신 업데이트를 받지 못하는 건 그렇게 치명적이지 않습니다. 오히려 업데이트가 필요 없는 기기가 좋은 기기니까요. 더 치명적인 건 이 폰이 Google 인증을 받았는데도 샤오미가 좀처럼 Google을 쓸 기회를 주지 않는다는 점입니다. 심히 의심됩니다.아니, 더 이상 의심할 필요도 없이 같은 내부 코드네임을 쓰는 Poco X5용 인증을 하려고 그러는 겁니다. 화웨이에서 갓 뛰쳐나온 저의 Google 꿈을 한방에 산산조각 냈죠.
그래서 저는 일찌감치 Xiaomi.EU를 플래싱했는데, 올해부터 여기서도 GApps를 바로 넣어서 수정해 주지 않기 시작한 게 정말 죽을 맛이었습니다. 그렇게 되니 제가 MIUI&HyperOS에 매달릴 이유도 없어져서 AOSP 계열(순정형) 롬을 찾아봤고, 카드형 플래싱은 이번이 처음이었습니다. 전에는 전부 선형(케이블) 방식으로만 했거든요.
결국 crDroid를 선택하긴 했지만, 이 폰의 온갖 버프가 겹쳐서 플래싱을 하는 게 정말 지옥이었습니다.
P0: 준비
이론상으로 여기서 시작하는 모든 단계는 다른 폰에도 그대로 적용할 수 있습니다. 하지만 한 가지 꼭 명심하세요. 공식 선형 플래싱 패키지를 하나 남겨 두세요. 그래야 시스템이 완전히 말아먹어서 도저히 복구가 안 될 때, 진짜 벽돌이 되지 않습니다.
또한 글을 간결하게 쓰기 위해, 이후로는 기기 내부 코드네임(예: stone 같은 것)으로 샤오미에서 만든 폰을 지칭하겠습니다.
가장 기본이 되는 몇 가지를 정리하면:
Redmi Note 12 5G에 대응하는 내부 코드에는 sunstone, stone, gemstone이 있습니다. 이론상 내부 코드를 넘나들며 플래싱해서는 안 되지만, 저는 어거지로 내부 코드를 넘나들어 플래싱했으니 따라 하지 마세요.
이 글을 쓰는 시점 기준, 사이트에서 검색 가능한 건 gemstone(crDroid 12)과 stone(crDroid 11, 10)입니다. 본인 상황에 맞게 고르세요.
P1: 시스템 플래싱
아까 내려받은 펌웨어 패키지, ROM 패키지, boot.img, vendor_boot.img, dtbo.img, NikGapps 패키지를 전부 같은 디렉터리에 넣어 두면 작업하기 편합니다.
편의를 위해 모든 파일명을 알아보기 쉽게 바꿔 뒀습니다. 본인 상황에 맞게 필요한 대로 수정하세요.
폰과 컴퓨터를 데이터 케이블로 연결하세요(뻔한 말이지만).
fastboot로 진입하려면 전원 버튼과 볼륨- 버튼을 길게 누르세요. 폰에서 ADB가 활성화되어 있다면 아래 명령어를 실행할 수도 있습니다.
폰 화면에 Fastboot가 표시되면 이미 fastboot 모드로 전환된 것입니다.
이제 가장 중요한 단계입니다. boot.img, vendor_boot.img, dtbo.img를 차례로 플래싱하세요. 슬롯 순서를 꼬이지 않게 주의해야 합니다.
전부 제대로 플래싱됐는지 확인한 뒤, 아래 명령어를 실행하세요.
이때 폰이 재부팅되며 crDroid Recovery로 전환됩니다. 시스템은 아직 설치도 안 됐는데 복구 모드는 먼저 깔려 버린 셈이죠.
이때 화면에 Reboot system now, Apply update, factory reset, Advanced 네 가지 옵션이 나타납니다.
차례로 factory reset 👉 Format data/factory reset 👉 Format data 를 선택하세요. 이때 폰의 사용자 데이터가 전부 지워집니다. 그래서 미리 백업을 해 두어야 하는 겁니다. 이 단계를 건너뛰면 시스템이 바로 멈춰 버립니다.
위 단계를 끝낸 뒤 처음의 화면으로 돌아가, 차례로 Apply update 👉 Apply from ADB 를 선택하세요. 페이지 하단에 Now send the package you want to apply 가 표시되면 ADB가 정상적으로 활성화된 것이며, 지금부터 sideload 모드입니다.
이제 펌웨어 패키지, ROM 패키지를 차례로 플래싱합니다.
상당히 중요한 점 하나: sideload 모드에서는 명령어를 실행할 때마다 처음 Recovery에 진입했던 화면으로 돌아가므로, 다시 한 번 활성화 절차를 반복하면 됩니다.
ROM 패키지를 플래싱할 때 폰에서 Yes인지 No인지 확인을 요구하는 화면이 나올 수 있습니다. 거기 뭐라고 쓰여 있는지는 신경 쓰지 마세요(실제로는 펌웨어 버전 차이에 관한 문제입니다). 그냥 Yes를 선택하면 됩니다.
이때 폰이 바로 재부팅되고, 재부팅 후에는 crDroid Recovery로 돌아갑니다. 여기서 Reboot system now 를 선택하면 crDroid의 초기 화면으로 진입하니, 안내에 따라 그냥 단계를 끝까지 진행하면 됩니다.
대성공입니다.
P2: Google 프레임워크
보시다시피 기본으로 제공되는 앱이 전부 AOSP 기반입니다. 이때 Google 서비스가 필요하면 폰을 crDroid Recovery 상태로 되돌린 뒤 ADB sideload 모드를 활성화하고 NikGapps를 플래싱하기만 하면 됩니다.
NikGapps는 여섯 개의 브랜치로 나뉘는데, crDroid에는 Core와 Basic 중에서만 고르면 됩니다. 그러면 시스템이 크게 망가지지 않습니다.
플래싱을 완료해도 폰이 스스로 재부팅되지는 않으니, Reboot system now 를 선택해야 재부팅됩니다.
시스템에 들어가면 Google Play가 바탕화면에 떠 있는 걸 볼 수 있습니다.
P3: 입력기
이건 사실 AOSP 잘못입니다. 그러니 Gboard나 다른 입력기를 설치하세요. 그러지 않으면 한자를 입력할 수 없습니다.
GApps를 설치했다면 Gboard를 더 권장합니다.
P4: 커널 검증 비활성화
사실 이 글을 쓸 때 제 폰은 계속 벽돌이 됐다가 살아났다가를 반복하고 있었습니다. 당연히 내부 버전 번호를 넘나들어서 생긴 문제가 분명한데, 방법이 없었습니다. sunstone에서 쓰는 서드파티 시스템을 만들어 주는 곳이 너무 적고, Xiaomi.EU조차 더 이상 하지 않을 정도니까요(당연한 일이긴 합니다. 샤오미의 대버전 행보를 그대로 따라가니까요). 보통은 내부 버전 번호만 맞으면 그럴 필요가 없습니다.
그런 경우에는 vbmeta.img 를 추출해서 AVB(Android Verified Boot)의 파티션 무결성 서명 검증을 비활성화해야 합니다. 또 SELinux 강제 검증도 비활성화해야 할 수 있습니다. 혹시 몰라서 저는 전부 다 했습니다.
P4.1: vbmeta.img 추출
payload-dumper-go 를 내려받아 README를 따라 시스템에 배포하세요.
ROM 패키지의 압축을 풀고, 압축을 푼 디렉터리에서 실행하세요:
실행이 끝나면 같은 디렉터리에 extracted_xxxxxxxx_xxxxxx 폴더가 생기고, 그 안에 추출된 여러 img 파일이 존재합니다.extracted_xxxxxxxx_xxxxxx를 추출한 img 파일들이 모두 들어 있습니다.
P4.2: AVB 파티션 무결성 서명 검증 비활성화
차례로 vbmeta.img 와 vbmeta_system.img 를 플래싱하세요.
플래싱을 완료한 뒤 기기를 재부팅하세요:
P4.3: SELinux 강제 검증 비활성화
SELinux 강제 검증을 비활성화하려면 반드시 root가 필요합니다. root 하는 방법은 여기서 자세히 설명하지 않겠습니다.
아래 명령어를 실행해 SELinux 상태를 확인하세요.
이제 shell로 진입합니다(컴퓨터의 shell이 아니라, 컴퓨터를 통해 Android의 shell로 들어가는 것입니다).
예를 들어 sunstone:/ $ 같은 프롬프트가 보이면 정상적으로 진입한 것입니다.
차례로 실행하세요.
명령어 adb shell getenforce 를 실행해서 Permissive 가 표시되면 SELinux 강제 검증이 임시로 꺼진 것입니다. 단, 기기를 재부팅하면 사라집니다.
이 설정을 영구적으로 유지하려면 부팅 시 실행되는 스크립트를 작성해야 합니다(Linux의 systemd와 비슷합니다).
기기를 재부팅한 뒤 adb shell getenforce 인증을 다시 한 번 실행해서 Permissive 가 표시되면 SELinux 강제 검증이 부팅 과정에서 꺼진 것입니다.
동시에 기기에도 SELinux가 강제 모드로 동작하지 않는다고 표시되는데, 이 경우 일부 은행 앱이 아예 실행되지 않으니 그때는 패치가 필요합니다. 자세히 설명하지는 않겠습니다.
PE: 후기
굳이 말하자면 crDroid 공식에서 직접 지원하는 기기가 정말 많아서 PixelOS보다는 좋은데, 아쉽게도 sunstone은 여전히 지원되지 않습니다. 곰곰이 생각해 보면 아마 sunstone이 중국 본토에서만 판매되기 때문일 겁니다. Google조차 활성화할 수 없는 기기를 해외 개발팀이 굳이 한 대 사서 테스트하고 지원해 주기를 기대할 수는 없잖아요.
사실 샤오미 쪽에도 문제가 있습니다. stone 쪽은 전부 커널 오픈소스가 완전하지 않아서, 정말 난감하더군요.