Skip to content

Releases: zmxnpquryet-gif/Localllmandroid

v1.5.4: 다국어(한국어·English·中文) 지원, HuggingFace 미러 소스, 서버 안정화 및 의존성 최적화

Choose a tag to compare

@github-actions github-actions released this 21 Oct 12:44

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)
  • 네트워크 환경에 따라 최적의 다운로드 소스를 원클릭으로 선택할 수 있습니다.

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

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 23 Sep 15:16

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

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 23 Sep 11:22

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 보호 재설계

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 20 Sep 16:51

주요 변경

음성 (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.so 16KB 페이지 정렬.

⚠️ 서명 키 변경 안내

기존 업로드 키(my-upload-key.jks)의 비밀번호를 확인할 수 없어 새 업로드 키로 서명했습니다.
그래서 v1.4.0 이하 설치본 위에는 업데이트 설치가 되지 않습니다 — 기존 앱을 삭제한 뒤 새로 설치해 주세요. (이번 이후 버전부터는 정상 업데이트됩니다.)

검증

  • 단위 테스트: :engine 42개 / :app 78개 전부 통과
  • 계측 테스트: 실기기(Galaxy S23 FE, Android 16)에서 14 + 3개 통과 (로컬 TTS 합성·재생·완료 콜백 포함)

v1.4.0

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 19 Sep 11:46
59adb29

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 보안 결함 해소

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 10 Sep 15:19

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를 실측치로 정확하게 산출 및 표기

🔒 P0 — Android Keystore 보안 결함(Silent Downgrade) 원천 차단

  • 실기기 런타임 하드코딩 키 폴백 차단:
    • 실기기 환경에서 Keystore 예외 발생 시 하드코딩 키로 조용히 폴백(Silent Fallback)하던 취약점 제거 -> SecurityException 명시적 발생
    • JVM/Robolectric 유닛 테스트 환경에서만 안전하게 테스트 키가 동작하도록 런타임 환경 분리

🛡️ P1 — 사전 OOM 진단 및 실질적 크래시 방지 가드

  • checkMemoryDiagnostics 구현:
    • 단순 Logcat Warning 출력을 넘어, 기기 가용 RAM이 심각하게 고갈된 상황(availMemMb < 150MB 및 모델 크기 초과)에서 네이티브 프로세스 강제 종료(SIGSEGV)를 예방하기 위한 조기 로드 차단 및 사용자 안내 메시지 반환
    • 모델 로딩 중 실시간 메모리 상태 인디케이터 반영

🧭 P2 & P3 — 전 UI 컴포넌트 타입 안전한 네비게이션 (AppScreen)

  • UI 화면 호출부 11곳 전면 전환:
    • ChatScreen, ModelManagerScreen, SettingsScreen, VoiceModeScreen, ApiServerScreen 내 모든 화면 이동 호출부를 AppScreen enum으로 완전 교체
    • 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 최적화

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 10 Sep 13:41

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 난독화 시의 크래시 가능성 원천 차단

⚡ P1 — 하드웨어 가속 및 진단 강화

  • Google LiteRT-LM GPU / NPU 하드웨어 가속 지원:
    • CPU 고정을 탈피하고 Backend.GPU() 및 Backend.NPU() 델리게이트 후보를 자동 시도
  • llama.cpp GPU 오프로딩 (n_gpu_layers):
    • 설정과 연동하여 GPU 가속 레이어 오프로딩 지원
  • 사전 메모리 진단:
    • 모델 로드 전 가용 RAM 대비 모델 크기를 대조하여 OOM 위험 조기 감지 및 로깅

🎯 P2 — 정확성 및 UX 개선

  • 실제 토크나이저 기반 속도 측정:
    • 글자 수 기반 추정치(length/3)를 폐기하고 네이티브 모델 토크나이저를 통한 정확한 promptSpeed 및 tps 산출
  • 스트리밍 추론 버퍼 상태머신 (ReasoningStreamParser):
    • DeepSeek-R1 등 추론 모델의 <think>, </think> 태그가 토큰 스트리밍 경계에서 쪼개질 때도 완벽 분리 처리

🏛️ P3 — 아키텍처 및 빌드 위생

  • 정식 애플리케이션 ID 적용: com.localllm.android (versionCode 13, versionName 1.3.0)
  • R8 / Minify 최적화 활성화: isMinifyEnabled = true 적용으로 약 20MB 용량 경량화 (99.9MB)
  • 타입 안전한 네비게이션: 문자열 라우팅을 AppScreen enum으로 교체하여 오타 방지
  • 모바일 친화적 네트워크 디스패처: 동시 요청 풀을 16/8로 조정하여 배터리 및 연결 안정성 확보
  • 단위 테스트 스위트 구축: 암호화, 스트리밍 상태머신, 프롬프트 포맷터 테스트 100% 통과
  • README 아키텍처 문서화: llama.cpp GGUF vs LiteRT-LM 이원화 아키텍처 기술

v1.2.1: Fix External GGUF Model Loading & Exception Swallow

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 07 Sep 16:24

Local LLM Android v1.2.1 Release Notes

🛠️ GGUF & 외부 모델 로딩 치명적 버그 완전 해결

  • llama.cpp 네이티브 컨텍스트 직접 인스턴스화 (LlamaContext):
    • 기존 \LlamaAndroid.startEngine\이 내부 예외를 가로채
      ull\로 삼켜버려 \llama.cpp contextId 반환 실패: null\을 발생시키던 치명적 결함을 원천 제거
    • 네이티브 예외 발생 시 실제 에러 사유 및 원인 코드를 실시간 진단 대화상자에 상세 표출
  • 안드로이드 저장소 파일 디스크립터 직결 (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

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 07 Sep 16:04

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

Choose a tag to compare

@zmxnpquryet-gif zmxnpquryet-gif released this 07 Sep 15:21

Local LLM Android v1.1.9 릴리스 노트

주요 수정 및 안정화 내용:

  1. 앱 진입 3초 후 강제 종료(크래시) 원천 차단:
    • MainViewModel 시작(init) 시 다운로드된 모델을 무조건 네이티브 메모리에 로드하던 강제 로직을 완전히 제거했습니다.
    • 앱 진입 시에는 모델 메타데이터와 준비 상태만 표시하고, 실제 네이티브 가중치 로드는 사용자가 채팅 메시지를 전송하거나 모델 관리자에서 명시적으로 로드할 때 시각적 프로그레스 바와 함께 안전하게 지연 로드(Lazy Load)됩니다.
  2. LiteRT LM 네이티브 C++ SIGSEGV / SIGABRT 방지:
    • 기기 OpenCL/Vulkan 드라이버 호환성 부재로 네이티브 세그폴트를 유발하던 Backend.GPU() 강제 폴백을 제거하고, 100% 안정적인 CPU 멀티스레드 계층(Backend.CPU)으로 재편했습니다.
    • 비전 서브그래프가 없는 모델에 대해 �isionBackend를 강제 설정하여 발생하던 초기화 실패를 완화하여, 비전 연동 실패 시 자동으로 텍스트 전용 CPU 디코더로 무중단 폴백합니다.
  3. GGUF mmproj 참조 오류 방지:
    • 단일 모델 파일의 절대 경로를 mmproj로 전달하여 clip_model_load 충돌이 일어나던 문제를 차단하고, 실제 분리된 비전 프로젝터 파일이 존재할 때만 mmproj를 전달하도록 수정했습니다.
  4. VoiceManager 음성 인식/TTS 초기화 예외 보호:
    • 기기 TTS 엔진 누락 또는 비동기 콜백 예외가 메인 스레드로 전파되어 앱이 종료되는 현상을 방지하도록 try-catch 보호막을 적용했습니다.