Xamarin - Under the bridge

  • Published on
    22-Jan-2018

  • View
    226

  • Download
    0

Transcript

  1. 1. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin - Under the Bridge Microsoft&Xamarin MVP, Xamarin Certified Mobile Developer CTO Mahiz S.r.l. dan.ardelean@mahiz.it Twitter: @danardelean Dan Ardelean
  2. 2. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Many thanks to our sponsors & partners! GOLD SILVER PARTNERS PLATINUM POWERED BY
  3. 3. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals XAMARIN
  4. 4. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals XAMARIN C#/F# Visual Studio Xamarin Studio Black Magic Native
  5. 5. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals iOS Native Applications
  6. 6. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals iOS Native Application
  7. 7. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals DEMO XCODE SINGLE VIEW APPLICATION
  8. 8. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals C# to Objective-C world
  9. 9. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin iOS Compilation
  10. 10. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Expose Objectve-C to C# using Selectors objc_msgSend functions Selectors -[NSString sizeWithFont:forWidth:lineBreakMode:] sizeWithFont Selector: - (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode Objective-C declaration: CGSize objc_msgSend(IntPtr target, IntPtr selector, IntPtr font, nfloat width, UILineBreakMode mode); objc_msgSend [DllImport (Constants.ObjectiveCLibrary,EntryPoint="objc_msgSend")] static extern CGSize cgsize_objc_msgSend_IntPtr_float_int ( IntPtr target, IntPtr selector, IntPtr font, nfloat width, UILineBreakMode mode);
  11. 11. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Expose Objectve-C to C# using Selectors objc_msgSend functions Selectors NSString target = ... Selector selector = new Selector ("sizeWithFont:forWidth:lineBreakMode:"); UIFont font = ... nfloat width = ... UILineBreakMode mode = ... CGSize size = cgsize_objc_msgSend_IntPtr_float_int( target.Handle, selector.Handle, font == null ? IntPtr.Zero : font.Handle, width, mode);
  12. 12. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Expose Managed Code to Objective-C Registrars [Register] class MyViewController : UIViewController{ [Export ("myFunc")] public void MyFunc () { } } C# (Managed Code) Objective-C @interface MyViewController : UIViewController { } -(void)myFunc; @end @implementation MyViewController {} -(void) myFunc { /* code to call the managed MyViewController.MyFunc method */ } @end
  13. 13. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals DEMO XAMARIN IOS Single View Application
  14. 14. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin.iOS creates a managed wrapper, called a peer object, for every native object accessed by the Xamarin.iOS runtime Peer wrapper objects UIKit.UIButton (peer object) [UIButton] (native object)IntPtrHandle Allocated by Xamarin.iOS and collected by the GC Allocated by the iOS runtime and reference counted
  15. 15. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Peer object increment the retain count; it is released when the managed peer is disposed or finalized Memory allocation Xamarin.iOS 1 GC Collect [brelease] 0 b =null; b.Dispose(); [brelease] 0 var b = new UIButton(...) [[UIButton alloc]init] or
  16. 16. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Monitoring memory allocations Memory Analysis (Heap shot) Instrument s Androi d Device Monitor Xamarin Profiler VS Profiler
  17. 17. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals DEMO MEMORY ALLOCATION Single View Application
  18. 18. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Prefer full delegate methods over lambdas it makes it easier to see and understand strong references Call Dispose() to release native resources immediately (vs. waiting ona GC) when you are finished with a peer wrapper Always unsubscribe from events you manually wire up; alternatively, use the Storyboard to connect events which can then be cleaned up automatically Xamarin.iOS Tips
  19. 19. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Android native application
  20. 20. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Android Native Compilation .dexfilesJava compile r Android dex compiler Java bytecodes Dalvik bytecodes
  21. 21. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Android Native Compilation .dexfiles Resources (e.g. images) .apkfileAndroid apkbuilde r The .apkfile contains all the app's assets and is ready to run
  22. 22. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Android Native Execution Bytecodes are compiled to native code at installation (called Ahead-of-Time or AOT) MyApp.apk Android Runtime (ART) Apps run in their own process with their own copy of the ART Virtual Machine
  23. 23. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals DEMO ANDROID STUDIO
  24. 24. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin.Android Architecture
  25. 25. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin.Android Compilation assemblyC# compiler IL and metadata Linke r Monoassemblies yourassemblies Monoassemblies (filtered) Determines which class members are used in your app and includes only those members in the output yourassemblies (filtered)
  26. 26. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin.Android Compilation Mono Runtime The Xamarin build tools add the Mono VM to your application package .apkfileAndroid apkbuilde r
  27. 27. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals DEMO XAMARIN.ANDROID
  28. 28. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin.Android GC Process GC Collect Can collect object? Is Peer Object ? Ye s Replace JNI handle with Weak Handle Ye s Force Android GC JNI handle collected ? Collect object No Ye s Replace JNI weak handle with strong handle reference NoPeer object kept alive
  29. 29. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Integration between Xamarin GC and JVM GC is performed through a native extension called the GC Bridge GC Bridge Xamarin Manage d Memory Android Manage d Memory GC Bridge Process Memor y
  30. 30. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals GC_ messages provide details about bridge and collection times Monitoring GC Performance GC_MAJOR:(Minor allowance) pause 29.11ms, total 29.35ms, bridge 0.15msmajor 4048K/0K los 2766K/0K Lower pause, bridge and total times are preferred
  31. 31. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals C# objects must be boxed to create a JVM representation of the object; intrinsic types (strings, numeric values and dates) are all special cased Xamarin and the JAVA VM C# Object Java Object ArrayAdapter ArrayAdapter ArrayLi stTweet Tweet Tweet Tweet Tweet Tweet Tweet Tweet ListView
  32. 32. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Instead, do as much as possible in either C# or Java, interop is expensive Stay in your yard C# Object Java Object TweetAdapter List Tweet Tweet Tweet Tweet ListView
  33. 33. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Should call Dispose() to release the native resources immediately (vs waiting on a GC) when you are finished with a peer wrapper Avoid placing a large numbers of references in peer objects, remember GC is more expensive for these special types Avoid passing pure C# custom types into Java APIs if possible Xamarin.Android Tips
  34. 34. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Xamarin Process Memory UIView UIImage MKMapVie w ... Activity Intent TextView ... Managed Memory C# and .NET objects are allocated here - this is all GC knows about
  35. 35. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals Q & A