이번 글에서는 우리가 개발한 메트로 스타일 앱을 어떻게 패키징하고 배포하는지 살펴보도록 합니다.

 

 

 

메트로 스타일 앱의 배포 방식의 이해

 

윈도우 응용 프로그램의 경우 보통 .exe나 .msi와 같은 설치 파일로 패키징해서 배포합니다. 사실 윈도우 응용 프로그램의 배포는 단순히 파일만 복사해주면 되는 것이 아니라 ActiveX 컴포넌트를 레지스트리 등록하고, 시작 메뉴 등록하고 각종 세팅 등을 해주고, 거기에 설치 가능 여부 확인 및 조건부 설치 등 매우 복잡합니다. 그래서 Install Shield와 같은 전문 설치 파일 생성 프로그램에서는 다양한 배포 옵션을 제어하기 위해서 전용 스크립팅 기능까지 제공하는 것이 일반적이죠. 뭐 간단한 .NET Framework 윈도우 응용 프로그램은 XCOPY 배포도 가능합니다만…

 

이에 비해 모바일 기기용 앱들은 보통 배포에 필요한 파일들을 하나의 파일로 압축해서 배포하는 경우가 많습니다.

예를 들면, 안드로이드는 *.apk, Windows Phone 7은 *.xap 파일 형식으로 모든 파일을 압축해서 배포하게 되지요.

 

여기서 잠깐

*.apk와 *.xap 파일 모두 ZIP 형식으로 압축되어 있기 때문에 기존 압축 유틸리티로 압축을 풀어서 안의 내용을 볼 수 있습니다.


 

 

메트로 스타일 앱도 이와 비슷하게 배포에 필요한 모든 파일을 *.appx라는 파일로 묶어서 배포하게 됩니다. 물론 *.appx 파일 역시 ZIP 압축 형식입니다.^^

 

예를 들면 HelloWorld 앱의 .appx 파일을 압축 프로그램으로 열어보면 다음과 같이 표시됩니다.

 

image_37.png

 

 

 

메트로 스타일 앱에는 .appx 이외에 .appxupload 라는 파일 형식도 있습니다. *.appxupload은 Windows Store에 등록하는데 사용되는 파일로 프로그램 파일인 *.appx와 다른 필요한 파일들을 다시 압축한 파일입니다.

 

 

 

 

따라서, 메트로 스타일 앱의 배포 과정을 그림으로 표현하면 다음과 같이 됩니다.

 

image_2.png

 

 

 

실질적으로는 앱을 등록하는 방법에는 크게 2가지가 있습니다.

  • Visual Studio 11에는 현재 열린 프로젝트를 바로 Windows Store에 업로드해주는 기능이 있습니다.
  • Microsoft 의 메트로 스타일 앱 등록 사이트에 로그인해서 별도로 만들어놓은 .appxupload 파일을 등록합니다.

 

 

 

 

 

 

Package Manifest 설정하기

 

모바일용 앱을 설치할 때 보면 이 앱이 어떤 권한들을 사용하는지 표시해준 다음 설치하게 합니다. 일반적으로 모바일 기기에서는 각 앱이 사용할 수 있는 권한을 제한하고 어떠한 권한들을 사용하는지 사용자에게 확인을 받게 함으로써 보안성을 높이고 있습니다. 예를 들어서, 어떤 앱이 사용자 몰래 GPS를 켜서 사용자의 이동 경로를 몰래 수집할 수도 있겠죠. 그래서 GPS를 사용하는 앱은 설치 시 또는 실행 시 이 프로그램이 위치 정보를 사용한다는 것을 사용자에게 알려주도록 되어 있습니다.

 

메트로 스타일 앱에도 마찬가지로 각 기능의 사용 여부를 지정하는 옵션이 있는데, 바로 Package Manifest에서 이러한 옵션을 설정하게 됩니다. 참고로, 배포를 위한 패키지 생성에 앞서서 반드시 Package Manifest를 먼저 설정해야 합니다.

 

 

 

 

Visual Studio의 Solution Explore에서 Package.appxmanifest를 더블클릭하면 다음과 같은 창이 뜹니다.

 

image_4.png

 

 

 

 

 

Application UI에서는 프로그램의 표시 이름, 설명, 초기 레이아웃, 로고, 스플래시 이미지 등 프로그램의 정보와 모양을 지정할 수 있습니다.

 

image_6.png

 

 

 

 

 

 

Capabilities 탭을 보시면 각 기능의 허용 여부를 지정할 수 있습니다. 예를 들어서 이 프로그램 인터넷에서 정보를 가져오는 RSS 리더라면 반드시 “Internet (Client)” 를 체크해야만 서버에서 RSS 피드를 읽어올 수 있습니다. 이 외에도 위치 정보, 웹 캠, 외장 저장소 등이 접근 권한도 지정할 수 있지요.

 

image_8.png

 

 

 

 

이처럼, 개발하는 앱이 사용하는 기능에 따라서 Capabilities를 설정해줘야 앱이 해당 기능을 사용할 수 있습니다. 한 가지 재미있는 것은 “Enterprise Authentication”인데, Active Directory를 사용하는 엔터프라이즈 인트라넷 환경에서 도메인 크레덴셜을 사용하여 인트라넷 리소스에 접근할 수 있는 권한도 설정이 가능합니다. 이러한 옵션은 다른 모바일 앱에는 없는 옵션으로 기존 윈도우 환경을 배려하고 있네요.

 

 

 

 

Declarations 탭에서는 현재 앱의 추가적인 속성을 정의합니다.

예를 들면, 다음과 같이 파일을 여러 때 이 앱이 지원하는 파일 형식을 지정할 수가 있습니다.

 

image_thumb_4.png

 

 

 

 

마지막으로 Packaging 탭에서는 패키지 생성과 관련된 속성을 지정합니다. 여기에 설정되는 값들은 대부분이 Windows Store를 위한 것들이죠.

 

image_12.png

 

 

 

 

 

 

 

 

 

Visual Studio로 배포 패키지 생성하기

 

 

이제 배포를 위한 Package Manifest 설정이 끝났으면 실제 패키지를 만들어봅시다.

 

Visual Studio의 Project 메뉴 –> Store 메뉴를 보시면 패키징 및 배포와 관련된 메뉴들을 찾을 수 있습니다.

 

image_16.png

 

 

 

 

 

하나씩 살펴보도록 하죠.

 

  • Open Developer Account
    개발자 계정 페이지를 엽니다. 아쉽게도 현재는 아래 나라의 개발자만 접근이 가능합니다.
    근데, 제가 알기로는 Windows 8 컨슈머 프리뷰에서는 이 나라들의 개발자라고 하더라도 허가된 일부 개발자들만 앱을 올릴 수 있는 것으로 알고 있습니다.(확인 필요) 애플의 앱스토어에 앱을 올리려면 개발자 등록을 해야 하는데, 이와 비슷하다고 생각하시면 됩니다.
    image_18.png

 

 

  • Reserve App Name
    자기가 스토어에 올릴 프로그램 이름을 예약하는 기능입니다. 이 기능 역시 한국에서는 아직 안됩니다.
    예를 들어서 어떤 개발자가 “My Hello World”라는 앱을 개발할 계획을 가지고 있을 때 남들이 이 이름을 먼저 사용하지 못하게 미리 확보할 수 있다는 것이죠. 참고로, 앱 이름 예약의 유효기간은 12개월이며 이 기간 내에 앱을 등록하지 않으면 만료됩니다.

 

  • Edit App Manifest
    현재 프로젝트의 Package Manifest를 편집합니다. 위에서 이미 설명했죠.

 

  • Associate App With the Store
    이 기능 역시 우리는 아직 사용할 수가 없습니다. 설명에 따르면  Developer Windows Live ID로 로그인 한 다음 Store쪽의 정보와 현재 프로젝트의 앱을 연결하여 결제 및 알림 시나리오를 테스트할 수 있도록 해준다고 하는군요.

 

  • Capture Screenshots

    앱의 화면을 캡쳐해주는 기능인데 사실은 그냥 시뮬레이터를 실행해줄 뿐입니다. 시뮬레이터에 있는 Capture Screen 버튼을 누르는 것은 우리 몫이죠^^

 

  • Create App Package
    현재 프로젝트를 실제로 패키징 해주는 메뉴입니다.

 

 

 

Create App Package 메뉴를 클릭하면 다음과 같은 창이 뜹니다.

 

image_20.png

 

 

첫번 째 옵션은 Developer Windows Live ID가 필요하므로 아직 사용할 수가 없습니다.

두번 째 옵션을 선택하면 Windows Store를 거치지 않고 로컬에서 테스트할 수 있는 패키지를 생성해줍니다.  현재로서는 이 기능만 사용이 가능합니다.

 

 

 

“Create a package to use locally only”를 선택한 후 Next를 누르면 다음과 같은 화면이 나옵니다.  이 화면에서는 로컬 테스트용 패키지를 생성할 때의 옵션을 지정할 수 있습니다.

각 플랫폼 별로 Configuration을 선택할 수 있으며, 맨 아래에 있는 옵션을 선택하면 앱이 다운되었을 때 분석하는데 도움을 주는 Public Symbol 파일(*.appxsym)을 생성해줍니다.  대부분의 경우 기본값을 사용하면 되겠지요.

 

image_thumb_10.png

 

 

 

 

 

Create 버튼을 클릭하면 다음과 같이 패키지가 잘 생성되었다고 알려줍니다.

화면에 있는 생성 경로를 마우스로 클릭하면 생성된 패키지 폴더가 열립니다.

 

image_thumb_11.png

 

 

 

 

 

 

생성된 폴더를 열어보니 다음과 같이 파일과 폴더가 생성되어 있군요.

 

image_thumb_12.png

 

 

 

 

 

생성된 파일들을 하나씩 살펴보도록 합시다.

 

Create App Package 메뉴에서 자동으로 버전 증가 옵션을 체크하면 위 스크린샷과 같이 패키지를 만들 때마다 버전이 올라가면서 각 버전별로 파일과 폴더가 생성이 됩니다. 그리고, 잘 보시면 각 버전마다 “앱이름.appxupload”“앱 이름” 폴더가 생성되어 있습니다.

 

첫 부분에서 말씀 드렸듯이 .appxupload는 Windows Store용 등록 파일입니다. 이 파일을 “Uplaod App Package” 메뉴를 통해 Windows Store에 올리는 것이죠.

.appxupload 파일을 압축 프로그램으로 열어보면 다음과 같이 실제 앱이 들어있는 .appx 파일과 디버깅용 심볼 테이블 정보를 담고 있는 .appxsym이 들어있음을 보실 수 있습니다.

 

image_thumb_13.png

 

 

 

 

이번에는 생성된 폴더 쪽을 보도록 하죠.

 

image_thumb_14.png

 

 

 

 

 

각 파일에 대한 설명은 다음과 같습니다.

  • Add-AppxDevPackage.bat – 개발용 머신에 설치하기 위한 배치 파일, 해당 머신에 Developer License 필요
  • HelloWorld_1.0.0.9_AnyCPU_Debug.appx – 실행에 필요한 파일이 ZIP 형식으로 압축된 파일
  • HelloWorld_1.0.0.9_AnyCPU_Debug.appxsym – 디버깅용 심볼 파일
  • HelloWorld_1.0.0.9_AnyCPU_Debug.cer – 보안 인증 파일

 

 

 

Add-AppxDevPackage.bat 는 개발용 로컬 머신에 설치하기 위한 배치 파일로 Windows Store를 거치지 않고 로컬에서 바로 앱을 설치할 수 있게 해줍니다. 그냥 더블클릭하면 다음과 같이 관리자 권한으로 실행하라고 친절히 알려줍니다.^^;

 

image_thumb_15.png

 

 

 

 

그렇다고 자기 PC에서 바로 관리자 권한으로 실행하면 오류가 나는데, 이미 자기 PC에서는 Visual Studio에서 빌드하면서 앱이 등록이 되어 있기 때문입니다.  따라서 테스트할 다른 머신에 생성된 폴더를 통째로 복사한 다음 Add-AppxDevPackage.bat 를 관리자 권한으로 실행해야 합니다.

 

 

 

앞 부분에서 .appx에 실제 앱 파일들이 포함되어 있다고 했는데,  HelloWorld_1.0.0.9_AnyCPU_Debug.appx 를 압축 프로그램으로 열어보면 다음과 같이 exe 파일을 비롯한 여러 개의 파일이 안에 들어있습니다.

 

image_thumb_16.png

 

 

 

 

여기서 잠깐

앱을 개발하다 보면 이미지와 같은 외부 리소스를 사용하는 경우가 많습니다.

예를 들면, 아래와 같이 accept.png를 프로젝트에 등록하면 기본적으로 Build ActionContent로 됩니다.

 

image_thumb_18.png

  

이렇게 Content로 등록된 파일들은 빌드시 debug/release 폴더에 복사가 되며 .appx로 패키징할 때도 같이 포함이 됩니다. 다음 스크린 샷을 보시면 .appx에 포함되어 있음을 확인하실 수가 있습니다.

image_thumb_19.png


 

 

 

 

 

좀 장황하게 설명했는데, 정리하면 다음과 같습니다.

 

1) Visual Studio의 Sotre->Create App Package 메뉴 클릭

2) “Create a package to use locally only”를 선택하여 로컬 테스트용 패키지 생성

3) 생성된 폴더를 테스트할 머신으로 복사 후 Add-AppxDevPackage.bat를 관리자 권한으로 실행

 

 

 

생각보다 간단하죠?

 

그런데, 이렇게 보니 마치 안드로이드에서 APK 파일만 복사해서 설치하는 되는 것처럼 Windows Store를 거치지 않고 마구마구 배포되는 거 아닌가 싶은 생각이 드는군요. MS가 바보가 아닌 이상 이렇게 둘 리가 없겠죠? 그래서 Developer License라는 기능이 있습니다.

 

 

 

 

 

 

 

 

Developer License에 대하여…

 

 

로컬 테스트용 패키지는 Windows Store를 거치지 않고 배포할 수 있는 대신 배포하는 머신에는 반드시 Delveoper License가 있어야 합니다.

Developer License라고 하니 좀 거창해 보이면서 추가 비용이 들 것 같은 느낌을 주는데, 공짜이며 우리가 원하는 만큼 마음대로 발급할 수 있습니다. 심지어는 Windows Store 등록을 위한 계정도 없어도 됩니다.

 

 

 

 

 

Developer License 발급받기

 

관리자 권한으로 커맨드 창을 실행한 다음 “powershell”을 입력하여 PowerShell을 실행합니다.

 

image_42.png

 

 

Show-WindowsDeveloperLicenseRegistration 를 입력하면 다음과 같이 “동의” 창이 뜹니다. 

 

image_thumb_20.png

 

 

 

 

“I Agree”를 클릭하면 로그인 계정의 비밀 번호를 물어본 다음 잠시 기다리면 다음과 같이 라이센스가 발급되었다고 나옵니다.

간단하죠?

 

image_46.png

 

 

 

 

 

Developer License 관련하여 다음과 같은 명령도 사용할 수 있습니다.

  • Get-WindowsDeveloperLicense : 현재 머신의 Developer License 정보를 표시합니다.
  • Unregister-WindowsDeveloperLicense : 현재 머신의 Developer License를 제거합니다.

 

 

 

그런데 위 스크린샷의 내용을 보니 발급한지 31일 후에 만료되는 것으로 나오네요?

네 맞습니다. Developer License는 머신 단위로 생성이 되며 발급 후 31일이 지나면 만료됩니다….. 엥?

그럼 딸랑 한 달밖에 못쓴다는 건가요?

 

걱정마세요! Developer License는 계속해서 갱신할 수 있습니다.^^

한 달이 지난 후에 위에서 설명한 것처럼 다시 발급받으면 됩니다.

 

참고로, Visual Studio 11을 실행할 때 Developer License가 없거나 만료되었으면 자동으로 안내 창이 뜨면서 갱신이 되니 Developer License의 유효기간이 31일이라고 해서 개발에 문제가 되지는 않습니다.

 

 

여기서 잠깐

리모트 디버깅을 위해 다른 머신에 리모트 디버거를 설치하면 기본적으로 Developer License가 생성이 됩니다. 이 역시 유효기간은 31일이므로 Developer License가 만료되면 PowerShell을 이용하여 갱신해야 합니다.


 

 

 

Developer License와 보안

 

Developer License는 머신 단위로 발급이 되며 발급 될 때 Microsoft 의 서버와 통신하게 됩니다. 또한 Microsoft에서 발급된 Developer License를 모니터링할 수 있다고 합니다. 만약 계약 사항을 위반하여 사용하는 사례가 발견되면 해당 Developer License가 취소될 수 있다고 하는군요.

 

또한, Developer License가 설치되어 있는 머신에는 우리가 만든 앱 뿐만 아니라 다른 사람이 만든 앱도 Windows Store를 거치지 않고 설치될 수 있기 때문에 아무래도 보안의 위협이 생길 수가 있습니다.

 

이러한 이유들로 인해 Developer License는 꼭 테스트가 필요한 머신에서만 발급하실 것을 권장합니다.

 

 

 

 

 

 

 

 

Windows App Cert Kit 사용하기

 

 

개발한 앱을 Windwos Store에 올리게 되면 심사를 받게 되는데, Windowns App Cert Kit을 이용하면 우리가 만든 앱의 기본적인 기능을 미리 테스트하여 심사 전에 문제점을 미리 발견할 수 있도록 도와줍니다.

 

Windowns App Cert Kit은 다음과 같은 사항들을 자동으로 테스트하고 결과를 알려줍니다.

 

  • Package Manifest가 다음 요구 조건을 만족하는지 테스트함
    - Number of tiles
    - Number of apps per package
    - App type
    - ResourceID not listed
    - OSVersionHighestTested
  • 메트로 스타일 앱에서 지원하지 않는 API를 사용하는지 테스트함
  • 앱이 얼마나 빨리 실행되고 대기 상태로 들어가는지 테스트함
  • Manifest에 정의된 언어에 대한 언어 리소스가 잘 포함되어 있는지 테스트함
  • 보안에 문제가 있는지 테스트함
  • 앱이 다운되거나 멈춰버리는 지 모니터링함

 

 

 

Windowns App Cert Kit를 실행하면 다음과 같은 창이 뜹니다.

 

image_48.png

 

 

 

 

잠시 기다리면 현재 머신에 설치되어 있는 앱의 목록이 표시됩니다.

목록에서 우리가 만든 앱을 선택한 후 Next를 클릭합니다.

image_50.png

 

 

 

 

 

그러면, 다음과 같이 검사를 진행합니다. 이 때 테스트를 하는 동안 앱을 사용하지 말라고 하는군요.

실제로, 테스트 도중에 앱이 자동으로 실행되는 것을 보실 수가 있습니다.

 

주의사항!: 절대로 가만 놔두셔야 합니다. 안 그러면 제대로 테스트가 수행되지 못해서 무진장 오래 걸리거나 실패합니다.

 

image_52.png

 

 

 

 

 

한참을 기다리면 XML된 리포트을 어디에 저장하겠느냐고 물어봅니다.

저장한 XML 리포트를 열어보면 다음과 같이 테스트 결과를 보여줍니다.

 

image_58.png

 

 

 

 

왜 실패했나 봤더니 다음과 같이 디버그 모드로 컴파일되어 있다고 알려주는군요.

사실, 이 외에도 실패한 테스트가 몇 개 더 있는데, 그 부분은 아직 구현을 안해서 그런 겁니다.

 

image_60.png

 

 

 

여기서 잠깐

Windowns App Cert Kit은 다음과 같이 커맨드라인으로도 실행할 수 있습니다.

appcert.exe reset
appcert.exe test -apptype metrostyle -packagefullname [package full name] -reportoutputpath [report file name]

 

여기서, appcert.exe는 기본적으로 C:\Program Files\Windows Kits\8.0\App Certification Kit 폴더에 위치합니다.