안드로이드 스마트폰에는 대개 문서, 이미지, 오피스 파일을 여는 뷰어 앱이 여러 개 미리 깔려 있다. 문제는 이들 상당수가 파일을 열기 위해 저장소 전체 접근 권한을 요구하거나, 렌더링을 위해 문서를 클라우드 서버로 넘긴다는 점이다. 사용자는 단지 첨부된 계약서 하나를 확인하고 싶을 뿐인데, 그 과정에서 앱이 어떤 데이터를 어디로 보내는지 통제하기 어렵다. 최근 해커뉴스에 공개된 오픈소스 프로젝트 '갠더(Gander)'는 이 구조를 정반대로 뒤집는다. 약 15MB 크기의 단일 APK로 PDF, 워드, 엑셀, 파워포인트, 사진, 영상, 오디오, 마크다운, 텍스트, 코드까지 하나의 앱에서 열되, 광고와 추적이 없고 인터넷 접근 자체를 하지 않는다.
권한을 안 받는 게 아니라 아예 선언하지 않는다
갠더의 핵심 설계 원칙은 'INTERNET 권한을 아예 매니페스트에 선언하지 않는다'는 것이다. 이는 단순히 네트워크를 자제하겠다는 약속과 근본적으로 다르다. 안드로이드에서 앱이 인터넷에 접속하려면 INTERNET 권한이 필요한데, 이 권한이 선언돼 있지 않으면 운영체제 수준에서 네트워크 스택 접근이 원천 차단된다. 개발자가 나중에 마음을 바꿔도, 혹은 악성 코드가 섞여 들어와도 데이터를 외부로 내보낼 통로가 존재하지 않는다. 사용자 입장에서는 '신뢰할지 말지 판단할 대상'이 사라지는 셈이다.
파일을 앱에 건네는 방식도 최소 권한 원칙을 따른다. 갠더는 저장소 전체를 스캔하는 대신 안드로이드의 스토리지 액세스 프레임워크(SAF)와 '연결 프로그램(Open with)' 인텐트를 통해 파일을 받는다. 즉 사용자가 명시적으로 고른 문서만 운영체제가 앱에 넘겨주고, 그 외 파일에는 접근하지 못한다. 폴더 탐색 기능도 ACTION_OPEN_DOCUMENT_TREE로 사용자가 허가한 특정 폴더에 한정된다. 다만 안드로이드는 다운로드 최상위 폴더 자체에 대한 접근 권한은 어떤 앱에도 내주지 않으므로, 문서 폴더나 DCIM, 혹은 다운로드의 하위 폴더를 지정해야 한다는 실무적 제약이 있다.
오피스 문서는 격리된 웹뷰 안에서 렌더링된다
기술적으로 흥미로운 부분은 오피스 포맷 처리 방식이다. 갠더는 파일 확장자를 1순위, MIME 타입을 2순위로 판별해 네 가지 렌더링 경로로 분기한다. PDF는 네이티브 Pdfium 뷰, 사진은 타일 방식의 SubsamplingScaleImageView, 영상과 오디오는 Media3 ExoPlayer로 처리하고, 워드·엑셀·파워포인트·마크다운 등 나머지는 앱에 내장된(vendored) 자바스크립트 라이브러리로 웹뷰 안에서 그린다. 이 웹뷰는 격리된 상태로 동작하며, 모든 요청을 WebViewAssetLoader가 가로챈다. 렌더링에 쓰이는 JS 라이브러리는 네트워크가 아니라 앱 자산에서 로드되고, 문서 본문은 콘텐츠 URI에서 스트리밍된다. 결과적으로 웹뷰를 쓰면서도 실제 네트워크는 한 번도 건드리지 않는다.
내장 라이브러리는 docx-preview(Apache-2.0), 엑셀용 SheetJS CE(Apache-2.0), PPTXjs, 마크다운용 marked, 그리고 HTML 정화를 담당하는 DOMPurify 등으로 구성되며 모두 MIT·Apache·BSD 계열의 개방형 라이선스다. 앱 본체는 MIT 라이선스를 따른다.
실무자가 알아둘 한계와 도입 조건
만능은 아니다. 구형 바이너리 포맷인 .doc와 .ppt는 지원하지 않는다. 이를 충실히 재현하는 오프라인 렌더러가 존재하지 않기 때문인데, 앱은 이 사실을 안내하며 .docx나 .pptx로 다시 저장할 것을 권한다. 반면 바이너리 .xls는 열린다. 업데이트는 새 APK를 기존 앱 위에 덮어쓰면 되고, 최근 파일 목록과 폴더 접근 허가는 유지된다. 앱 스토어를 거치지 않는 자동 업데이트를 원한다면 Obtainium에 깃허브 저장소를 소스로 추가해 태그된 릴리스를 따라가게 할 수 있다.
기업 환경이나 개인정보 민감도가 높은 조직이라면 '오프라인·제로 권한'이라는 설계는 매력적인 선택지다. 문서를 클라우드로 보내지 않는다는 점을 코드 수준이 아니라 운영체제 권한 모델로 보증하기 때문에 보안 감사 부담이 줄어든다. 직접 빌드하려면 JDK 17 이상과 안드로이드 SDK(플랫폼 35)가 필요하며, 릴리스 서명에는 로컬에 별도로 생성한 키스토어가 요구된다. 이 키스토어는 개인 서명 키인 만큼 의도적으로 깃 추적에서 제외돼 있어, 공개 저장소에 올라가지 않도록 관리된다.
결국 갠더가 흥미로운 이유는 화려한 기능이 아니라 '무엇을 하지 않는가'를 아키텍처로 못박았다는 데 있다. 뷰어 앱이 왜 인터넷 권한을 갖고 있어야 하는지, 왜 저장소 전체를 봐야 하는지 되묻게 만든다는 점에서, 규모가 작은 오픈소스 프로젝트치고는 제법 묵직한 질문을 던진다.
"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"
실제 수강생 후기- 비전공자도 6개월이면 첫 수익
- 20년 경력 개발자 직강
- 자동화 프로그램 + 소스코드 제공