삼성 키보드 옛한글 (LSPosed 모듈)

삼성 키보드(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). 다른 버전도 동작하도록 난독화된 클래스를 이름이 아닌 로그 문자열로 찾습니다(아래 “동작 방식” 참고).

설치

  1. LSPosed(Zygisk) 가 설치된 루팅 기기에 APK를 설치합니다.
    • Actions 탭의 Build 워크플로 결과물(SamsungKeyboardOldKorean-apk) 또는 직접 빌드: ./gradlew :app:assembleRelease
  2. LSPosed 관리자에서 모듈을 켜고 범위에 삼성 키보드(com.samsung.android.honeyboard) 를 선택합니다.
  3. 앱의 삼성 키보드 재시작 버튼을 누릅니다(root 가 있으면 강제 종료, 없으면 설정 > 애플리케이션 > 삼성 키보드 > 강제 중지).
  4. 앱 서랍의 삼성 키보드 옛한글 에서 기능을 켜고 끌 수 있습니다. 설정은 키보드를 다시 열 때 적용됩니다.

옛한글이 보이려면 옛한글 조합형 자모를 그릴 수 있는 글꼴이 필요합니다(예: 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번 참고.
  • 하드웨어 키보드 입력은 건드리지 않습니다.

다음 기능 계획

  1. 키보드 안에서 옛한글 모드 켜고 끄기 — 한자 키나 스페이스바 제스처로 즉시 전환, 상태를 키 라벨/토스트로 표시(지금은 설정 앱에서만 전환).
  2. 겹자음 모호성 해결 — 옛한글 → 현대 방향(ᄛᅦ → ㄹ에)은 스페이스로 풀기(A)로 구현. 반대 방향(았시 → 아ᄴᅵ)은 현대어(밥이, 았습니다)와 부딪혀서, 추천 단어 줄에 후보를 띄우는 방식(B)으로 검토 중.
  3. 옛 자모 롱프레스 팝업 — 한 키에 여러 옛 자모(ㅇ → ㆁ, ㆀ / ㅏ → ㆍ, ᆢ)를 고르는 삼성 스타일 팝업, 사용자가 직접 매핑 편집.
  4. ㅋ 롱프레스 확장 — 누르고 있는 동안 ㅋ 반복 입력, ㅎ·ㅠ·ㅜ 등 다른 키에도 반복 문자 지정.
  5. 삼성 추천 단어 연동 — 조합 중인 현대 한글을 삼성 예측 엔진에 넘겨 추천 단어 복원, 옛한글 사전(훈민정음·용비어천가 어휘) 추천.
  6. 천지인·단모음 쿼티 지원 — 자판 종류를 삼성 설정값에서 직접 읽고, 천지인용 옛한글 조합(ㆍ 세 번 → ᆢ 등) 추가.
  7. 옛한글 한자 변환 — 한자 키로 옛한글 음 → 한자 후보.
  8. 표시 글꼴 도우미 — 옛한글 글꼴 설치 여부 확인과 안내.
  9. 다른 삼성 키보드 버전 검증 — 버전별 훅 대상 자동 점검 화면과 오류 보고.

라이선스

GNU AGPL v3 — LICENSE 참고.

Releases

v0.9.3

Stable

10/10/2026, 2:43:57 PM

  • 번역: 오프라인 언어팩을 목록/다운로드할 수 없을 때(unsupported target for src) 삼성 서버 번역을 사용합니다. 설정의 "서버 번역 사용"으로 끌 수 있습니다(기본 켜짐). 서버 번역이라 인터넷이 필요합니다.
  • 번역창에 한글을 입력하면 앱 입력창으로 들어가던 문제를 고쳤습니다.
  • 번역 도중 작업 스레드에서 타자 속도 표시를 건드려 나던 예외를 고쳤습니다.
  • CPM/WPM 표시와 단위환산 카드가 스페이스바 높이에 뜨던 위치를 키 아래 띠로 옮겼습니다.

Assets

1