안드로이드 키오스크(Kiosk) 앱 개발 (3/3)

앞의 과정(안드로이드 키오스크 앱 개발 1/3, 안드로이드 키오스크 앱 개발 2/3)에서 안드로이드 앱을 기기의 키오스크 모드로 동작시키기 위한 프로그래밍 방법을 살펴봤다. 여기에서는 앞의 과정으로 만든 앱을 실 기기에 배포하는 방법을 살펴본다. 앱을 프로비저닝해서 실 기기에 배포하는 방법(버전별 지원 방법 확인)으로 NFC와 QR 코드로 앱을 설치하는 두 가지 방법이 널리 쓰이고, 여기에서 QR 코드를 사용하는 방법을 살펴보자.

전체 과정은 앱을 빌드하고, 빌드된 APK를 웹 서버에 업로드하고, 이 정보를 바탕으로 QR 코드를 생성하고, 마지막으로 QR코드를 사용해서 프로비저닝된 APK를 실제 기기에 설치하면 된다. 아래에서 개별 과정을 살펴보자.

1. 앱 빌드

릴리즈 버전의 앱은 아래의 2가지 방법으로 빌드하면 된다.

1.1 안드로이드 스튜디오의 Build > Generate Signed Bundle/APK 메뉴를 선택해서 빌드한다.

1.2 터미널(Terminal) 탭에서 아래의 명령으로 APK를 빌드한다.

./gradlew aR 

2. 웹 서버 및 ngrok 툴 설정

이제 빌드한 앱을 다운로드할 수 있는 엔드 포인트를 만들어보자.

2.1 웹 서버

아래 주소에서 간단한 바로 실행할 수 있는 자바 웹 서버를 다운로드 한다.
http://www.jibble.org/miniwebserver/

그리고, 아래의 명령으로 자바 웹 서버를 실행한다.

java -jar SimpleWebServer.jar

2.2 ngrok 툴 설정

아래 주소에서 ngrok 툴을 다운로드 받아서 설치한다.
https://ngrok.com/

내/외부에서 쉽게 도메인을 치고 들어올 수 있게 지원하는 툴이다. 이 툴의 설명을 보면, “secure introspectable tunnels to localhost”로 안전하게 로컬호스트로 터널링을 지원하는 도구라는 것을 알 수 있다.

아래이 명령으로 외부에서 http(s)://xxxxx.ngrok.io 도메인으로 접속할 수 있게 한다.

ngrok http 80 


– 웹 서버와 ngrok 툴 설정화면


– 웹 브라우저로 ngrok 툴이 설정한 주소로 접근한 화면

3. QR 코드 생성

이제 앱을 프로비저닝하는 QR 코드를 만들어 보자. APK 프로비저닝하기 위해서 QR 코드에 입력해야 하는 값은 아래와 같은 같다.

{
"android.app.extra.PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME":"net.sjava.examples.kiosk/.KioskDeviceAdminReceiver",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION":"https://745b0d80.ngrok.io/app-release.apk",
"android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM":"xxxx-xxxx-xxxxxx-xxxxxxxx_xxxx",
"android.app.extra.PROVISIONING_SKIP_ENCRYPTION":true,
"android.app.extra.PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED":true,
}

– QR 코드 입력값

위 코드에서 PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME 값은 패키지와 관리자 리시버 클래스 이름이다. PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION은 APK 파일을 다운로드 받을 주소이다. PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM은 APK의 CHECKSUM 값으로 아래의 명령을 사용해서 개발한 앱의 CHECKSUM 값을 구할 수 있다.

apksigner verify -print-certs app-release.apk | grep -Po "(?<=SHA-256 digest:) .*" | xxd -r -p | openssl base64 | tr -d '=' | tr -- '+/=' '-_'

PROVISIONING_SKIP_ENCRYPTION나 PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED은 이름에서 알 수 있듯이 암호화와 기존 시스템앱을 모두 사용할 수 있게 설정한다는 것이다.

위의 값으로 http://down-box.appspot.com/ 에서 위의 과정으로 만들어진 값을 사용해 아래와 같이 QR 코드를 쉽게 만들 수 있다.
위에서 샘플로 만들어본 QR 코드는 http://down-box.appspot.com/qr/GH1ayZg9 주소에서 확인할 수 있지만, 실제 기기에서는 동작하지 않는다.

4. QR 코드로 APK를 관리자 앱으로 설치

테스트할 수 있는 안드로이드 기기를 공장 초기화(Factory Reset)한다. 그리고, 첫 부팅 화면에서 시작 버튼이나 다른 버튼을 사용해서 안드로이드 기기를 시작하지 말고, 바탕 화면을 연속해서 6~7번 탭을 하면 QR 코드를 읽을 수 있는 앱을 실행하게 된다. 또는 안드로이드 7을 사용중인 경우에는 Wifi에 연결한 뒤에 QR 코드를 읽는 앱을 다운로드 해서 실행하는 경우가 있기에 조금 기다리면 QR 코드를 읽는 앱을 볼 수 있다.

이 앱을 사용해서 프로비저닝된 앱을 설치하면, 이 앱은 소유자 권한으로 설치가 되고 이 앱을 통해서 비교적 안전하게 키오스크 모드로 동작하는 앱을 배포할 수 있다.

Reference

https://developers.google.com/android/management/provision-device
https://github.com/googlesamples/android-testdpc

12 thoughts on “안드로이드 키오스크(Kiosk) 앱 개발 (3/3)

  1. 안녕하세요 키오스크 모드 개발관련 3가지 게시해주신 내용을 보고 참고하던중 3/3의 실 기기에 QR코드로 설치하는 부분에서 진행이 되지않아 도움을 받을수있는지 해서 문의드립니다. 증상은 크게 두가지인데
    1. ‘QR코드 인식 후 직장 기기 설정중입니다.’ 설치 애니메이션이 두시간이 지나도 다음화면으로 넘어가지 않는 증상
    2. 체크섬 오류로 설치할수 없으니 IT관리자에게 문의해주세요

    다운로드 URL은 https, http 바꿔가면서 해보고 시그니처 체크섬 대신 패키지 체크섬으로도 변경해서 qr코드 생성해서 공장초기화 후 설치 해봤지만 동일하게 진행이 되지 않아 이렇게 문의 글을 남겨봅니다.

    1. 안녕하세요..
      1. 번 증상은 만드신 QR 코드의 값에 서버설정에 문제가 있거나 설정한 서버에 연결해서 apk를 다운로드 하지 못하는 경우의 증상입니다. 설정 문제이니 다시 잘 확인해 보세요. ^^
      2. 번 증상도 설정 이슈입니다. 체크섬을 만든 apk와 서버에 올라간 apk가 달라서 발생한 이슈입니다.서버 apk로 체크섬을 만드신 후에 일치하는지 확인해 보세요..

      1. 안녕하세요 답변 감사드립니다.

        증상 관련해서 질문을 드립니다.

        알려주신대로 로컬에서 생성한 apk 와 서버에서 내려받은 apk 의 체크섬을 비교하였지만 동일한 체크섬을 확인하였습니다. DOWNLOAD_LOCATION 경로도 웹사이트를 열어서 직접 다운로드 해도 이상이 없구요.

        기존소스 삭제하고 처음부터 다시 한번 진행을 하였는데 놓친 부분이 있을가 해서요..

        https://github.com/mcsong/SimpleKioskDemo 소스 코드를 다운로드 받아 안드로이드 스튜디오에서 APK로 KEY STORE 만 신규로 생성해서 만들었습니다.

        체크섬은 위에 올려주신 대로
        apksigner verify -print-certs app-release.apk | grep -Po “(?<=SHA-256 digest:) .*" | xxd -r -p | openssl base64 | tr -d '=' | tr — '+/=' '-_'

        값을 구했는데
        rX4i)hHu0vp5UbbfV5olVuLMgYTr3yCZFe3LMseeick
        이런형태로 나옵니다.

        위에 QR 코드 정보 예를 적어준걸 보시면

        "android.app.extra.PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM":"xxxx-xxxx-xxxxxx-xxxxxxxx_xxxx"

        위와 같은 형태로 되어있는데
        xxxx-xxxx-xxxxxx-xxxxxxxx_xxxx

        위와같은 형태로 만들어져야 정상적인 체크섬인건가요?

        APK 생성 시
        Signature Versions 은 1. V1 / V2 체크 2. V1 체크 3. V2 체크
        3가지 유형으로 진행을 하였지만 마찬가지로 체크섬 오류로 설치할 수 없다는 오류가 발생했습니다.

  2. 안녕하세요~ 키오스크 관련 포스팅 너무 잘 봤습니다 🙂
    다름이 아니라 질문이 하나 있는데요.
    최초 설치 시 공장초기화 후 QR 화면으로 전환하는 과정까지는 알겠는데,
    그 후 원격 업데이트를 하려고 한다거나… 그럴땐 어떻게 진행하실까요?

    기기를 가진 점주들에게 다시 공장초기화 후 QR을 찍는 과정을 요청해야 할까요?

    1. 안녕하세요.
      QR 코드로 앱을 설치하게 되면, 앱이 Owner 권한을 획득하게 되고, 앱 레벨에서 시스템 레벨의 코드로 업데이트를 할 수 있습니다. 그래서, 앱에서 업데이트를 지원하시면 됩니다.

      1. 답변 정말 감사드립니다 ^^
        android update owner app 등 키워드로 검색중인데 시스템 레벨 API가 잘 검색되지 않아서요.
        혹시 업데이트를 실행할 수 있는 코드 한 줄만 알려주실 수 있을까요?
        도움 주셔서 정말 감사드려요!

        1. 앱을 qr 코드로 설치를 했으면.. 앱이 owner 권한을 가지고 동작을 할 겁니다.. DPM의 메서드 ( https://developer.android.com/reference/android/app/admin/DevicePolicyManager?hl=en#isDeviceOwnerApp(java.lang.String) )로 확인하시면 앱이 owner 권한으로 동작하고 있는지 확인하실 수 있을 겁니다. 아래 링크 코드를 사용해서 다운로드 받은 apk를 업데이트하실 수 있을 겁니다.
          https://stackoverflow.com/questions/51562940/android-install-apk-silently-with-packageinstaller-and-packageinstaller-sessio

  3. 안녕하세요…
    잘 따라했다 생각했는데

    이런!
    관리 앱을 설치할 수 없습니다!

    라는 메세지가 나오네요…
    혹시 도움받을 수 있는 부분이 있을까요?
    ‘직장 기기 설정’까지 넘어와서
    ‘관리 앱 다운로드중…’을 지나
    ‘관리 앱 설치중…’에서 해당 오류가 발생합니다.

  4. 안녕하세요.
    개발중인 앱을 관리자 앱으로 설치 테스트를 해 보세요. 이 문제가 아니라면 중간 과정에서 설정 문제일 가능성이 높아 보입니다.

    1. 아! 해결했습니다.
      android:testOnly=”true”
      테스트코드를 삽입한 상태론 QR설치(관리자설치)가 안되는 거였군요.
      좋은 자료 정말 감사합니다 ^^

Leave a Reply to 이창민 댓글 취소

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다