LG Wing 윙 커스텀을 위한 Magisk 모듈의 개발 후기

LG Wing 윙 커스텀을 위한 Magisk 모듈의 개발 후기

최근 엉망이던 윙 커스텀 제작기를 드디어 어느정도 마치고 그동안 더욱 밀려있는 포스트들을 보며 간단 개발 후기를 작성해봅니다.

우선 결론부터 이야기하자면 윙 커스텀은 안드로이드 기반의 꽤나 재미 있는 장난감이라고 할 수 있습니다.

그럼에도 비용을 최대한 아껴 저렴하게 직접 자작하는 경우를 제외한다면 아직까지 누구에게도 추천드리긴 어려운 물건입니다.

이는 윙의 세컨드 스크린이라는 독특한 구조 덕분인데 아무리 좋게 봐줘도 따로 노는듯한 이 구조 덕분에 LG은 애초에 망할만했던 기기라고 생각됩니다.

먼저 결과부터 이야기하자면 루팅한 윙에서 사용이 가능한 Xposed의 후속인 Lsposed를 이용한 모듈의 적용입니다.

세컨드 스크린에 다이지쇼 런처 고정 및 화면 회전을 제어하기 위한 두가지 간단한 마지스크 모듈을 개발했습니다.

GitHub - jshsakura/GoDaijishou
Contribute to jshsakura/GoDaijishou development by creating an account on GitHub.

수많은 런처 중에 다이지쇼를 고정한 이유는 LTE와이파이배터리 잔량 상태를 보여 주는 사실상 윙에서 가장 간단하게 적용이 가능한 서드파티 런처였기 때문입니다.

GitHub - jshsakura/GoRotation90
Contribute to jshsakura/GoRotation90 development by creating an account on GitHub.

그리고 가로모드가 필요한 상황에서 해소가 가능한 화면 고정 여부를 이용해 실제 세컨드 스크린을 회전하도록 만든 모듈 역시 추가했습니다.

이번에 갑작스럽게 6월 중순에 지인에게 저렴하게 기기를 들이고 나서 막연히 만들어보고 싶다는 생각만 가지고 작업을 시작했습니다.

더군다나 연초부터 기대가 커서 테크 유튜버들의 후기만 오매불망 기다리던 래빗 R1이 스캠 급의 사실상 사기 제품임을 알게 되면서 안드로이드 기반의 챗 GPT 전용 머신에 대한 갈증이 있었는데, 마침 상당히 타이밍이 좋게 구매가 가능했습니다.

💡
최근 본업이 너무 바빠지면서 짬짬이 작업해 대략 어느정도 완성이라 부를 수 있는 수준까지 무려 한달 이상 걸린 것 같습니다.

먼저 윙의 부트로더 언락부터 루팅까지는 파편적으로나마 해외에서 자료를 구할 수 있는 편이기에 여기까진 큰 문제가 없습니다.

그러나 안타깝게도 설병기 제작자인 라오장 아저씨가 만들었다는 일종의 커스텀 롬과 같은 관련 정보는 좀 처럼 찾질 못했습니다.

결국 마지스크 모듈을 직접 개발하기 전까지 엄청난 삽질을 진행하게 됩니다.

세컨드 스크린의 기본 홈 화면 수정을 위해 마지스크 모듈과 수많은 네비게이션 바 트윜을 테스트로 설치하며 테스트를 진행했으나 모두 실패했습니다.

무려 펌웨어는 안드로이드 10 , 12 , 13 등으로 총 세가지 버전에서 플레이 스토어 및 마지스크 모듈들을 설치하며 테스트를 진행했었습니다.

결론부터 이야기하자면 버전 별로 루팅에 대한 매리트는 딱히 큰 차이가 없었는데, 이는 엘지의 세컨드 스크린이 일반적인 추가 화면이라기 보단 홈런처3에 기생하는 완전히 분리된 별도 화면의 구조를 가지고 있기 때문입니다.

결국 버전별로 루팅 앱들 역시 OS 버전에 관계 없이 지원 여부가 큰 차이도 없어서 최신버전인 안드로이드 13 으로 설치해둔 상황입니다.

테스트 덕분에 지인들 기기까지 몽땅 루팅을 진행해보았는데 여담이지만 KTSK 간의 일종의 통신사 특화 앱들인 쓰레기 앱인 블로터 앱 의 개수 차이가 상당한걸 보니 당황스럽습니다.

이렇듯 작은 크기에 꽤나 훌륭한 사용성을 보일 것만 같은 윙 커스텀은 com.lge.secondlauncher 통칭 세컨드 런처LG홈런처3의 어색한 연동으로 인해 매번 앱을 설치할 때마다 세컨드 스크린 앱에서 수동으로 활성화해야하는 번거로운 구조를 가졌다는 문제가 있습니다.

그리고 직접 제작해보니 전동 장비가 아닌, 수공구 뿐인 상황이라면 제작 난이도가 상당합니다.

퇴근 이후 밤마다 몇번이나 줄로 열심히 중간판을 갈아 내느라 진땀을 빼기도 했습니다.

보통 인터넷 상에 완제라고 판매되는 물건들이 자작에 비해 그리 비싼게 아니기 때문에 정녕 윙 자체가 궁금한 거라면 차라리 완제를 사는 편이 여러모로 유리하겠습니다.

그럼에도 저 같은 사람들은 이러한 기기들은 제작 과정 자체가 일종의 재미이기 때문에 포기할 수는 없습니다.

윙 커스텀의 가장 큰 문제는 시작부터 끝까지 바로 제작의 꽃인 하우징인데 챗 GPT 전용기기로 만들기 위해 크기가 최대한 작아야만 했습니다.

쉽게 접할수 있는 제품들은 마음에 드는 사이즈가 아니어서 상당히 해멨는데, 다행히도 따로 판매는 하지 않고 계신 분에게 개인적으로 연락해 사정을 말씀드리고 소정의 의뢰비를 드리고 간신히 구매할 수 있었습니다.

보통 온라인에서 3~3.5만원 정도에 판매 중인 출력 제품들을 보면 제작자에 따라 구성이나 퀄리티가 천차만별이기 때문에 잘 비교하고 구해보시는 것을 추천합니다.

요즘 윙의 중고 매물도 거의 씨가 말랐기 때문에 굉장히 감사한 경험이었습니다.

결국 마지막까지 혼자 만들라면 만들 수 가 없는 기기이기 때문에 난관이 많았는데, 대략적인 완성 이후 뒷판도 못닫고 노크온도 활성화 시키질 못하고 있었습니다.

너무나 감사하게도 윙 커스텀의 제작 경험이 많은 무풍 카페의 아재요님이 여분 부품까지 들여가며 제 기기를 거의 다시 다시 만들어 주신 덕분에 간신히 살려낼 수 있었습니다.

따라서 무언가 보답이라도 해드릴까 하던 차에 윙 커스텀은 메인 화면의 다이지쇼를 런처처럼 고정한다거나, 세컨드 스크린만으로는 기기의 전원을 끌 수가 없다는 윙 커스텀공통의 주제가 있었기 때문에 이 문제를 해소하기 위해 루팅으로 어떻게든 해결 해보고자 런처를 변경하기 위한 여정이 시작되었습니다.

가장 먼저 대표적인 테스커(Tasker)를 이용해 자동화를 만들어 세컨드 런처에 해당하는 기본홈(홈&앱서랍) 앱을 실행시 다이지쇼로 보내는 설정을 진행해봤습니다.

프로필을 만들어 두면 그럴싸하게 바로바로 이동하긴 하지만 역시나 홈 화면이 1초정도 노출되는 문제가 있어 이게 자연스럽거나 매끄럽다고 보기엔 어려웠습니다.

루팅 감지를 하는 후후 같은 앱의 경우 마지스크 설치 이후 magisk hide 옵션을 통해 우회가 가능한 것을 확인하자 마자 Magisk Module로 해결이 가능하지 않을까하는 생각에 네비 관련 모듈과 홈버특 액션을 변경하는 모듈들을 여러가지 설치해서 시도를 해보았습니다.

먼저 루팅이후 마지스크는 가장 잘 숨는다고 소문난 포크 버전인 마지스크 델타 를 이용했습니다.

먼저 마지스크의 hideNav 를 이용해 키보드 영역 확보 및 화면 아래쪽의 홈 영역의 pill 아이콘을 날려버리고 조금이나마 더 화면을 확보할 수 있었습니다.

통신사 앱들의 경우 de-bloter 설치를 통해 불필요한 앱을 제외시켜 정리할 수 있었습니다.

전원 종료의 경우 Classic Power Menu를 이용해 전원 키를 두번 길게 눌러 종료가 가능하다는 것을 확인합니다. (1회차는 메인 스크린에 오버레이)

그리고 마지막으로 LG 윙쓰로틀 제한을 완화하는 XDA 개발자 A3A의 모듈을 설치하며 기본적인 모듈 설치 작업을 완료합니다.

그리고 각고의 노력을 펼치며 제스처와 홈버튼을 제어하는 것으로 런처를 고정하려던 노력은 모두 실패로 돌아가게됩니다.

이렇게 포기할 수는 없었기에 안드로이스 스튜디오를 설치하고 막연하게 어느 중국인이 만든 로케일 모듈을 참고하여 직접 런처를 흉내내서 교체하기 위한 개발을 진행했습니다.

가장 어려운 파트는 며칠간 로그캣을 이용해 어떤 패키지가 정말 하단 세컨드 스크린인지 판단하는 부분이었습니다.

이후 화면 번호는 어떻게 되는지 테스커를 통해 확인하는 과정이 굉장히 번잡하게 진행되었습니다.

최근 바쁘다 보니 직접 PC에서 adb 로 연결까진 못하고 외부에서 테스커의 로그캣 감시기능을 사용해 패키지명을 찾아내느라 더 고생했던 것 같습니다.

결과적으로 전체 런처는 com.lge.launcher3 에서 LauncherExtention 이란걸 통해 세컨드 스크린인 com.lge.secondlauncher를 제어하는 것처럼 확인됩니다.

이 논리라면 com.lge.secondlauncher 패키지의 액티비티가 onCreate 혹은 onResume되는 시점의 다이지쇼의 패키지인 com.magneticchen.daijisho의 기본 액티비인 activities.MainActivity 로 이동할 수만 있다면 홈 화면 교체와 유사한 효과를 낼 수 있을 것 같습니다.

세컨드 스크린의 디스플레이 아이디는 4번으로 확인했으니 이제 원한다면 4번에만 다이지쇼를 노출할 수 있는 것이지요.

마자막으로 설치 이후 부트루프를 피하기 위해 다이지쇼가 없다면 안내메세지를 띄우는 것으로 작업을 마무리하게 됩니다.

막상 작업하고 보니 추가로 윙의 전면 패널에 들어간 자이로 센서가 보통 제작시 빠져버리기 때문에 가로모드에 대한 욕심이 생기기 시작합니다.

따라서 사용자가 화면 회전에 대한 추가적인 모듈이 필요할 것으로 판단되는군요!

이는 별도 모듈로 앱 설치시 가로세로를 단순히 고정하기 보다 상황에 따라 사용할 수 있도록 자동회전 설정 여부를 바라보도록 별도 모듈을 추가했습니다.

모든 코드는 깃허브의 오픈소스로 공개되어 있으나 안드로이드 앱 개발 경험이 거의 없다시피하니 개선사항을 알려주시는 분들에게는 더욱 감사하겠습니다.

아이러니하게도 제 윙은 챗 GPT가 목적이었는데 루팅 덕분에 앱사용은 Magisk Hide List로 숨겨도 사실상 정상적인 사용이 불가능합니다.

순정 상태로 돌리면 앱 사용이 가능하나 불편한 점이 한둘이 아니라 우선 루팅은 기본으로 가져갈 것 같습니다.

그리고 드디어 최신 버전의 마지스크와 Lsposed_mod 모듈을 이용해 문제를 해결할 수 있었습니다.

공식 Magisk 앱의 Deny List를 등록하고 설정의 기본 패키지를 숨기는 것을 통해 챗 GPT 역시 루팅감지 우회에 성공할 수 있었습니다.

역시 어떻게든 의지를 가지고 도전하면 사용은 가능하군요!?

일반적인 웨이브나 티빙같은 앱들 역시 루팅 우회엔 문제 없으나 유독 넷플릭스 앱의 경우는 무한 로딩이라 의아하긴 합니다.

어쨌든 본래 목적이었던 음성 모드를 사용하기 위해 챗 GPT의 앱 버전 사용까지 해결되었으니 제 목적은 달성했습니다.

아직까지 내부적으로는 ​어설프겠지만 다이지쇼로 그럴싸한 홈 런처 교체의 효과를 낼 수 있고 LTE 안테나 및 와이파이 상태와 배터리를 표기하니 한결 편리합니다.

윙 자체가 멀쩡한 물건이 아니다 보니 필요하신 분들에겐 작은 도움이 되시길 바라겠습니다.

감사합니다.

비정기로 발행되는 추천 포스트를 이메일로 받아 보실 수 있습니다.

특별한 추천 포스트를 바로 이메일로 받아보세요. 물론 무료입니다!
좋아요! 받은 편지함을 확인하고 구독을 확인하려면 링크를 클릭하십시오.
오류! 유효한 이메일 주소를 입력하십시오!