티스토리 뷰

반응형

2017년 9월 28일 Xamarin.Forms 2.4.0 Stable이 출시되었습니다. 자세한 사항은 https://developer.xamarin.com/releases/xamarin-forms/xamarin-forms-2.4/2.4.0-stable/에서 확인하실 수 있습니다.

Xamarin.Forms 2.4.0 주요 변경사항

Xamarin.Forms Public Roadmap에서 소개했던 기능들과, 추가적으로 150개에 달하는 버그를 수정하였습니다.

  • .NET Standard 2.0 지원
  • 새로운 Flags API
  • Android Fast Renderers: Button, Image, Label
  • macOS Preview
  • 알려진 이슈
  • 기타 확인사항

.NET Standard 2.0 지원

Xamarin.Forms가 .NET Standard 2.0을 지원하기 시작했습니다. 이전의 Xamarin.Forms 표준인 PCL Profile과도 문제없이 동작하도록 하는데 심혈을 기울였다고 합니다. Xamarin.Forms를 .NET Standard로 시작하기 위해서는 .NET Standard Class Library를 생성한 후, Nuget을 통해서 Xamarin.Forms 2.4.0을 설치하시면 됩니다.

업데이트 후 문제가 발생하지 않도록 반드시 릴리즈 노트를 확인하시기 바랍니다.

새로운 Flags API

Flag API는 이번에 새롭게 소개되는 기능으로서, Xamarin.Forms가 시작되기 전에 Flag를 선언하여 원하는 기능을 활성화하는 기술입니다. 

public partial class Activity : FormsAppCompatActivity
{
  protected override void OnCreate(Bundle bundle)
  {
     ...
     //FastRenderer 활성화 하기 (사용하길 원하지 않으면 아래 코드 삭제)
     Forms.SetFlags("FastRenderers_Experimental");
     Forms.Init(this, bundle);
     ...
  }
}

Flags API를 통해서 사용하길 원하지 않는 기능을 배제할 수 있습니다. 예를들어 Xamarin.Forms 2.4.0부터 새롭게 도입된 Fast Renderer는 하위호환성에 문제를 일으킬 수 있는 기능입니다. 따라서 Xamarin.Forms 2.4.0로 업데이트 한 후 Fast Renderer를 사용하지 않으려면 위의 코드에서 Forms.SetFlags("FastRenderers_Experimental"); 부분을 주석처리 하시면 됩니다.

Android Fast Renderers

Fast Renderer는 Android에서 Renderer 구조를 개선하여 메모리 사용량과 성능을 개선한 기술입니다. Fast Renderer는 컨트롤의 구조를 단순화함으로서 렌더링 비용을 줄이는데 목적을 두고 있습니다.

기존의 Xamarin.Forms 컨트롤은 Renderer API를 제공하기 위해 추가적인 Wrapper를 제공하는 구조로 이루어져 있습니다. 이러한 구조는 화면에 포함된 컨트롤이 많을 수록, 혹은 ListView와 같이 수천개의 항목을 보여주는 컨트롤이 포함될 수록 성능저하 현상을 보여왔습니다. 예를들어 ListView를 스크롤할 때 끊김이 발생하거나 앱이 (재)시작할 때 프리징 현상이 발생하곤 합니다.

Fast Renderer는 이러한 Wrapper들을 제거함으로써 최대 2배이상 개선된 성능을 보여줍니다. 특히 ListView가 수천개 이상의 항목을 스크롤링할 때 보다 부드럽고 개선된 성능을 보여줍니다.

아래는 기존의 페이지의 UI 구조입니다.

그리고 아래는 Fast Renderer를 사용했을 때 UI 구조입니다. 위의 구조와 비교하면 UI Element의 숫자가 19개에서 13개로 줄어들었습니다.

Xamarin.Forms 2.4.0 버전에서는 Fast Renderer는 Android Button, Image, Label만 지원합니다. 추후 지속적인 버전업을 통해 iOS와 다른 컨트롤에도 이러한 기능을 지원할 예정입니다.

하지만 Fast Renderer는 기존의 Custom Renderer 컨트롤과 호환되지 않습니다. Button, Image, Label에 대해 Custom Renderer를 사용한 경우 오류가 발생할 수 있습니다. 이러한 호환성 문제를 제거하기 위해 기본적으로 Fast Renderer는 꺼져있습니다. 위에서 소개한 Flags API를 통해서 기능을 활성화할 수 있습니다. Fast Renderer는 앞으로 추가적인 작업과 최종 마무리 작업을 거친 후 기본적으로 사용되도록 변경할 예정입니다.

macOS Preview

Xamarin.Forms macOS에 대한 포스팅에서 언급했던 것처럼 Xamarin.Forms의 macOS 지원이 Preview Release 상태로 이용하실 수 있습니다. 이전에 Pre-release 단계에서의 버그들이 수정되었습니다. Xamarin.Forms를 통해 iOS, Android, Windows, Tizen 뿐만 아니라 macOS 프로그램도 개발할 수 있습니다.

알려진 이슈

  • FastRenderer_Experimental Flag를 사용하는 경우 Buttons 컨트롤이 다른 컨트롤에 의해 가려져 있어도 버튼이 클릭됩니다.
  • .NET Standard는 Visual Studio for Mac에서 지원하지 않습니다.

기타 확인사항

Xamarin.Forms 2.4.0으로 업데이트 하시기 전 다음을 확인해주세요.

  • 확인사항: Xamarin.Forms에서 .NET Standard를 이용하실 수 있지만, 일부 기능이 동작하지 않을 수 있습니다.
  • 변경사항: WinRT에서 Device.RuntimePlatform은 WinRT를 반환합니다. Uinversial WIndows Platform에서는 UWP를 반환합니다. Device.Windows는 삭제되었습니다.
  • 변경사항: 새롭게 도입된 AutomationProperties를 사용하면 Android의 UI Test 실행에 영향을 미칠 수 있습니다. AutomationId, Name, HelpText는 Native ContentDescription 속성을 설정합니다. 설정하는 값은 AutomationId 보다 Name, HelpText를 우선합니다. (Name, HelpText가 연결된 값으로 지정됩니다.) 즉 AutomationId, HelpText, Name을 모두 사용하는 상태에서 AutomationId를 기준으로 검색했다면 검색이 실패할 것입니다. 따라서 UI Test 코드를 수정해야 할 수 있습니다.
  • 지원종료: Android IVisualElementRenderer.ViewGroup은 이제 Obsolete 처리되었습니다. 대신 View를 사용해주세요.
  • 지원종료: Android에서 EntryRenderer, EditorRenderer에 대한 CustomRenderer를 사용할 때, Control을 EntryEditText 혹은 EditorEditText로 Casting하면 Obsolete 경고를 받게 됩니다. 대신 FormsEditText를 사용해주세요.
  • 주의사항: Android에서 EntryRenderer, EditorRenderer에 대한 CustomRenderer를 사용할 때, OnBackKeyboardPressed 이벤트를 사용했다면 컴파일 에러가 발생합니다. 이 경우 OnKeyboarBackPressed 이벤트로 변경해주세요.
  • 주의사항: ListViewCachingStrategy는 Flag Enum으로 변경되었습니다.
  • 주의사항: ListViewCachingStrategy.RecycleElement를 사용할 때 전제조건이 추가되었습니다. 각 DataTemplate는 반드시 동일한 ViewCell 유형을 반환해야 합니다. 예를들어 ListView에서 DataTemplateSelector를 사용하는 경우를 생각해봅시다. DataTemplateSelector가 MyDataTemplateA 혹은 MyDataTemplateB를 반환하고 MyDataTemplateA, MyDataTemplateB는 각각 MyViewCellA, MyViewCellB를 반환했다면, ListView를 그리는 도중에 갑자기 MyDataTemplateA가 MyViewCellA가 아닌 다른 유형을 반환하거나 MyDataTemplateB가 MyViewCellB가 아닌 다른 유형을 반환하면 Exception이 발생합니다.

References


댓글