2013-06-19 51 views
25

Tôi cố gắng hiểu cách Xamarin.iOS (MonoTouch) và Xamarin.Android (Mono cho Android) hoạt động như thế nào. Tôi đã viết một Ứng dụng nhỏ và nhìn vào tệp .app và .apk.Xamarin iOS và Android hoạt động như thế nào?

Bên trong tệp .app (iOS) là nhiều tệp .dll. Nhưng tại sao? Trên mỗi trang và bài tôi đọc họ nói: Ứng dụng được thực thi tự nhiên và không có gì được diễn giải. Ai đó có thể giải thích cho tôi ý nghĩa của nhà phát triển xamarin với "người bản địa"?

Bên trong của file .apk không phải là một tập tin .dll đơn ..

+0

dll trong gói iOS chỉ đơn giản là siêu dữ liệu được sử dụng để phản chiếu chứ không phải mã thực thi. Xem http://stackoverflow.com/questions/10741319/how-secure-is-monotouch – Jason

Trả lời

1

Trình biên dịch Xamarin bó thời gian chạy .NET và kết quả đầu ra một người gốc (nhị phân) ARM thực thi, đóng gói như là một ứng dụng iOS hoặc Android.

+0

để sử dụng android jit – ArthNRick

9

Các Xamarin định nghĩa về "nguồn gốc" bao gồm nhưng không giới hạn:

  • Mỗi dòng mã C# được biên dịch sang mã máy và sau đó đóng gói trong .app. Không có JIT khi chạy, vì nó bị chặn bởi AOT. Xem thêm thông tin có thể được tìm thấy tại

http://www.mono-project.com/AOT

(Lưu ý rằng Xamarin.Android vẫn sử dụng JIT, http://xamarin.com/how-it-works)

  • Tiếp cận nền tảng các loại bản địa/API là hoàn toàn mở, vì vậy bạn không giới hạn ở một nhóm nhỏ các cuộc gọi API (nếu bạn sử dụng HTML5/JavaScript, bạn biết loại giới hạn nào có).

  • Giao diện người dùng bạn thiết kế bị ràng buộc với API gốc được hiển thị bởi iOS (CocoaTouch) hoặc Android (Skia). Không có lớp trung gian nào làm tổn thương hiệu suất hoặc giao diện.

Như những gì bên trong .ipa hoặc .apk, ai quan tâm? Tất nhiên @ bình luận của Jason cho chúng ta thấy một số chi tiết thực hiện nội bộ.

2

Trước hết, Xamarin hoạt động trên hai runtimes khác nhau tại cùng một thời gian:

  • Mono
  • Native runtime (Davlik, ART, iOS runtime)

Một số ví dụ. Khi bạn tạo lớp C# của riêng bạn trong Visual Studio, cá thể của lớp này sẽ chạy dưới Mono. Ngoài ra khi bạn đang tải Newton.Json gói từ nuget, điều này sẽ chạy trong Mono quá. Đây là lý do tại sao chúng tôi có thể sử dụng tất cả các công cụ tuyệt vời. Tuy nhiên, khi bạn kế thừa từ Java.Lang.Object (Android) hoặc NSObject (iOS) hoặc thực hiện một tùy chỉnh, các cá thể của các lớp này sẽ chạy dưới thời gian chạy nguyên gốc.

Thứ hai, bạn có thể nhận thấy rằng chúng ta cần ràng buộc hai thế giới này bằng cách nào đó. Chúng ta hãy xem chúng ta có loại đối tượng nào.

  • đối tượng được quản lý (Mono)
  • đối tượng Unmaneged (thế giới Native)
  • đối tượng Peer (Mono, các đối tượng đó là giấy gói cho các đối tượng có nguồn gốc)

Peer đối tượng đó là trường hợp của lớp SDK Xamarin (ví dụ các hoạt động, xem các điều khiển, UILabels, TextViews và vv), các trường hợp kế thừa của riêng bạn từ các lớp Java.Lang.Object, NSObject, Fragment hoặc thậm chí là UISegment.

Cơ chế đó là một trong những điều quan trọng nhất từ ​​Xamarin.

PS: Thực ra, việc chúng tôi sử dụng các dự án Xamarin JIT hoặc AOT là không quan trọng. Nó phụ thuộc vào nền tảng và cho phép/không cho phép một số tính năng từ thế giới .NET. Điều đó không mô tả cách thức hoạt động của Xamarin.

Các vấn đề liên quan