You’ve probably heard a lot of time that Xamarin tools generate native applications for iOS and Android, but how does this really work? What is the difference between developing with ObjectiveC/Swift and Java? What are the problems that could arise by using the Xamarin approach? Come and see as we take a look under the hood of the Xamarin frameworks.
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Xamarin Under The Hood - Dan Ardelean
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. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals
Many thanks to our sponsors & partners!
GOLD
SILVER
PARTNERS
PLATINUM
POWERED BY
4. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals
XAMARIN
C#/F#
Visual Studio
Xamarin Studio
Black Magic
Native
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. @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. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals
DEMO XAMARIN IOS
Single View Application
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. @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
varb=newUIButton(...) [[UIButtonalloc]init]
…
or
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
Monito
r
Xamarin
Profiler
VS
Profiler
17. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals
DEMO MEMORY ALLOCATION
Single View Application
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
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. @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. @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
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. @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
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
?
Yes Replace JNI
handle with
Weak Handle
Yes
Force Android GC
JNI
handle
collected
?
Collect object
No
Yes
Replace JNI
weak handle
with strong
handle reference
NoPeer
object
kept alive
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. @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. @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<Tweet>
ArrayAdapter
ArrayLis
tTweet Tweet Tweet Tweet
Tweet Tweet Tweet Tweet
ListView
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 Tweet
ListView
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. @ITCAMPRO #ITCAMP17Community Conference for IT Professionals @ITCAMPRO #ITCAMP17Community Conference for IT Professionals
Xamarin
Process
Memory
UIView
UIImage
MKMapView
...
Activity
Intent
TextView
...
Managed
Memory
C# and .NET
objects are
allocated here
- this is all GC
knows about