Repository navigation
Releases: zmxnpquryet-gif/Localllmandroid
Release list
v1.5.4: 다국어(한국어·English·中文) 지원, HuggingFace 미러 소스, 서버 안정화 및 의존성 최적화
Localllmandroid v1.5.4 (Global Release / 공식 릴리즈)
본 릴리즈는 공식 업로드 키(Official Upload Key) 로 빌드 및 서명된 정식 글로벌 릴리즈입니다. 기존 v1.5.1 / v1.5.2 / v1.5.3 설치본 위에 삭제 없이 즉시 업데이트 설치가 가능합니다.
주요 변경 사항 (Highlights)
1. 다국어 지원 (Multilingual / Global i18n)
- 한국어 (Korean), English, 简体中文 (Simplified Chinese) 완전 지원
- 기기 시스템 언어에 맞춰 기본 자동 적용되며, 설정(Settings) 화면에서 원하는 언어로 즉시 변경 가능합니다.
- UI 문구, 챗 인터페이스, 모델 매니저, 음성 엔진 및 오류 안내 메시지 전반의 다국어 적용 완료
2. Hugging Face 모델 다운로드 소스 옵션 (Download Source Switch)
- 설정에 모델 다운로드 소스 옵션 추가:
- Hugging Face 공식 허브 (
huggingface.co) - hf-mirror 미러 허브 (
hf-mirror.com)
- Hugging Face 공식 허브 (
- 네트워크 환경에 따라 최적의 다운로드 소스를 원클릭으로 선택할 수 있습니다.
3. 서버 및 백그라운드 서비스 안정화 (Server & Background Hardening)
- Ollama 호환 로컬 API 서버 Foreground Service 최적화 (
specialUse서비스 타입 지정) - API 토큰 영속화 및 사전 인증(Pre-auth) 기능 보강
- 대용량 모델 백그라운드 다운로드 시 안정성 및 연결 유지 강화
4. 추론 엔진 & 보안 무결성 개선 (Engine & Security)
- K-quant / RoPE 연산 정밀도 및 추론 락(Inference Lock) 안정화
- 다운로드된 모델 파일에 대한 SHA-256 무결성 검증 로직 강화
- Android Keystore 기반 AES-256-GCM 보안 암호화(
ChatCrypto,SecretPrefs) 적용 유지
설치 및 서명 안내 (Verification & Signing)
- versionCode:
20 - versionName:
1.5.4 - 서명 키:
CN=Localllmandroid Upload Key, O=Localllmandroid, C=KR - 인증서 SHA-256:
79:1F:2C:26:3F:DC:A4:64:6C:79:46:A5:F6:89:E1:9A:77:95:48:D5:F5:8F:31:E3:B3:A8:35:6B:0A:A0:F7:63 - APK SHA-256:
5d27c675b6b192844e85866b1faad0c11ddb2380e2d5bdfce8209d533b0af2f2
v1.5.3
Run MoE larger than RAM + UI fixes.
- SDengine: memory gate on dense+KV instead of file size (experts stream from SSD), quantized-dense residency with fused matvec, embedding row-gather, live residentBytes. MoE models that never loaded can now attempt a load.
- FDM dialog: download button stays visible (scroll body capped). System prompt setting removed.
- .gitignore: root models/ only (was shadowing ui/models sources).
versionCode 19, signed with the v1.5.1+ upload key. Unit: engine 45/45, app 83/83 green.
v1.5.2
SDengine MoE optimization + default-llama.cpp routing.
- Imported GGUF (incl. MoE) now defaults to llama.cpp; SDengine is strictly opt-in via Model Manager or the global runtime switch, with a one-time stale-prefs migration.
- SDengine (TEST, MoE-only): fused streaming quantized matvec, RoPE cache, scratch reuse, heap topK, zero-copy expert paging, non-evicting prefetch, deferred-arch fail-fast.
- Adversarial review rounds (codex/cmdc/agy), all findings fixed. Unit: engine 42/42, app 83/83 green.
versionCode 18 / versionName 1.5.2, signed with the v1.5.1 upload key (SHA-256 791f2c26...). Updates from v1.5.1 install cleanly; v1.4.0-or-earlier installs still need one reinstall (key rotation, see v1.5.1 notes).
v1.5.1: 로컬 TTS/대화형 STT 완성, LiteRT GPU→CPU 폴백, SDengine 실제 구동, OOM 보호 재설계
주요 변경
음성 (STT / TTS)
- 대화 모드 로컬 STT 정상화 — 녹음 상태 고착 버그를 고치고, 무음 감지 자동 종료(엔드포인팅)를 넣어 핸즈프리 루프가 실제로 돌아갑니다.
- 한국어 신경망 TTS(Supertonic 3 int8, ~145MB) 실제 동작 — 다운로드·설치·선택·스트리밍 재생, 화자 10명/속도 조절, 시스템 TTS는 옵션/폴백으로 유지.
- TTS가 조용히 앱을 죽이던 JNI 콜백 ABI 크래시 수정 (기기에서 SIGABRT로 재현 → 명시적 콜백 클래스로 해결).
- 삼성 기기에서 소리가 안 나던 오디오 라우트 수정 (USAGE_ASSISTANT → USAGE_MEDIA: 어시스턴트 스트림 볼륨이 2/15로 분리돼 있었음).
엔진
- LiteRT: OpenCL/NPU 프리플라이트 정책, 백엔드별 실패 사유 집계, 실패한 엔진 정리, 드라이버 실패 기억(
litert_gpu_unavailable), 그리고 추론 중 GPU→CPU 자동 폴백(같은 요청 안에서 재시도).
실기기에서 확인된 실제 "OpenCL" 실패는 로드가 아니라 샘플러가libLiteRtTopKOpenClSampler.so를 못 여는 것이었습니다. - SDengine: 실제 런타임으로 연결(로드/생성/중단), MoE GGUF 자동 감지·라우팅, 모델별 런타임 오버라이드, 로드 실패 시 llama.cpp 1회 재시도. TEST 경고는 그대로 유지.
메모리 보호
- in-flight 마커로 비정상 종료(OS 킬)를 다음 실행에서 감지 → 감축 레벨 0~4 자동 적용.
- 모델 로드 전 실제 필요 메모리 추정(가중치+KV 캐시+버퍼) → 컨텍스트 자동 하향 또는 로드 거부.
- 생성 중 메모리 감시로 위험 시 안전 중단, Java OOM/trim 이벤트 기록, 설정에 레벨·사고 이력·로그 뷰어·초기화 추가.
UI
- 설정 / API 서버 / 모델 관리 / 드로어에 하단 인셋 적용 — 태스크바에 마지막 항목이 가려지던 문제 수정(드로어 "설정" 항목은 탭 자체가 안 되던 문제).
- 음성 화면을 유연한 오브 영역 + 높이 제한 스크롤 컨트롤로 재구성 — 화면이 짧아도 잘리지 않고, 화자 10명이 모두 표시됩니다.
libsdengine.so16KB 페이지 정렬.
⚠️ 서명 키 변경 안내
기존 업로드 키(my-upload-key.jks)의 비밀번호를 확인할 수 없어 새 업로드 키로 서명했습니다.
그래서 v1.4.0 이하 설치본 위에는 업데이트 설치가 되지 않습니다 — 기존 앱을 삭제한 뒤 새로 설치해 주세요. (이번 이후 버전부터는 정상 업데이트됩니다.)
검증
- 단위 테스트:
:engine42개 /:app78개 전부 통과 - 계측 테스트: 실기기(Galaxy S23 FE, Android 16)에서 14 + 3개 통과 (로컬 TTS 합성·재생·완료 콜백 포함)
v1.4.0
LocalLLM Android v1.4.0 (versionCode 15)
Self-contained on-device LLM app: llama.cpp GGUF + LiteRT LM, encrypted chat storage, model manager with segmented downloads, Ollama/OpenAI-compatible API server, voice mode, MCP tools, first-party glass UI (no Material3), SDengine test scaffold, on-device Whisper STT.
Release notes since v1.3.1:
- Security: exact-host HF token + CORS validation, API auth/limits, fail-closed Keystore crypto, no debug-signed releases
- Stability: serialized inference with fail-fast busy, per-request LiteRT sessions, native-propagated stop, honest API errors/options
- Features: real MCP JSON-RPC client (tools list/call), local Whisper tiny STT with on-device recording, empty chats stay unsaved, SDengine (TEST) runtime selector with loud warnings
- First-party engine scaffold (:engine): GGUF reader, quantizers, BPE, sampler, KV cache, MoE expert pager, reference kernels, transformer, JNI C++ core (libsdengine.so for arm64-v8a + x86_64)
- Verified: 70+ unit tests green, emulator end-to-end (270MB download, load, 98-token云 complete at 6.4 t/s), signed release smoke test
Install: download app-release.apk on your device and install (signed with the project's upload key).
Whisper STT model (~100MB) downloads in-app on first use from the voice screen.
v1.3.1: 네임스페이스 마이그레이션, LiteRT 실측 벤치마크 연동 및 Keystore 보안 결함 해소
Local LLM Android v1.3.1 Release Notes
v1.3.0 머지 이후 발견된 잔여 기술 부채 및 불일치(네임스페이스 미반영, 토큰 속도 추정치 잔존, UI 라우팅 원시 문자열 호출, Keystore 조용한 폴백 취약점)를 전면 해소한 완성형 릴리즈입니다.
🏛️ P0 & P3 — 완전한 네임스페이스 및 패키지 마이그레이션
com.localllm.android전면 적용:applicationId뿐만 아니라 빌드namespace및 소스/테스트 코드 디렉토리 전체를com.localllm.android로 이전 완료- ProGuard/R8 keep 규칙 동기화 및
com.example잔여 레거시 레퍼런스 100% 제거
🎯 P1 & P2 — LiteRT-LM C++ 런타임 실측 지표 연동
length/3추정치 완전 제거:- LiteRT C++ 코어의
conv.getBenchmarkInfo()네이티브 지표 연동 lastPrefillTokensPerSecond(프롬프트 처리 속도),lastDecodeTokensPerSecond(생성 TPS),lastPrefillTokenCount,lastDecodeTokenCount를 실측치로 정확하게 산출 및 표기
- LiteRT C++ 코어의
🔒 P0 — Android Keystore 보안 결함(Silent Downgrade) 원천 차단
- 실기기 런타임 하드코딩 키 폴백 차단:
- 실기기 환경에서 Keystore 예외 발생 시 하드코딩 키로 조용히 폴백(Silent Fallback)하던 취약점 제거 ->
SecurityException명시적 발생 - JVM/Robolectric 유닛 테스트 환경에서만 안전하게 테스트 키가 동작하도록 런타임 환경 분리
- 실기기 환경에서 Keystore 예외 발생 시 하드코딩 키로 조용히 폴백(Silent Fallback)하던 취약점 제거 ->
🛡️ P1 — 사전 OOM 진단 및 실질적 크래시 방지 가드
checkMemoryDiagnostics구현:- 단순 Logcat Warning 출력을 넘어, 기기 가용 RAM이 심각하게 고갈된 상황(
availMemMb < 150MB및 모델 크기 초과)에서 네이티브 프로세스 강제 종료(SIGSEGV)를 예방하기 위한 조기 로드 차단 및 사용자 안내 메시지 반환 - 모델 로딩 중 실시간 메모리 상태 인디케이터 반영
- 단순 Logcat Warning 출력을 넘어, 기기 가용 RAM이 심각하게 고갈된 상황(
🧭 P2 & P3 — 전 UI 컴포넌트 타입 안전한 네비게이션 (AppScreen)
- UI 화면 호출부 11곳 전면 전환:
ChatScreen,ModelManagerScreen,SettingsScreen,VoiceModeScreen,ApiServerScreen내 모든 화면 이동 호출부를AppScreenenum으로 완전 교체MainViewModel.navigateTo(String)오버로드에@Deprecated부여
- APK 패키징:
Localllmandroid-v1.3.1-release.apk(R8 / Minify 최적화 적용, 99.9MB) - 테스트: 로컬 유닛 테스트 100% 통과 (Robolectric / JUnit)
v1.3.0: Keystore AES-GCM 보안 강화, API 서버 인증, 리플렉션 제거 및 R8 최적화
Local LLM Android v1.3.0 Release Notes
Claude 및 ChatGPT 심층 코드 리뷰를 바탕으로 보안 취약점, 아키텍처 결함, 하드웨어 가속 미비점을 전면 개선한 메이저 업데이트입니다.
🔒 P0 — 보안 강화 및 데이터 무결성
- Android Keystore 기반 AES-256-GCM 암호화 전환 (ChatCrypto):
- 하드코딩된 마스터 시드를 제거하고 OS 보안 하드웨어(TEE/Keystore)에서 기기별 고유 키를 생성·보관
- 암호화 실패 시 평문(Base64)으로 폴백하던 취약점 제거 ->
SecurityException을 통한 안전하지 않은 저장 원천 차단 - 이전 버전의 기존 대화 기록을 안전하게 읽어오는 하위 호환 마이그레이션 로직 탑재
- API 서버 보안 강화 (OllamaApiServer):
- 외부 노출 위험이 있던
0.0.0.0바인딩 대신127.0.0.1(로컬 루프백) 기본 바인딩 적용 (설정에서 LAN 모드 선택 가능) - 랜덤 고강도 API 키(
sk-local-...) 자동 발급 및Authorization: Bearer <token>헤더 인증 필수 적용 - 브라우저 기반 무단 호출을 방지하기 위해 와일드카드 CORS(
*) 제거 및 로컬호스트 검증
- 외부 노출 위험이 있던
- LlamaContext 리플렉션 의존성 제거:
- wrapper의 private 필드에 몰래 접근하던
getDeclaredField("contexts")리플렉션 완전 제거 LlmEngine이 네이티브LlamaContext를 직접 소유·관리하여 ProGuard/R8 난독화 시의 크래시 가능성 원천 차단
- wrapper의 private 필드에 몰래 접근하던
⚡ P1 — 하드웨어 가속 및 진단 강화
- Google LiteRT-LM GPU / NPU 하드웨어 가속 지원:
- CPU 고정을 탈피하고
Backend.GPU()및Backend.NPU()델리게이트 후보를 자동 시도
- CPU 고정을 탈피하고
- llama.cpp GPU 오프로딩 (n_gpu_layers):
- 설정과 연동하여 GPU 가속 레이어 오프로딩 지원
- 사전 메모리 진단:
- 모델 로드 전 가용 RAM 대비 모델 크기를 대조하여 OOM 위험 조기 감지 및 로깅
🎯 P2 — 정확성 및 UX 개선
- 실제 토크나이저 기반 속도 측정:
- 글자 수 기반 추정치(
length/3)를 폐기하고 네이티브 모델 토크나이저를 통한 정확한promptSpeed및tps산출
- 글자 수 기반 추정치(
- 스트리밍 추론 버퍼 상태머신 (ReasoningStreamParser):
- DeepSeek-R1 등 추론 모델의
<think>,</think>태그가 토큰 스트리밍 경계에서 쪼개질 때도 완벽 분리 처리
- DeepSeek-R1 등 추론 모델의
🏛️ P3 — 아키텍처 및 빌드 위생
- 정식 애플리케이션 ID 적용:
com.localllm.android(versionCode 13, versionName 1.3.0) - R8 / Minify 최적화 활성화:
isMinifyEnabled = true적용으로 약 20MB 용량 경량화 (99.9MB) - 타입 안전한 네비게이션: 문자열 라우팅을
AppScreenenum으로 교체하여 오타 방지 - 모바일 친화적 네트워크 디스패처: 동시 요청 풀을 16/8로 조정하여 배터리 및 연결 안정성 확보
- 단위 테스트 스위트 구축: 암호화, 스트리밍 상태머신, 프롬프트 포맷터 테스트 100% 통과
- README 아키텍처 문서화: llama.cpp GGUF vs LiteRT-LM 이원화 아키텍처 기술
v1.2.1: Fix External GGUF Model Loading & Exception Swallow
Local LLM Android v1.2.1 Release Notes
🛠️ GGUF & 외부 모델 로딩 치명적 버그 완전 해결
- llama.cpp 네이티브 컨텍스트 직접 인스턴스화 (LlamaContext):
- 기존 \LlamaAndroid.startEngine\이 내부 예외를 가로채
ull\로 삼켜버려 \llama.cpp contextId 반환 실패: null\을 발생시키던 치명적 결함을 원천 제거 - 네이티브 예외 발생 시 실제 에러 사유 및 원인 코드를 실시간 진단 대화상자에 상세 표출
- 기존 \LlamaAndroid.startEngine\이 내부 예외를 가로채
- 안드로이드 저장소 파일 디스크립터 직결 (ParcelFileDescriptor.open):
- \Uri.parse\ 및 \openInputStream\ 실패 취약점을 우회하여 기기 저장소/외부에서 가져온 파일도 OS 네이티브 레벨에서 안전하게 FD 오픈
- 6단계 지능형 폴백 복구 로더 (Multi-Stage Fallback Loader):
- 1단계: 커널 \mmap\ + 내장/외장 비전타워 연동
- 2단계: 직접 메모리 로드 (\use_mmap = false) + 비전타워 연동
- 3단계: 표준 텍스트 디코더 모드 (사용자 설정 컨텍스트 윈도우)
- 4단계: 직접 메모리 모드 (mmap 미지원 커널 대응)
- 5단계: 컨텍스트 축소 안정화 모드 (2048 ctx)
- 6단계: 저사양 기기 절전 모드 (1024 ctx)
- 컨텍스트 누수 방지 및 리밋 확장:
- \LlamaAndroid\ 기본 한도(1)를 16으로 확장하여 모델 전환 시 즉각 로드 가능
- 모델 언로드 시 기존 네이티브 컨텍스트 맵을 전수 해제하여 폰 RAM 누수 차단
v1.2.0: Fix External Model Loading (GGUF mmap & LiteRT) + Diagnostics
Local LLM Android v1.2.0
- GGUF 외부 모델 로드 실패 영구 해결 (use_mmap = true):
- 기존 LlamaHelper의 use_mmap = false 하드코딩으로 인해 2GB 이상의 모델 가중치를 프로세스 힙(Heap)에 malloc하려다 발생하던 Model initialization failed 메모리 부족 결함을 완전히 해결했습니다.
- LlamaAndroid 네이티브 드라이버를 직접 연동하여 커널 레벨 mmap 매핑을 강제 적용하고, 기기 코어 수에 맞춘 최적 멀티스레드(2..6T)를 전달합니다.
- LiteRT 외부 모델 초기화 오류 해결 (Failed to create engine):
- GgufMetadataDetector에서 GGUF 매직 바이트(GGUF) 최우선 판별 로직을 확립하여 .bin 확장자나 GGUF 파일이 LiteRT로 오분류되는 현상을 원천 차단했습니다.
- 일반 텍스트 모델에 무차별적으로 비전(hasMmproj) 플래그가 켜져 비전 인코더 서브그래프를 요구하던 노이즈 키워드(mm., clip.)를 정밀 토큰으로 정제했습니다.
- LiteRT 엔진 생성 시 순수 텍스트 디코더 우선 시도 및 컨텍스트 자동 조정 폴백을 강화했습니다.
- 상단 상태 배너 3줄 확장 및 상세 진단 팝업 추가:
- 한 줄로 잘리던 엔진 에러 메시지를 최대 3줄까지 표기하고 에러 하이라이트 색상을 적용했습니다.
- 배너를 터치하면 전체 네이티브 오류 스택과 상태 전문을 열람하고 원클릭 복사할 수 있는 다이얼로그를 탑재했습니다.
v1.1.9: Crash Fix & Safe LiteRT / GGUF Loading
Local LLM Android v1.1.9 릴리스 노트
주요 수정 및 안정화 내용:
- 앱 진입 3초 후 강제 종료(크래시) 원천 차단:
- MainViewModel 시작(init) 시 다운로드된 모델을 무조건 네이티브 메모리에 로드하던 강제 로직을 완전히 제거했습니다.
- 앱 진입 시에는 모델 메타데이터와 준비 상태만 표시하고, 실제 네이티브 가중치 로드는 사용자가 채팅 메시지를 전송하거나 모델 관리자에서 명시적으로 로드할 때 시각적 프로그레스 바와 함께 안전하게 지연 로드(Lazy Load)됩니다.
- LiteRT LM 네이티브 C++ SIGSEGV / SIGABRT 방지:
- 기기 OpenCL/Vulkan 드라이버 호환성 부재로 네이티브 세그폴트를 유발하던 Backend.GPU() 강제 폴백을 제거하고, 100% 안정적인 CPU 멀티스레드 계층(Backend.CPU)으로 재편했습니다.
- 비전 서브그래프가 없는 모델에 대해 �isionBackend를 강제 설정하여 발생하던 초기화 실패를 완화하여, 비전 연동 실패 시 자동으로 텍스트 전용 CPU 디코더로 무중단 폴백합니다.
- GGUF mmproj 참조 오류 방지:
- 단일 모델 파일의 절대 경로를 mmproj로 전달하여 clip_model_load 충돌이 일어나던 문제를 차단하고, 실제 분리된 비전 프로젝터 파일이 존재할 때만 mmproj를 전달하도록 수정했습니다.
- VoiceManager 음성 인식/TTS 초기화 예외 보호:
- 기기 TTS 엔진 누락 또는 비동기 콜백 예외가 메인 스레드로 전파되어 앱이 종료되는 현상을 방지하도록 try-catch 보호막을 적용했습니다.