레노버 패드 국가코드 변경 불가 / 2024, 12.7 SetEdit 반글화 불가 ... 0
우선 요약하자면
1. ####6030#은 기본적으로 막혀있으나 이를 강제로 뚫어도 어차피 제대로 작동하지 않는다.
2. 설정 -> 언어 설정에서 언어 목록이 4개(중중중영)만 있는 현상을 강제로 제거할 수 있으나 이 경우에도 중국어만 남게 된다.
3. 2024, 12.7에서 SetEdit으로 system_locales를 ko-KR로 변경해도 locale이 ko -> zh로 복귀되는 이유는 레노버 탓이 맞다. (회피 가능성 있음)
4. 루팅을 할 경우 다양한 방법으로 회피할 수 있겠지만 여전히 문제가 있을 가능성이 있다.
이렇게 됩니다.
그럼, 하나하나 상세하게 살펴보도록 하겠습니다.
-----------------------------------------------------------
국가코드 변경 (####6030#)
P11 시절에 잘 사용했던 위 Engineering Code의 경우 현재는 작동하지 않는 것을 보셨을 겁니다.
아래는 설정의 검색창에서 코드 입력 시 이를 받아주는 어플리케이션의 코드 일부입니다.
(system/app/EngineeringCode.apk)
*#06# : IMEI 표시
####0000# : 버전 정보 표시
####2222# : 시리얼넘버 표시
####5993# : 내부 프레임워크 버전 표시
####7777# : 공장 초기화
####33284# : 디버그 셋 (adb 속성 변경 가능하며 이를 통해 QCN Backup을 위한 901D 활성화 가능)
*#*#3332#*#* : SAR 어플리케이션
####3333# : 오프라인 로그
####3334# : 모든 오프라인 로그 열기
####3335# : 모든 오프라인 로그 닫기
####1111# : 공장 테스트 로그
*#85#" : MidTest 수행
####6020# : 국가코드 변경 (국가코드 없을 때)
####6030# : 국가코드 변경 (국가코드 있어도)
저희는 이 중에서 ####6030#을 에전에 유용하게 사용했었으나 현재는 ####6030#을 입력해도 아무런 반응이 없는 걸 보실 수 있습니다.
그 첫번째 이유로는 레노버에서 국가코드 목록이 있는 파일을 넣어두지 않았기 때문입니다.
####6030# 입력 시 system/etc/countrycode/country_code_list.xml 파일에서 국가코드 목록을 가져오지만 실제 system 파티션에는 현재 해당 파일이 없습니다.
따라서 여기서 arrayList가 Empty 상태가 되어 그대로 국가코드 변경 과정이 종료되게 됩니다.
더해서, 이를 통과하기 위해 루팅 후 vendor/etc/country_code_list.xml 파일을 system 파티션에 넣어줘도 중국어만 선택 가능하게 창이 뜨게 됩니다.
이는 vendor 파티션에 있는 country_code_list.xml 파일이 사실 중국어만 선택 가능한 파일이기 때문입니다.
따라서, 정상적인 country_code_list.xml 파일을 구해서 넣어주게 되면 우리에게 익숙한 국가코드 선택창이 뜨는데요.
사실, 여기서 한국어를 선택해도 바뀌는 게 없습니다.
단지 oemowninfo 파티션에 국가코드가 입력되는 게 다이며 이를 활용하지는 않는 것으로 보입니다.
참고로 애초에 oemowninfo 파티션에는 국가코드가 적혀있지 않았으며 ####6030#을 수행했더니 비로소 국가코드가 입력되었습니다.
남아있는 로그는 중국로 설정한 것 밖에 없긴 하네요
참고로, getprop을 해보시면 여기저기 국가코드로 CN 값이 들어가 있는 것을 확인할 수 있는데 정말 대부분은 system 파티션 내 흩어져 있는 build.prop에 이미 CN으로 값이 작성되어 있어서 루팅을 하지 않으면 변경할 방법이 없는 것을 확인했습니다.
####6030#이 CN 값들을 KR로 바꿔주기를 기대했지만, 강제로 수행해봐도 변화가 없었습니다.
따라서, ####6030#에 대한 기대는 안 하시는 게 좋을 것 같습니다.
다만, 혹시나 해당 값에 의해 locale이 설정될 여지가 언젠가는 있지 않을까 기대해봅니다.
결과적으로 더 이상 레노버는 ####6030#을 사용하여 국가코드를 설정할 생각이 없는 것으로 예상됩니다.
설정 -> 언어 설정에서 중중중영 이외의 다른 언어 선택
그 다음으로 주목한 것이 설정 내 언어 설정을 통한 한국어 설정이었습니다.
아시다시피 기본적으로 언어 설정 창에 들어가면 4개 언어 밖에 표시되지 않습니다.
그래서 어떻게 직접 언어 목록이라도 변경할 수 있을까 싶어서 펌웨어를 뒤적거리다가 다음과 같은 내용을 발견했습니다.
(system/priv-app/ZuiSettings.apk)
위와 같이 현재 버전이 ROW면 getUserLocaleList 호출, 아니면 getAllLocaleList를 호출하며 isRowVersion 함수는 다음과 같습니다.
ro.config.lgsi.region 값이 비어있지 않을 경우 ROW인지 아닌지, 비어있을 경우 ro.config.zui.region값이 ROW인지 아닌지 반환하게 되어 있습니다.
그리고 adb를 통해 getprop을 수행하여 Property를 확인해보시면 다음과 같이 ro.config.lgsi.region 값을 확인할 수 있습니다.
[ro.config.lgsi.platform]: [qcom]
[ro.config.lgsi.region]: [prc]
[ro.config.lgsi.sw.version]: [TB320FC_RF01_2310141645]
값이 prc일 경우에는 아래와 같이 getAllLocaleList 함수를 호출하며 내용은 다음과 같습니다.
소름 돋게 정확히 4개의 배열만 선언하고 중중중영을 세팅하는 게 보이시죠? 아주 지독합니다.
그러면 이제 ro.config.lgsi.region 값을 row로 바꿔서 진행하면 어떻게 될까요?
Magisk를 통해 루팅을 진행할 경우 resetprop이라는 명령어를 사용할 수 있는데 이를 통해 기존에 변경 불가능했던 Property를 마음대로 변경할 수 있습니다.
이를 통해 ro.config.lgsi.region 값을 row로 변경할 경우 getUserLocaleList 함수가 호출됩니다.
그럼 LocalePicker.getLocales 함수를 통해 반환되는 locale 목록이 중요해지는데, 여기서 다시 한 번 레노버의 벽에 부딪히게 됩니다.
system/framework/framework-res.apk 내 arrays.xml 파일에 있는 지원되는 locale 목록입니다.
네, 영어랑 중국어 밖에 없습니다.
실제로 ro.config.lgsi.region 값을 row로 변경하면 설정에 Add Language 버튼이 생기지만 여기서도 중국어 밖에 선택이 불가능합니다.
따라서, 언어 설정 또한 내수롬의 경우 레노버가 철저하게 영어와 중국어만 남겨놓고 있다고 판단됩니다.
2024, 12.7에서 SetEdit 적용 불가
다들 아시다시피 2024, 12.7의 경우 특정 SW 버전부터 SetEdit으로 system_locales를 ko-KR로 변경해도 locale이 강제로 zh로 변경된다는 걸 알고 계실 겁니다.
이에 대해서도 분석을 해보니 역시나 레노버가 막기 시작했다는 것을 알 수 있었습니다.
(system/framework/framework.jar)
우선 system_locales의 값이 어떻게 적용되는지 간단하게 살펴보면, 위와 같이 adjustConfigurationForUser 함수에서 getStringForUser 함수를 통해 system_locales 값을 가져온 후 setLocales 함수를 수행하는 것을 확인하실 수 있습니다.
그럼 이제 setLocales 함수를 살펴봐야겠죠?
Y700 2023 677 버전
12.7 440 버전
위처럼 12.7 440 버전에서는 setLocales 함수 수행 시 입력된 값에 zh가 없거나 en_US가 아닐 경우 강제로 locale을 zh-CN으로 변경하는 코드가 추가된 것을 확인할 수 있습니다.
이로 인해 SetEdit을 통해 system_locales에 ko-KR을 입력할 경우 zh-CN으로 강제로 변경되게 됩니다.
다만, 여기서 하나 해볼 만한 게 있는데요, zh만 포함되면 된댔으니까... 다음과 같이 바꿔보면 어떨까 싶습니다
"ko-KR" -> "ko-KR_zh" 또는 "ko-KR zh" (빈칸 넣기) 또는 "ko-zh-KR" (zh-Hans-CN 응용!)
일단 contain("zh") 니까 zh만 어딘가에 포함되면 패스가 될 거고, 일반적인 어플들은 ko-KR 중 ko만 보기 때문에 이렇게 하면 반글화가 되지 않을까 싶네요.
Y700 2세대 기준으로는 ko-KR_zh, ko-KR zh, ko-zh-KR 셋 다 한국어가 출력되는 건 확인했습니다.
다만, 어떤 사이드 이펙트가 있을지는 아직 잘 모르겠네요.
따라서, 12.7이 440이신 분들은 꼼수 한 번 시도해보셔도 좋을 것 같습니다. 490은 SetEdit이 안된다고 하니 방법이 없어보이긴 하네요...
하나 궁금한게 490에서는 adb로 settings를 변경하는 것도 막힌 건가요? (adb shell settings put system system_locales ko-KR)
만약 adb로는 설정 가능하다고 하면 490도 꼼수 한 번 해볼 수 있지 않을까 싶습니다.
여튼, 2024와 12.7에서 ko-KR이 제대로 먹히지 않는 건 레노버 탓이 맞습니다.
루팅 또는 QFIL로 반글화하기
마지막으로, 현재로서는 루팅을 하거나 QFIL을 사용하는 방법이 있을 수 있습니다.
아직 제가 가진 Y700 2세대의 경우 SetEdit이 막히지 않아 많은 걸 시도해보진 못했습니다만, 예로 들면 다음과 같습니다.
resetprop을 이용하여 persist.sys.country와 persist.sys.language를 설정하기
위와 같이 루팅 후 resetprop을 통해 persist.sys.country와 language를 설정하면 언어 설정이 가능했습니다.
다만 해당 값도 어떤 식으로 레노버가 막을지 또는 막아놨을지는 예상할 수 없습니다.
또, 아직 해보진 않았지만 루트 권한이 있으면 adb shell settings를 통해 system_locales에 값을 넣을 수 있지 않을까 싶기도 하네요.
아쉽게도 부트로더를 언락할 경우 리락이 되지 않는 패드도 있는 것 같아 루팅하는 방법은 최후의 보루로 남겨놔야 하지 않을까 싶습니다.
--------------------------------
결과적으로 펌웨어 분석 결과 다음과 같은 성과가 있었습니다.
1. 레노버가 아주 작정하고 언어 변경을 막고 있다는 걸 알게 됨
2. system_locales가 강제로 중국으로 변경되는 걸 회피할 수 있는 꼼수를 발견했...나?
처음 분석을 시작할 때의 목표는 ####6030#의 부활이었습니다만, 결국 레노버가 언어 변경을 여기저기 막고 있다는 것만 알게 되었네요.
긴 글 읽어주셔서 감사합니다!