이 문서는 현재 독립 DawnShell 앱의 구현 상태만 기록합니다. 오래된 시험 앱 이름, 패키지, 서명 값과 이전 APK 정보는 현재 제품 동작에 도움이 되지 않아 제거했습니다.
- 전용 패키지
me.aroxu.dawnshell과 전용 UID를 사용합니다. -
LOCKED_BOOT_COMPLETEDreceiver와 Direct-Boot-aware 포그라운드 서비스를 사용합니다. - DE(Device Encrypted) 저장소에 부팅 설정, 공개 키, 런타임과 로그를 배치합니다.
- BFU(Before First Unlock) root, CE 격리, rootfs, chroot 검사를 수행합니다.
-
USER_UNLOCKED뒤에도 같은 Debian 인스턴스를 유지합니다. - 중복 부팅 알림과 오래된 PID 상태를 안전하게 처리합니다.
Android 요구 사항은 Google Direct Boot 문서와 AOSP 파일 기반 암호화 문서를 기준으로 구현했습니다.
- Debian 13 Trixie rootfs 설치 화면과 실시간 로그를 제공합니다.
- Debian Release 서명과 패키지 SHA-256을 확인합니다.
- 임시 설치 트리 검증 후
/data/local/debian에 원자적으로 게시합니다. - systemd, D-Bus, OpenSSH와
debian사용자를 구성합니다. - SSH 비밀번호 인증과 직접 root 로그인을 끕니다.
- 로컬
root와debian비밀번호 설정을 지원합니다. -
su root를 통한 로컬 root 전환을 지원합니다. - 안전한 중지, 재시작, 상태 확인과 rootfs 삭제를 제공합니다.
-
armeabi-v7a,arm64-v8a,x86_64를 지원합니다. - BusyBox, Debian
pkgdetails, GnuPGgpgv, 관련 라이브러리와 Debian archive keyring을 고정된 소스에서 빌드합니다. - BusyBox
stat -c지원을 설치 전에 확인합니다. - 소스 URL, 버전과 SHA-256을
SOURCES.lock에 기록합니다. - 컴파일은 기본적으로
make -j"$(nproc)"를 사용합니다.
ABI(Application Binary Interface)의 의미는 Google Android ABI 문서를 참고해 주세요.
- 전용 cgroup v2 하위 트리와 장치 BPF를 먼저 시험합니다.
- 최신 경로가 실패하면 정리 후 격리된 cgroup v1 방식으로 전환합니다.
- Android NIC를 직접 공유하고 Wi-Fi, 모바일, USB Ethernet 변경을 처리합니다.
- 기본 비활성 직접/VID:PID 제한 독점 USB 패스스루, v2 BPF/v1 devices 차단과 정상 종료 드라이버 복원을 제공합니다.
- Tailscale 경로 표시를 Android가 선택한 routing table에 맞춥니다.
- Docker 기본값을 안전한 host-network-only 방식으로 설정합니다.
- bridge와 방화벽 backend 선택을 위험 옵션으로 제공합니다.
-
reboot now를 Android 전체 재부팅에 연결하고systemctl reboot는 Debian 격리 영역 안에 유지합니다.
- Material 3 대시보드를 제공합니다.
- 앱 이름을 제외한 번역 가능한 UI에 한국어를 제공합니다.
- 로그를 별도 화면과 펼침 구조로 나누고 선택, 복사, 스크롤을 지원합니다.
- SSH 키 생성, 파일 내보내기, 로컬 셸용 명령 복사를 제공합니다.
- 한국어와 영어 설치 가이드, 사용자 매뉴얼, 기술 문서를 제공합니다.
- Markdown 링크, 제목 anchor와 영문·국문 문서 쌍을 로컬과 CI에서 검사합니다.
- 약어를 풀어 쓴 쉬운 용어집과 Google/AOSP 공식 링크를 제공합니다.
- 과거 제품 명칭과 오래된 마이그레이션 안내를 제거했습니다.
- 기본 비활성 MediaCodec 옵션과 앱 내부 진단용
:codec프로세스를 추가했습니다. -
USER_UNLOCKED수명 주기와 분리된 명령별 NDK worker를 BFU/AFU에서 사용할 수 있게 했습니다. - API 29 이상 플랫폼 판정과 API 24~28 보수적 하위 호환 판정을 구현했습니다.
- secure/DRM 및 software fallback을 제외하고 AVC/HEVC 인스턴스 생성을 DE JSON/로그로 기록합니다.
- versioned inherited-FD binary protocol, 3개 지원 ABI용 정적 Debian client와 bionic NDK worker를 구현했습니다.
- 고정 AVC decode/I420 checksum 및 hardware encode/FFmpeg 자체 검사를 구현했습니다.
- bounded packet framing과 timestamp를 유지하는 FFmpeg hardware decode/encode demux/mux wrapper를 구현했습니다.
- listener/descriptor 전달 prototype을 상속
memfd하나와eventfd두 개로 교체하고 socket fallback을 제거했습니다. - 전체 YUV frame을 Debian으로 반환하지 않는 H.264/HEVC→H.264 Surface transcode를 구현했습니다.
- keyframe 요청, worker/session 통계와 잘못된 요청 격리 회귀 검사를 구현했습니다.
- 720p inherited-transport 검사, 1080p30 실시간 Surface transcode와 비정상 client 자원 정리 성능 검사 경로를 구현했습니다.
- 이전 AFU 앱 내부 MediaCodec probe 결과를 기록했습니다. 이 과거 probe는 현재 inherited-FD NDK worker 경로의 검증 결과가 아닙니다.
- Android 16 ARM64 실기기의 잠금 해제 후 환경에서 현재 inherited-FD private NDK worker로 10초, 1920x1080 HEVC 영상(300 frame, 약 8 Mbit/s)을 인코딩했습니다.
- B-frame MP4와 HEVC container 고정 vector, streaming FFmpeg wrapper, software CPU 기준선과 hardware encode PSNR/SSIM 검사를 구현했습니다.
- malformed H.264/HEVC, EOS, 동시 private worker, parent 종료 후 정리 및 5개 workload 장시간 CPU/RSS/thermal 계측 경로를 구현했습니다.
- packet framing과 FFmpeg 계획 어댑터를 Debian이 Essential로 지정한
perl-base기준으로 다시 작성했습니다. 하드웨어 브리지를 위해 인터프리터를 따로 설치하지 않으므로, Python 설치로 Debian 구성 때마다 몇 분씩 걸리던 지연이 사라집니다. - 패키지 설정 중 수 분씩 멈추던 문제의 원인을 규명하고 수정했습니다. 기기
커널의 close_range(2) 백포트가 요청 범위 전체를 순회해, closefrom(3) 한 번에
약 2분의 중단 불가능한 커널 시간이 들었습니다. 커널을 측정한 뒤 해당 호출에
ENOSYS를 돌려주는 seccomp 필터를 적용해, 실기기에서
dpkg-reconfigure openssh-server가 10분 이상에서 3.3초로 줄었습니다. - 패키지를 바꾼 뒤 systemd가 영구히 degraded로 남던 문제를 수정했습니다.
/data가 fscrypt 버전 1을 쓰므로 암호화 키를 호출 프로세스의 키링에서 찾는데,
systemd가 기동 시 새 세션 키링에 합류하면서 그 키를 잃어 모든 서비스가 파일을
만들지 못했습니다(ENOKEY). 측정 기반 seccomp 필터로
KEYCTL_JOIN_SESSION_KEYRING에 ENOSYS를 돌려주도록 했고, 실기기에서 실패 유닛
0개와
system_state=running을 확인했습니다. - BFU 실기기에서 vendor AVC hardware instance 생성을 확인합니다.
- 최초 잠금 해제 전후에 고정 vector decode, encode, inherited memfd/eventfd 전송과 Surface transcode를 검증합니다.
- 실기기에서 1080p 실시간 성능, timestamp 안정성과 자원 정리를 검증합니다.
- DawnShell 코드를 MIT 라이선스로 제공합니다.
- 내장 프로그램의 GPL/LGPL 등 원래 라이선스와 대응 소스를 보존합니다.
- 앱에서 오픈소스 라이선스 전문과 소스 위치를 확인할 수 있습니다.
- GitHub Actions에서 세 ABI와 Android 앱을 빌드하고 검사합니다.
- 태그에서 서명 APK, 대응 소스, 라이선스, 빌드 정보와 SHA-256을 Release로 게시하는 흐름을 제공합니다.
- Android 16 / ARM64 실기기에서
LOCKED_BOOT_COMPLETED를 받았습니다. - BFU에서 DE 파일과 네이티브 실행 파일을 사용했습니다.
- BFU에서 Debian systemd와 SSH를 시작했습니다.
- 첫 잠금 해제 뒤 같은 Debian과 SSH가 유지되었습니다.
- cgroup v1 위임으로 Docker의 cgroup 초기화를 통과했습니다.
- 호스트 네트워크 공유와 Tailscale 경로를 확인했습니다.
- AFU에서 private NDK worker를 시작하고 inherited
memfd/eventfd전송으로 1080p HEVC 하드웨어 인코딩을 완료했습니다. - Android 16 ARM64 실기기에서 3D GPU가 별도로 유휴 상태인 동안
gsmi가 실행 중인 1080p MediaCodec encode client를 감지하는 것을 확인했습니다.
- ARMv7 실기기에서 전체 설치와 BFU 부팅을 확인합니다.
- x86_64 실기기 또는 에뮬레이터에서 전체 흐름을 확인합니다.
- 여러 제조사 ROM에서 5회 cold boot 회귀 시험을 수행합니다.
- Docker bridge backend를 다양한 커널과 방화벽 구현에서 추가 확인합니다.
- 실기기에서 직접/독점 USB hot-plug, 드라이버 복원, 시리얼, libusb와 저장장치를 확인합니다.
- 장기 실행 시 메모리, 마운트와 cgroup 누적 여부를 관찰합니다.
-
BFU_REQUIRE_HARDWARE_CODEC=1로 BFU hardware codec 5회 회귀 시험을 수행합니다.
재부팅
→ PIN 입력 전 SSH 접속
→ systemd PID 1과 SSH 확인
→ 첫 잠금 해제
→ 기존 연결과 PID 1 유지
→ 중복 supervisor 없음
전체 절차는 테스트 방법을 참고해 주세요.