Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 2개 있습니다.)
(시리즈 글이 3개 있습니다.)
개발 환경 구성: 183. Xamarin 2.0 - 윈도우 환경의 Visual Studio에서 C#으로 iOS/Android 응용 프로그램 개발
; https://www.sysnet.pe.kr/2/0/1415

Phone: 10. Xamarin.Forms - 1. Forms 시작하기
; https://www.sysnet.pe.kr/2/0/1699

Phone: 11. Xamarin.Forms - 2. XAML을 이용한 페이지 개발
; https://www.sysnet.pe.kr/2/0/1702




Xamarin 2.0 - 윈도우 환경의 Visual Studio에서 C#으로 iOS/Android 응용 프로그램 개발

아래의 글에서 이에 대한 자세한 소식을 들을 수 있습니다.

Announcing Xamarin 2.0
; http://blog.xamarin.com/announcing-xamarin-2.0/

그중에서 "3. Develop iOS apps in C# with Visual Studio"에 해당하는 동영상이 재미있습니다. 아래는 그 동영상에서 2개의 화면을 캡쳐한 것입니다.

ios_in_vs_1.png

ios_in_vs_2.png

보는 바와 같이, Visual Studio에서 가상 에뮬레이터를 설정하고 곧바로 Run 키를 이용해 iOS 응용 프로그램을 테스트 할 수 있습니다.




예전에 안드로이드 예제를 만든 적이 있었는데요.

안드로이드 - Hello World 실습
; https://www.sysnet.pe.kr/2/0/1378

이번엔 Xamarin 2.0으로 한번 해볼까요? ^^ 다운로드는 다음의 경로에서 간단한 사용자 정보만 입력하고 진행할 수 있습니다.

Download Xamarin Today - Build iOS, Android and Mac apps using C# and .NET.
; http://xamarin.com/download

다운로드한 파일을 실행하면 다음과 같은 구성 요소들이 설치됩니다.

ios_in_vs_3.png

  • Android SDK
  • GTK#
  • Xamarin Studio
  • Xamarin.Android for Visual Studio and Xamarin Studio
  • Xamarin.iOS for Visual Studio

이제 Visual Studio를 실행해서 "New Project"를 가보면 다음과 같이 iOS와 함께 Android 관련한 프로젝트를 생성할 수 있습니다.

ios_in_vs_4.png

"Android Application"을 선택하고 생성하면 다음과 같은 구조의 프로젝트가 생성됩니다.

[프로젝트]
    [Properties]
        AssemblyInfo.cs
    [Components]

    [Assets]
        AboutAssets.txt
        
    [Resources]
        [Drawable]
            Icon.png
        [Layout]
            Main.axml
        [Values]
            Strings.xml
    
    AboutResources.txt
    Resource.Designer.cs

Activity1.cs

이 중에서 Activity1.cs 파일의 기본 내용은 다음과 같습니다.

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace AndroidApplication1
{
    [Activity(Label = "AndroidApplication1", MainLauncher = true, Icon = "@drawable/icon")]
    public class Activity1 : Activity
    {
        int count = 1;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            Button button = FindViewById<Button>(Resource.Id.MyButton);

            button.Click += delegate { button.Text = string.Format("{0} clicks!", count++); };
        }
    }
}

일단, 이것을 에뮬레이터에서 실행해 볼 텐데요. 윈폰의 경우에는 그냥 프로젝트에서 실행을 하면 에뮬레이터로 자동 실행이 되었지만, 안드로이드는 미리 에뮬레이터를 하나 띄워 놓아야 합니다. (참고로, 에뮬레이터 부분은 Xamarin 측에서 만든 것이 아니고, Android SDK에 포함된 것이 그대로 적용되었습니다.)

이를 위해 Visual Studio 툴바에 생긴 다음과 같은 아이콘을 누르면 됩니다.

ios_in_vs_5.png

그럼 "Android Virtual Device Manager"가 실행되고, 목록에서 원하는 가상 장치를 선택한 다음 "Start..." 버튼을 눌러주면 에뮬레이터가 실행됩니다.

ios_in_vs_6.png

이제 "F5" 키를 눌러 실행하면 현재 실행 중인 에뮬레이터 목록을 보여주면서 그중에 하나를 선택할 수 있는 창이 뜹니다.

ios_in_vs_7.png

현재는 에뮬레이터를 하나만 띄워 놓았기 때문에 목록에는 하나만 있습니다. 이를 선택해서 "OK" 버튼을 누르면 "F5" 키를 눌렀으므로 디버그 모드로 프로그램이 배포되어 실행됩니다. (사실, 에뮬레이터가 그다지 훌륭하지 못해서 오류가 발생하기도 하는데요. 그런 때는 다시 "F5"를 눌러서 배포를 해주면 됩니다.)

처음에 한번은 "Mono shared runtime" + "API 8 platform framework"이 함께 설치되기 때문에 실행 속도가 느리지만, 2번째부터는 그런대로 빠르게 배포됩니다.

아래는 예제 프로젝트가 실행된 화면을 보여줍니다. 단순히 그냥 버튼을 클릭하면 그 횟수만큼의 숫자가 증가하는 단순한 프로그램입니다. ^^

ios_in_vs_8.png

(참고로, 무료 버전의 한계로 인해 이렇게 배포된 프로그램은 24시간 후에는 동작을 안한다고 합니다. ^^;)

빌드된 /bin/Debug 폴더에 가보면 다음과 같은 파일들이 있습니다.

  • AndroidApplication1.AndroidApplication1.apk
  • AndroidApplication1.AndroidApplication1-Signed.apk
  • AndroidApplication1.dll
  • AndroidApplication1.dll.mdb
  • AndroidApplication1.pdb

apk 파일은 zip 파일인데요. 확장자를 zip으로 바꾸면 다음과 같은 구조의 폴더/파일들이 보입니다.

[META-INF]
    ANDROIDD.RSA
    ANDROIDD.SF
    MANIFEST.MF

[lib]
    [armeabi]
        libmonodroid.so
        libmono-profiler-log.so
    [armeabi-v7a]
        libmonodroid.so
        libmono-profiler-log.so
    [x86]
        libmonodroid.so
        libmono-profiler-log.so
[res]
    [drawable]
        Icon.png
        monoandroidsplash.png
    [layout]
        main.xml
        monoandroidsplash.xml




그래도, 우리의 목표는 실제 폰에 배포하는 것입니다. ^^

이를 위해서는 다음과 같은 과정을 거쳐야 한다고 Xamarin 문서에 나와 있습니다.

Part 1 - Preparing an Application for Release
; http://docs.xamarin.com/guides/android/deployment%2C_testing%2C_and_metrics/publishing_an_application/part_1_-_preparing_an_application_for_release

즉, 앞으로 4단계를 더 수행해야 합니다.

  1. Compile For Release
  2. Create a Private Key
  3. Sign the APK
  4. Zipalign the APK

1번(Compile For Release)부터 해볼까요? 우선 솔루션의 빌드 옵션을 "Release"로 바꿔주고, AssemblyInfo.cs 파일에 다음과 같은 특성을 포함시킵니다.

#if RELEASE 
[assembly: Application(Debuggable=false)] 
#else
[assembly: Application(Debuggable=true)]
#endif

이 옵션이 정상적으로 적용되려면 프로젝트 속성 창에서 "Builds" 탭의 "General" / "Conditional compilation symbols"에 "RELEASE" 상수를 입력해 두어야 합니다.

그다음 Icon을 설정하라고 하는데요. 일부 마켓 플레이스에서는 아이콘 설정이 안 되어 있으면 등록이 안 된다고 하지만, 여기서는 거기까지 해볼 수는 없으므로 그냥 생략하겠습니다.

이어서 버전 정보를 입력하라고 나오는데요. 프로젝트 속성 창에서 "Android Manifest" 탭으로 갑니다. 한 번도 manifest를 생성한 적이 없으면 "No AndroidManifest.xml found. Click to add one." 링크가 나오는데 이를 누르면 프로젝트의 "Properties" 폴더에 AndroidManifest.xml 파일이 추가되면서 편집할 수 있게 됩니다. 제 경우에는 다음과 같이 응용 프로그램 이름과 버전 정보를 넣어 주었습니다.

ios_in_vs_9.png

이렇게 하고 빌드하면 /bin/Release 폴더에는 DLL과 PDB 파일만 생성됩니다.

이어서 2번 단계(Create a Private Key)로 진행합니다. ^^

개인키를 생성하려면 JDK가 설치되어 있어야 합니다. 제 경우에는 "C:\Program Files\Java\jdk1.6.0_37\bin" 폴더에 설치되어 있고, 그 안에 포함된 keytool.exe를 이용하여 개인키를 생성했습니다.

다음은 제가 실행하고 옵션을 준 상황입니다.

D:\Settings>"C:\Program Files\Java\jdk1.6.0_37\bin\keytool.exe" -genkey -v -keystore my.keystore -alias AndPub -keyalg RSA -keysize 2048 -validity 10000
Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  Kevin Arnold
What is the name of your organizational unit?
  [Unknown]:  Dev
What is the name of your organization?
  [Unknown]:  Dev
What is the name of your City or Locality?
  [Unknown]:  LA
What is the name of your State or Province?
  [Unknown]:  Washington
What is the two-letter country code for this unit?
  [Unknown]:  US
Is CN=Kevin Arnold, OU=Dev, O=Dev, L=LA, ST=Washington, C=US correct?
  [no]:  y

Generating 2,048 bit RSA key pair and self-signed certificate (SHA1withRSA) with a validity of 10,000 days
        for: CN=Kevin Arnold, OU=Dev, O=Dev, L=LA, ST=Washington, C=US
Enter key password for 
        (RETURN if same as keystore password):  
Re-enter new password: 
[Storing my.keystore]

이제 3번 단계(Sign the APK)로 넘어갑니다.

1번 단계(Compile For Release)를 마치고 빌드하는 경우 /bin/Release 폴더에 DLL과 PDB 파일만 생성되었다고 했는데요. 3번 단계를 통해서 서명된 APK 파일을 생성할 수 있습니다.

Visual Studio의 "Tools" / "Publish Android Application..." 메뉴를 실행하면 다음과 같은 창이 나오는데, 여기에 방금 전 생성했던 keystore 파일을 지정해 주어야 합니다.

ios_in_vs_10.png

"Next" 버튼을 누르면 서명된 APK 파일이 생성될 폴더를 지정할 수 있는데요. 여기서는 그냥 기본값으로 두고 "Publish" 버튼을 누르거나 원하는 값으로 바꿔도 무방합니다. (기본값은 안드로이드 프로젝트 파일 - .csproj 파일과 같은 폴더에 생성됩니다.)

여기서 좋은 소식이 하나 있는데요. 이렇게 생성된 apk 파일은 4번 단계(Zipalign the APK)까지 자동으로 반영된다고 합니다. (따라서 4번 단계는 생각할 필요가 없습니다.)

애석하게도 여기서 불편한 점이 하나 있는데요. "Publish Android Application..." 메뉴를 실행할 때마다 keystore 관련 정보를 매번 입력해 줘야 합니다. (아마도 이 부분은 나중에 개선되지 않을까 생각됩니다.)

이렇게 해서 최종 생성된 APK 파일의 내용을 보면 다음과 같습니다.

[META-INF]
    ANDPUB.RSA
    ANDPUB.SF
    MANIFEST.MF

[assemblies]
    AndroidApplication1.dll
    Mono.Android.dll
    Mono.Security.dll
    mscorlib.dll
    System.Core.dll
    System.dll

[lib]
    [armeabi-v7a]
        libmonodroid.so
[res]
    [drawable]
        Icon.png
        monoandroidsplash.png
    [layout]
        main.xml
        monoandroidsplash.xml




APK 파일을 안드로이드 폰에 배포하는 것은 간단합니다. USB 케이블로 폰과 컴퓨터를 연결해서 외장형 USB 키에 파일을 복사하듯이 APK 파일을 복사해 주어야 하는데요. 단지, 기기마다 그 방법이 약간 다른 경우가 있는 것 같습니다.

제가 실습한 폰은 LG 껀데, "Optimus LTE TAG"라고 씌여 있군요. ^^ "설정"을 실행하고 다음의 옵션들을 변경해 줍니다.

"연결" 범주
    "기본연결 형식"- "대용량 저장장치" 항목을 선택

"애플리케이션" 범주
    "알 수 없는 소스" - 항목을 선택
    "개발" 범주로 들어가서.
        "USB 디버깅" - 항목을 선택 (이 옵션 설정은 나중에 사용될 일이 있습니다.)

이제, 폰과 컴퓨터를 USB 케이블로 연결하면 폰의 저장장치가 컴퓨터에 외장하드로 인식됩니다. 탐색기를 이용해, Visual Studio로 생성했던 APK 파일을 폰으로 복사하는데요. 제 경우에는 "별도로 "/myapp" 폴더를 만들고 그 안에 APK 파일을 복사했습니다.

복사가 끝났으면 케이블을 분리합니다.

그다음 "Play 스토어"에 접속해서 "ASTRO 파일 관리자"를 다운로드 받습니다.

[apk 설치 방법] 아주 쉬운 apk 파일 설치 방법
; http://blog.naver.com/xxxooo88/90105655901

실행시켜서 "내 파일1" 항목으로 들어가면 폰을 컴퓨터에 연결했을 때와 동일한 폴더 구조를 열람할 수 있습니다. "myapp" 폴더에 apk 파일을 복사했으므로 그 안에 들어가면 "FirstTest.AndroidApp-Aligned.apk" 파일을 볼 수 있고 이 아이콘을 누르면 폰에 설치됩니다. 아래는 이렇게 해서 실행된 C# 안드로이드 앱입니다. ^^

ios_in_vs_11.png

(돈만 있다면? ^^) 이제는 C#으로 못 만들 응용 프로그램이 (현실적으로) 없군요. ^^

첨부된 파일은 위의 기본 테스트 프로젝트입니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 6/28/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2013-02-21 11시46분
[짜두] 오우 이회사 무지하게 발전하고 있네요~
[guest]
2013-02-22 12시42분
그러게요. ^^ 노벨에서 나올 때만 해도 위태롭더만... 이젠 확고한 위치를 잡은 것 같습니다. (이러다, 마이크로소프트에 합병되는 것이 아닌가... 하는 생각이 들 정도입니다.) 참고로, Xamarin Business Edition은 2월 마지막까지 Microsoft MVP들에게 무료라고 합니다.

http://blog.xamarin.com/for-our-friends-at-the-microsoft-mvp-summit/

For a limited time, we are offering every Microsoft MVP a free copy of Xamarin Business edition for both iOS and Android (which you may know from Twitter as MonoTouch and MonoDroid). This is a value of $1,800 dollars for free, just for being pillars of the developer community.
정성태
2013-02-25 11시55분
[wafe] 와... 근데 가격 무지 비싸네요. 회사에서 혼자 개발한다고 쳐도 Android 100만원에 iOS 100만원이라니 후덜덜...
[guest]
2013-02-25 01시19분
가격 변동에 대해서는, 향후 지켜보는 맛이 있지 않을까 생각됩니다. ^^
정성태

... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12662정성태6/8/202115403.NET Framework: 1064. C# COM 개체를 PIA(Primary Interop Assembly)로써 "Embed Interop Types" 참조하는 방법파일 다운로드1
12661정성태6/4/202127412.NET Framework: 1063. C# - MQTT를 이용한 클라이언트/서버(Broker) 통신 예제 [4]파일 다운로드1
12660정성태6/3/202118131.NET Framework: 1062. Windows Forms - 폼 내에서 발생하는 마우스 이벤트를 자식 컨트롤 영역에 상관없이 수신하는 방법 [1]파일 다운로드1
12659정성태6/2/202119028Linux: 40. 우분투 설치 후 MBR 디스크 드라이브 여유 공간이 인식되지 않은 경우 - Logical Volume Management
12658정성태6/2/202116812Windows: 194. Microsoft Store에 있는 구글의 공식 Youtube App
12657정성태6/2/202117614Windows: 193. 윈도우 패키지 관리자 - winget 설치
12656정성태6/1/202115932.NET Framework: 1061. 서버 유형의 COM+에 적용할 수 없는 Server GC
12655정성태6/1/202114581오류 유형: 722. windbg/sos - savemodule - Fail to read memory
12654정성태5/31/202115243오류 유형: 721. Hyper-V - Saved 상태의 VM을 시작 시 오류 발생
12653정성태5/31/202118505.NET Framework: 1060. 닷넷 GC에 새롭게 구현되는 DPAD(Dynamic Promotion And Demotion for GC)
12652정성태5/31/202115949VS.NET IDE: 164. Visual Studio - Web Deploy로 Publish 시 암호창이 매번 뜨는 문제
12651정성태5/31/202116147오류 유형: 720. PostgreSQL - ERROR: 22P02: malformed array literal: "..."
12650정성태5/17/202115469기타: 82. OpenTabletDriver의 버튼에 더블 클릭을 매핑 및 게임에서의 지원 방법
12649정성태5/16/202117680.NET Framework: 1059. 세대 별 GC(Garbage Collection) 방식에서 Card table의 사용 의미 [1]
12648정성태5/16/202116435사물인터넷: 66. PC -> FTDI -> NodeMCU v1 ESP8266 기기를 UART 핀을 연결해 직렬 통신하는 방법파일 다운로드1
12647정성태5/15/202116715.NET Framework: 1058. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용파일 다운로드1
12646정성태5/15/202115508사물인터넷: 65. C# - Arduino IDE의 Serial Monitor 기능 구현파일 다운로드1
12645정성태5/14/202115567사물인터넷: 64. NodeMCU v1 ESP8266 - LittleFS를 이용한 와이파이 접속 정보 업데이트파일 다운로드1
12644정성태5/14/202116830오류 유형: 719. 윈도우 - 제어판의 "프로그램 및 기능" / "Windows 기능 켜기/끄기" 오류 0x800736B3
12643정성태5/14/202116776오류 유형: 718. 서버 유형의 COM+ 사용 시 0x80080005(Server execution failed) 오류 발생
12642정성태5/14/202118495오류 유형: 717. The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
12641정성태5/13/202117309디버깅 기술: 179. 윈도우용 .NET Core 3 이상에서 Windbg의 sos 사용법
12640정성태5/13/202120900오류 유형: 716. RDP 연결 - Because of a protocol error (code: 0x112f), the remote session will be disconnected. [1]
12639정성태5/12/202117306오류 유형: 715. Arduino: Open Serial Monitor - The module '...\detection.node' was compiled against a different Node.js version using NODE_MODULE_VERSION
12638정성태5/12/202117549사물인터넷: 63. NodeMCU v1 ESP8266 - 펌웨어 내 파일 시스템(SPIFFS, LittleFS) 및 EEPROM 활용
12637정성태5/10/202117768사물인터넷: 62. NodeMCU v1 ESP8266 보드의 A0 핀에 다중 아날로그 센서 연결 [1]
... 46  47  48  49  50  [51]  52  53  54  55  56  57  58  59  60  ...