Xamarin for (not only) Android developers

Preview:

Citation preview

Xamarinfor not only Android developers

Aleksander Piotrowski@pelotasplus

What platform needsto be a rockstar platform

IDE

Visionary

Documentation

Jake Wharton

Testing tools/services

Emulator

Third-party components Library

Events

Blogs/podcasts

Programing Language

Historya rising star

2000 Microsoft announces .NET Framework

2001 Mono project launched by Ximian

2003 Ximian bought by Novell

2004 Mono first release

2009 MonoTouch 1.0

2011 MonoAndroid first release

2011 Novell acquired by Attachmate0000 Xamarin is founded

2012 Xamarin.Mac

2013 Xamarin Studio

.NET is 15 years old

mono is 11 years old

Xamarin.iOS is 7 years old

Xamarin.Android is 4 years old

modern Xamarin is 2 years old

Miguel de Icaza

● never received a degree● free software developer since 1992● Midnight Commander● early Wine contributor● worked on Linux Sun SPARC● later on Linux for SGI Indy● almost did Internet Explorer port to SPARC● started GNOME project and created

Gnumeric● started Mono project to implement .NET on

Linux

source: wikipedia

sou

rce:

wik

iped

ia

Pricingnot free for personal use

command linesupport

good IDE

x2 if targeting both iOS and

Android

Write once run everywhere*

* that to run your app on every device make sure it contains nothing else but white background without

any other UI elements

Supported platforms

● target:

○ Android, iOS, Mac

○ Windows Phone by sharing C# code between projects

● development:

○ Mac: for all platforms excluding Windows

○ Windows: for all platforms by using remote Mac

○ Linux: -

What is

● single language for all platforms - C#

● single base library - .NET Base Class Library

plus specific libraries for target platforms

MonoTouch or Mono.Android

● single runtime for all targeted platforms

iOS, Android, Windows Phone

● “performant enough even for demanding games”

What is not

● write once and run anywhere

● use one one platform (Mac or Windows)

to target them all (iOS, Android, Windows)

● one UI for all target platforms

Native vs non-native

iOS

● native code at the end

● AOT compiler converts Xamarin app to native ARM code

Android

● no final native code

● Xamarin compiler creates IL (Intermediate Language) which is executed at

runtime on the device

Fat binary vs slim debug build● Hello world + Base Class Library: 15.8MB

● Hello world + BCL after Linking: 2.9MB

● Hello world debug release: 6KB + Mono Shared components: 10MB

source: used to be here http://developer.xamarin.com/guides/android/advanced_topics/linking/

IDEone to rule them all

IDE

● have to switch manually between iOS and Android

in multiplatform projects

● ultra annoying “app is running, are you sure you want to stop it and install

new version?”

● cannot even compare to IntelliJ aka IDEA

● Visual Studio to the rescue

● horror when overriding methods CMD-I

Let’s codeand have fun hopefully

Let’s code in C# and F#

var i = 10; // implicitly typed

int i = 10; // explicitly typed

#define preprocessor

directive

ulong, ushortunsigned types

async/await for asynchronous programming

mandatory break in switch

Lambda expression

Generics with runtime type

supportnamespaces

properties

F#

F#

Let’s code in Java or Objective-C

● using Java Native Interface (JNI), or

● using bindings for Java code

● with Objective-C creating binding

● straightforward process, for the second time

Project^wSolution structure

Solution structure

● References - base .Net classes

● Components

● Packages

● Assets

● Properties

● Resources

● our code

● and even maybe tests...

Code sharing

Layers

● Data Layer SQLite

● Data Access Layer create, read, update, delete

● Business Logic data model and business logic

● Service Access Layer access REST, parsing JSON

● Application Layer platform specific code but not UI-related

● User Interface Layer UI-related code

shared

not shared

shared

shared

shared

not shared

source: https://xamarin.com/forms

Code Sharing

● Shared Project

● Portable Class Library

Shared Project

● no .dll as an output

● “compiled into” referencing project

● not compiled, if not used

● platform specific code via #if statements

○ #if __MOBILE__

○ #if __ANDROID__

● “for personal use only”

source: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/shared_projects/

Portable Class Library

● using a subset of BCL called Profile

● targets many different (supported) platforms

● no platform-specific libraries allowed

● refactoring of PCL affects all referencing projects

● good for sharing with others

source: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/

source: http://developer.xamarin.com/guides/cross-platform/application_fundamentals/building_cross_platform_applications/sharing_code_options/

UI design

Xamarin Forms

source: https://xamarin.com/forms

source: video @ https://xamarin.com/forms

Forms

● single app screen called a Page

● Page contains layouts (StackLayout, GridLayout) and

UI elements (Button, Image, SearchBar, WebView)

● connect actions (click event, long press event) to code

which is shared across all platforms

● at the end at run-time all UI elements are mapped to native platform-

specific UI components

Forms

● can be written in pure code

○ sounds a bit like old school iOS style

● or in XAML layout files

○ sounds more like Android style

○ not supporting existing XAML editor :-/

○ layouts have supporting class, so called CodeBehind class

● using MVVM pattern

sou

rce:

htt

ps:/

/xam

arin

.com

/for

ms

sou

rce:

htt

ps:/

/xam

arin

.com

/for

ms

source: https://xamarin.com/forms

source: https://xamarin.com/forms

Pros

● data entry apps● prototypes & proof-of-

concept apps● little platform-specific

APIs● code sharing over

custom UI

Cons

● specialized interaction required

● highly polished design● many platform-

specific APIs● custom UI above code

sharing

Emulatoror is it simulator

Xamarin Player

● simulate, debug, demo or run Android apps in our fast and hassle-free

environment.

only Android apps

● integrated with Xamarin Studio and Visual Studio

● native UI on Windows and Mac

● widgets for location and battery

● easy screenshot taking

Xamarin Player

● x86 virtual machine with HW acceleration

● VT-x AMD-V

● OpenGL 2.0

● uses VirtualBox 5.0.4

Xamarin Player

● can install non-Xamarin native Android APKs?

YES

● supports Google Play Services?

YES via installing third-party provided ZIP file

● hmm, sounds like a Genymotion clone?

YES indeed

Xamarin Player

● free

● less widgets

● better drag & drop

● fixed aspect window scaling

● couple of device configurations

● paid

● more widgets

● drag & drop

● window scaling

● lots of device configurations

Documentationfor C#, Android, iOS, and ...

Documentation

● for all targeted platforms

Xamarin.Android, Xamarin.iOS, Xamarin.Forms, Xamarin.Mac and Windows

● Android developer could learn iOS app architecture

● explains not only C# or Xamarin-related aspects but also basics of the

platforms

● always with “download as PDF”

Documentation

● iOS app fundamentals

http://developer.xamarin.com/guides/ios/application_fundamentals/

Protocols, Events, and Delegates

● iOS user interface

http://developer.xamarin.com/guides/ios/user_interface/

UIKit, Tables and cells, Storyboards

● platform features

http://developer.xamarin.com/guides/ios/platform_features/

Newsstand, HealthKit, and iOS 9 introduction

Documentation

● Android app fundamentals

http://developer.xamarin.com/guides/android/application_fundamentals/

API levels, Activity lifecycle, Handling rotation

● Android user interface

http://developer.xamarin.com/guides/android/user_interface/

Actionbar, Splash screen, List view & adapters, RecyclerView

● platform features

http://developer.xamarin.com/guides/android/platform_features/

Fragments, ContentProvider, new Android versions

Third-party librariesmaven, pip, apt, cocoapods, npm, we want more!

Third-party libraries

● components via Xamarin Components Store

● packages via NuGet package manager

● libraries & UI components

● easily to be added to a project

Components

● HockeyApp

● Crittercism

● SQLCipher 499$

● Facebook SDK by Xamarin Inc.

● Parse SDK by Parse Inc.

● Tip of the Day

Packages

● for Android, iOS, or both

● native C#

● via NuGet packages by .NET Foundation

● 44,015 packages

Packages

● Android Support Library, Design Library,

RecyclerView by Xamarin

● Android Picasso by jacksierkstra

● iOS SVProgressHUD (wrapper)

● iOS FloatLabelEntry (native)

● Parse.com in 6 versions

Packages

● get data from RESTful API and store it

in data model

● refit by paulcbetts

● one C# code for Android, iOS and .NET

RESTful API

datamodel

network servicein our app

AFNetworking Retrofit

Retrofitmanuallyas a dict

Packages

● get data from network

● iOS AFNetworking

● Android OkHttp latest is 2.5.0

● Xamarin ModernHttpClient

on iOS NSURLSession

on Android OkHttp 2.4.0

Testingin case you have time for that

Testing

● Xamarin Test Cloud

● Calabash

Xamarin Test Cloud

● 1,800 devices and adding 100 monthly

● stars at 1,000 USD/month paid annually … for 2 apps

● 5,000 USD for 5 apps

● NUnit or Calabash tests

● screenshots, device performance for every step of every test

source: https://xamarin.com/test-cloud

source: https://xamarin.com/test-cloud

Calabash

● automated UI tests

● using Behavior Driven Development approach

● written in Ruby, or Cucumber, or Gherkin

source: http://developer.xamarin.com/guides/testcloud/introduction-to-test-cloud/

Scenario: Credit card number too short

Given I am on the Credit Card Validation Screen

When I enter a credit card number that's 16 digits long

And I click on the Validate button

Then I should see a validation error

source: http://developer.xamarin.com/guides/testcloud/calabash/introduction-to-calabash/

Communityand expensive conference

Community

● blogs

● developer advocates and their apps

James Montemagno https://github.com/jamesmontemagno

● podcast - Xamarin Podcast

http://pca.st/9cXF

● their own WWDC, also quite pricey 1,499$

Xamarin Evolve

● Paul C. Betts and his libraries https://github.com/paulcbetts/

IDE

Visionary

Documentation

Jake Wharton

Testing tools/services

Emulator

Third-party components Library

Events

Blogs/podcasts

Programing Language

IDE

Visionary

Documentation

Jake Wharton

Testing tools/services

Emulator

Blogs/podcasts

Third-party components Library

Events

Paul C Betts

Xamarin Studio

Xamarin Podcast

Miguel de Icaza

Awesome docs

Evolve

Xamarin Android Player

Components & packages

Test Cloud & Calabash

Programing LanguageC#, F#, support native