삼성 키보드(Samsung Keyboard / HoneyBoard)의 두벌식 한국어 자판에 다음 기능을 더하는 LSPosed 모듈입니다.
| 기능 | 예 |
|---|---|
| 자음끼리 합치기 | 옛한글 조합이 켜져 있으면 모음 없이 친 다른 자음도 합침: ㅅㄱ → ㅺ, ㅂㅅ → ㅄ, ㅇㅇ → ㆀ, ㅅㅅ → ㅆ, 쌍자음이 섞이면 초성으로만 있는 글자도: ㅆㅅ·ㅅㅅㅅ → ᄴ, ㅂㅆ → ᄥ (ㅅ 세 번은 단어 중간에서도: 가+ㅅㅅㅅ+ㅣ → 가ᄴᅵ) (합칠 글자가 없는 ㅋㅋ 등은 그대로), 스페이스로 풀기 |
| 옛한글 조합 | ㅂㅅㄱ+ㅏ → ᄢᅡ, ㅂㅇ+ㅏ → ᄫᅡ, ㄱ+ㆍ+ㄹ → ᄀᆞᆯ, ㅿ+ㅏ → ᅀᅡ |
| 자동 ㅇ 채우기 | ㅏ+ㄴ → 안, ㅏ+ㄹ+ㄱ → 앍 |
| 모음만 쳐도 ㅇ | 세+ㅛ → 세요, ㅏㅏ → 아아, ㅗ → 오 (ㅠㅠ ㅜㅜ ㅡㅡ는 그대로) |
| ㅋ 길게 누르기 | 누르자마자 ㅋㅋㅋ, 누르고 있으면 점점 빨라지며 계속 입력. 옵션(기본 끔)으로 천지인 느낌 ㄱ·ㄲ / 쿼티 느낌 ㅌ 섞기 (처음 ㅋㅋㅋ 는 섞지 않음) |
| 쉬프트 옛 자모 | 쉬프트를 누르면 ㄹ ㅇ ㅎ ㅏ 자리에 ㅿ ㆁ ㆆ ㆍ 가 표시·입력 (ㄱㄷㅂㅅㅈㅐㅔ 는 그대로 쌍자음) |
| 옛 자모 길게 누르기 | ㄹ → ㅿ, ㅇ → ㆁ, ㅎ → ㆆ, ㅏ → ㆍ (ㄱㄷㅂㅅㅈ 은 삼성 기본 쌍자음 그대로) |
| 스페이스로 옛한글 풀기 | 합쳐진 옛한글 뒤에서 스페이스 → 한 번 풀기: ᄛᅦ → ㄹ에, 주ᇮ → 중ㅇ (한 번 더 = 띄어쓰기, 바로 ⌫ = 되돌리기, 되돌린 뒤 스페이스 = 그대로 두고 띄어쓰기) |
| 일본어 미리 불러오기 | 삼성 키보드는 일본어로 처음 바꿀 때 UI 스레드에서 사전(iWnn)을 불러와 멈추고 키·스와이프가 씹힘. 일본어를 한 번 쓰고 나면 키보드가 켜질 때 뒤에서 미리 불러옴 |
| 윗줄 밀어 숫자 | ㅂ…ㅔ(q…p)를 아래로 밀면 1…0, 밀고 멈추면 ¹ ₁ ① ½ 같은 변형 선택 — 삼성 숫자 줄을 꺼도 됨 |
| 키보드 크기 제한 풀기 | 삼성 크기 조절에서 최소는 절반까지, 높이는 최대의 1.6배까지 |
| 클립보드 칸 수 | 클립보드 패널을 한 줄 2·3·4칸으로 (기본 3칸, 삼성 기본은 6칸 안팎) |
| 여러 언어 입력 | 삼성 '여러 언어로 입력'이 켜져 있어도 한글 자판이면 모듈이 조합 |
| 다중언어 영/한 판별 | 삼성 '여러 언어로 입력'에서 한 단어의 키 위치만으로 영어인지 판단: hello 의 키(ㅗㄷㅣㅣㅐ)는 한글이 될 수 없으므로 영어로 바꿔 입력. the·world 처럼 한글 구조인 흔한 영어 낱말은 스페이스에서 영어로 바로잡음 |
| 언어 키 짧게/길게 | 짧게: 영어↔한국어(또는 일본어)만 오감. 길게: 영한 → 영일처럼 짝을 바꿈 (삼성 언어 목록의 순서를 따름) |
| 타자 속도 | CPM/WPM: 쉬는 시간은 최대 2초만 치고, 같은 글자를 두 번 세지 않으며 1초에 한 번만 갱신 |
| 계산·단위 환산 | 12+34, 10 cm-ft, 1024MB, 5'45'', 100 km/h to mph: 자주 쓰는 단위 순으로 여러 개 표시, 탭하면 식 대신 결과 입력 |
| 백스페이스 재조합 | 치고 있는 단어는 자모 단위(안 ⌫ → 아), 띄어쓰기 뒤나 길게 누를 때는 글자 단위 |
기준 버전: Samsung Keyboard 5.9.40 (HoneyBoard-548300). 다른 버전도 동작하도록 난독화된 클래스를 이름이 아닌 로그 문자열로 찾습니다(아래 “동작 방식” 참고).
- LSPosed(Zygisk) 가 설치된 루팅 기기에 APK를 설치합니다.
- Actions 탭의 Build 워크플로 결과물(
SamsungKeyboardOldKorean-apk) 또는 직접 빌드:./gradlew :app:assembleRelease
- Actions 탭의 Build 워크플로 결과물(
- LSPosed 관리자에서 모듈을 켜고 범위에 삼성 키보드(com.samsung.android.honeyboard) 를 선택합니다.
- 앱의 삼성 키보드 재시작 버튼을 누릅니다(root 가 있으면 강제 종료, 없으면 설정 > 애플리케이션 > 삼성 키보드 > 강제 중지).
- 앱 서랍의 삼성 키보드 옛한글 에서 기능을 켜고 끌 수 있습니다. 설정은 키보드를 다시 열 때 적용됩니다.
옛한글이 보이려면 옛한글 조합형 자모를 그릴 수 있는 글꼴이 필요합니다(예: Noto Sans CJK KR, 함초롬). 글꼴이 지원하지 않으면 자모가 풀어진 채로 보이지만 입력된 텍스트 자체는 올바릅니다.
- 자음만 연달아 치면 합쳐지지 않습니다:
ㅎㅎ,ㅋㅋ,ㅂㅅ그대로. - 초성 없는 모음은 현대 겹모음만 합쳐집니다:
ㅗㅏ→ ㅘ, 하지만ㅜㅜ,ㅡㅡ,ㅏㅏㅏㅏ는 그대로. - 옛한글 조합이 켜져 있으면 모음 앞의 자음 묶음이 옛 초성이 됩니다(
ㅅㄱㅏ→ ᄭᅡ), 초성 뒤 모음 묶음도 옛 중성이 됩니다(ㄱㅜㅜ→ ᄀᆍ). 끄면 현대 한글 음절만 조합합니다. - 받침 뒤에 모음이 오면 마지막 자음 하나가 다음 음절 초성으로 넘어갑니다(도깨비불):
ㄷㅏㄹㄱㅏ→ 달가. - 끝난 음절은 곧바로 확정(commit)되고, 바뀔 수 있는 마지막 음절만 조합 중으로 남습니다.
삼성 키보드는 한글 조합을 네이티브 XT9 엔진(libXt9core.so)에서 하므로 옛한글을 만들 수 없습니다.
그래서 이 모듈은 두벌식 자모 키 입력을 가로채 자체 조합기로 처리합니다.
engine/— 안드로이드 의존성이 없는 순수 Java 조합기(HangulComposer)와 단위 테스트. 조합표(JamoTables.java)는tools/gen_jamo_tables.py가 유니코드 자모 이름(예:HANGUL CHOSEONG PIEUP-SIOS-KIYEOK→ ㅂㅅㄱ)에서 자동 생성합니다.app/— LSPosed 모듈. DexKit으로 난독화된 대상을 찾아 훅합니다.
| 훅 대상 | 찾는 방법 (5.9.40 에서의 이름) |
|---|---|
| 키 이벤트 객체 | "KeyRequestInfo{mKeyCode=" 를 쓰는 클래스 (Dm.b) |
| 키 액션 실행기 | " execute end t : " 를 쓰고 인자 2개인 메서드 (Fl.d.d) — 액션 이름(CharacterKeyA, BackspaceKeyA …)으로 분기 |
| 글자 입력 명령 | "input_key_chn_dot", "input_key_repeatable_up" 를 쓰는 메서드 (Cl.H.c) — 모듈이 처리한 키는 이 명령만 꺼서, 진동·소리·쉬프트 해제·자판 갱신은 삼성 코드가 그대로 처리 |
| 삼성 InputConnection 래퍼 | "[NRIC] isNoResponseState true" 를 쓰는 클래스 (b8.b) — 모듈이 조합하는 동안 삼성의 finishComposingText/setComposingText 를 막음 |
| 쉬프트 상태 | "getCurrentShiftState()I" 클래스 (r9.b)의 isShifted — 삼성은 쉬프트여도 ㅂ 키코드를 보내고 나중에 ㅃ로 바꾸므로 직접 읽음 |
| 키 누름/뗌 | "onTalkBackClick: xy = (" 메서드가 호출하는 같은 클래스의 1-인자 메서드 (ㅋ 반복 멈춤용) |
| 키 롱프레스 | "onTalkBackLongClick: xy = (" 메서드가 호출하는 같은 클래스의 1-인자 메서드 (ep.a.e) |
| 예측 엔진 조회 | "engineName is null" 을 쓰는 정적 메서드 (vj.c.a) — "OMRON"(일본어) 엔진을 미리 만들 때 사용 |
| 키보드 크기표 | "sizeConfig" 를 쓰는 정적 float 조회 두 개 (rl.b.c/f, 인덱스 0/1/2 = 최소/기본/최대), 너비 쪽은 22·32 행을 읽는 메서드로 구분 |
| 클립보드 패널 | ClipboardBoard.getBoardView (난독화 안 됨) 가 돌려준 뷰 안의 RecyclerView 칸 수 |
| 키보드 창 터치 | SoftInputWindow.dispatchTouchEvent (윗줄 밀어 숫자) |
| 커서/조합 영역 | HoneyBoardService.onUpdateSelection 등 (난독화 안 됨) |
찾은 결과는 키보드 데이터 폴더(files/oldhangul_targets.properties)에 APK별로 캐시됩니다.
문제가 생기면 LSPosed 로그에서 OldHangul: 로 시작하는 줄을 확인해 주세요.
- 한국어 두벌식(쿼티) 전용입니다. 삼성이 알려주는 현재 언어/자판(
Language.getLanguageCode(),getInputType())으로 판단해서, 영어·일본어 등 다른 언어와 천지인·나랏글·베가·단모음 자판은 삼성 기본 동작 그대로 둡니다. - 모듈이 한글 조합을 맡는 동안에는 삼성 키보드의 한국어 추천 단어/자동 수정이 나오지 않습니다.
- 기기에서 직접 검증하지 못한 부분: 롱프레스를 건너뛴 뒤 키를 뗄 때의 처리, 일부 앱(웹뷰 등)의 조합 영역 처리.
- 받침과 옛 초성 묶음이 겹치는 경우(
ㅇㅏㅆㅅㅣ→ 았시 / 아ᄴᅵ,ㄹㅇㅔ→ ᄛᅦ / ㄹ에)는 지금은 받침을 우선합니다. 고르는 방법은 아래 계획 2번 참고. - 하드웨어 키보드 입력은 건드리지 않습니다.
- 키보드 안에서 옛한글 모드 켜고 끄기 — 한자 키나 스페이스바 제스처로 즉시 전환, 상태를 키 라벨/토스트로 표시(지금은 설정 앱에서만 전환).
- 겹자음 모호성 해결 — 옛한글 → 현대 방향(ᄛᅦ → ㄹ에)은 스페이스로 풀기(A)로 구현. 반대 방향(
았시→아ᄴᅵ)은 현대어(밥이,았습니다)와 부딪혀서, 추천 단어 줄에 후보를 띄우는 방식(B)으로 검토 중. - 옛 자모 롱프레스 팝업 — 한 키에 여러 옛 자모(ㅇ → ㆁ, ㆀ / ㅏ → ㆍ, ᆢ)를 고르는 삼성 스타일 팝업, 사용자가 직접 매핑 편집.
- ㅋ 롱프레스 확장 — 누르고 있는 동안 ㅋ 반복 입력, ㅎ·ㅠ·ㅜ 등 다른 키에도 반복 문자 지정.
- 삼성 추천 단어 연동 — 조합 중인 현대 한글을 삼성 예측 엔진에 넘겨 추천 단어 복원, 옛한글 사전(훈민정음·용비어천가 어휘) 추천.
- 천지인·단모음 쿼티 지원 — 자판 종류를 삼성 설정값에서 직접 읽고, 천지인용 옛한글 조합(ㆍ 세 번 → ᆢ 등) 추가.
- 옛한글 한자 변환 — 한자 키로 옛한글 음 → 한자 후보.
- 표시 글꼴 도우미 — 옛한글 글꼴 설치 여부 확인과 안내.
- 다른 삼성 키보드 버전 검증 — 버전별 훅 대상 자동 점검 화면과 오류 보고.
GNU AGPL v3 — LICENSE 참고.