2013-07-02 40 views
10

Các Xamarin documentation là một chút không rõ ràng về điều này. Nếu tôi xây dựng ứng dụng của mình chỉ với armeabi được chọn trong tùy chọn xây dựng, ứng dụng của tôi sẽ là:Một ứng dụng được xây dựng chỉ với armeabi chạy trên thiết bị armeabi-v7a?

  1. Có sẵn cho các thiết bị v7a trong Cửa hàng Play?
  2. Chạy trên thiết bị v7a?

Nếu nó chạy, có bất kỳ tính năng nào như sử dụng các chuỗi dẫn đến hành vi hoặc sự cố không mong muốn không?

Tôi có một ứng dụng đơn giản và đang cố gắng giữ cho nó nhỏ. Ngoài ra, tôi không có thiết bị v7a để thực hiện thử nghiệm nhanh.

Làm rõ:

Trong khi có vẻ là sự chấp nhận rõ ràng rằng đó là "an toàn, nhưng không quá performant" để biên dịch một ứng dụng Android chỉ với những thư viện amreabi (xem bài này tuyệt vời: Why use armeabi-v7a code over armeabi code?), các Xamarin docs on CPU architecture, mà tôi giả định áp dụng đối với họ biên soạn .so thư viện, nói:

điều quan trọng là hãy nhớ rằng thời gian chạy armeabi sử dụng bởi Xamarin.Android là chủ đề an toàn. Nếu một ứng dụng có hỗ trợ vũ khí được triển khai cho thiết bị armeabi-v7a, nhiều trường hợp lạ và ngoại lệ không thể giải thích sẽ xảy ra.

Tôi đã có thể thử nghiệm ứng dụng của mình vừa được biên dịch với armeabi trên thiết bị v7a và chưa chạy vào bất kỳ "ngoại lệ lạ và không thể giải thích" nào YET.

Cập nhật:

Hình như các tài liệu Xamarin từ đó đã được cập nhật và bây giờ (2014/07/14) lần đọc:

điều quan trọng là hãy nhớ rằng thời gian chạy armeabi sử dụng bởi Xamarin.Android là không phải là chủ đề an toàn. Nếu một ứng dụng có hỗ trợ armeabi được triển khai cho thiết bị armeabi-v7a, nhiều trường hợp ngoại lệ lạ và không thể giải thích được sẽ xảy ra.

+5

Trừ khi Xamarin vặn thứ gì đó lên, mã 'armeabi' sẽ chạy tốt trên các thiết bị ARM v7a. Nó chắc chắn làm cho phát triển NDK thông thường của Android. – CommonsWare

Trả lời

8

Theo tài liệu Xamarin Android, mã ARM sẽ sụp đổ theo cách bất ngờ trên thiết bị ARM-v7 đa lõi.

http://docs.xamarin.com/guides/android/advanced_topics/cpu_architecture

Mục 1,1

Lưu ý: Mã armeabi Xamarin.Android của không phải là thread an toàn và không nên được sử dụng trên nhiều thiết bị CPU armeabi-v7a (được mô tả dưới đây). Sử dụng mã aremabi trên thiết bị armeabi-v7a lõi đơn là an toàn.

Lý do khiến Xamarin Android yêu cầu phải bao gồm armeabi-v7a phải làm với truy cập bộ nhớ an toàn chủ đề. Nói một cách đơn giản, bộ chỉ dẫn armeabi thiếu các hướng dẫn cần thiết để khóa bộ nhớ an toàn trên các thiết bị SMP.

Các cuộc thảo luận kỹ lưỡng nhất về vấn đề này có thể được tìm thấy trong báo cáo lỗi này: https://bugzilla.xamarin.com/show_bug.cgi?id=7013

Jonathan Pryor 2012/09/20 11:41:45 EDT

Theo như tôi có thể xác định, nó là (gần) không thể tin được sử dụng một thư viện armeabi trên một thiết bị SMP armeabi-v7a. Điều này là do armeabi thiếu CPU hướng dẫn cần thiết để khóa dữ liệu an toàn trên thiết bị SMP, vì vậy nếu thư viện có chứa dữ liệu phải được bảo vệ khỏi truy cập từ nhiều chủ đề , nó bị vỡ và libmonodroid.so là một thư viện. Điều này có thể là có thể khắc phục bằng cách tạo một libmonodroid.so tự động xác định CPU thời gian chạy , cho phép nó sử dụng hướng dẫn khóa armeabi hoặc armeabi-v7a tương ứng, nhưng điều này chưa được thực hiện và khung thời gian thực hiện không xác định.

Do đó, nếu ứng dụng của bạn sẽ chạy trên phần cứng SMP, bạn nên bao gồm thời gian chạy armeabi-v7a với ứng dụng của mình. Điều này có thể được thực hiện trong hộp thoại Tùy chọn dự án .

Các sự cố này rất hiếm nhưng thảm khốc và rất khó gỡ lỗi khi bạn gặp phải lỗi hỏng và lỗi phân đoạn ngẫu nhiên.

Tôi đã có thể tạo lại sự cố một cách đáng tin cậy trên Galaxy S3. Một số mã ví dụ thể hiện sự cố là trong báo cáo lỗi này: https://bugzilla.xamarin.com/show_bug.cgi?id=7167


Không biết liệu lỗi này có ảnh hưởng đến các ứng dụng NDK khác trên Android hay không.Nhưng nó chắc chắn ảnh hưởng đến Xamarin Android.

+0

Tuyệt vời, ánh sáng có thẩm quyền về chủ đề, Jared. Cảm ơn rất nhiều. –

0

Có.

armeabi là cơ sở chung và armeabi-v7a bao gồm một số hướng dẫn bổ sung không được tìm thấy trong bộ chỉ dẫn armeabi. v7a có hỗ trợ cho các hoạt động điểm nổi phần cứng, có thể làm cho mã của bạn nhanh hơn nhiều nếu nó đang thực hiện bất kỳ thao tác dấu phẩy động nào. Android sẽ cố gắng tải thư viện armeabi-v7a trước nếu phần cứng hỗ trợ điều đó, nhưng nếu không, nó sẽ rơi trở lại phiên bản armeabi.

+0

Làm thế nào để bạn biết điều này, Nick? Xem làm rõ của tôi. –

+0

Nhận xét của Xamarin ngụ ý rằng mã có thể không phải là chủ đề an toàn đối với tôi, và tôi sẽ liên lạc với họ để làm rõ, vì tuyên bố từ họ rất mơ hồ. Bất kể, họ NÊN được vận chuyển .so cho cả hai kiến ​​trúc, và cho x86 bây giờ là tốt. –

3

http://www.arm.com/products/processors/instruction-set-architectures/index.php

Nếu bạn nhìn vào sơ đồ này nó giải thích các đặc tính của thiết kế bộ xử lý ARM. ARM Design

Các lần lặp mới mở rộng bộ tính năng cơ bản nhưng không thay đổi. NEON và SIMD cần phải được tham chiếu trực tiếp để được sử dụng, vì vậy không thể tham chiếu từ một phân hệ ARMv5.Trừ khi nhị phân của bạn là rất lớn (đó là thực thi thực tế, không phải là toàn bộ APK), tôi sẽ biên dịch cả hai và nhận được tốt nhất của cả hai thế giới. Xem this question để biết chi tiết.

Bất kể, tôi sẽ liên hệ với Xamarin để làm rõ rằng câu lệnh 'ngoại lệ không thể giải thích' được tải nhẹ. Nếu họ cảm nhận được các vấn đề với mã của họ đang chạy trên nhiều bộ xử lý thì mã của họ vốn không phải là luồng an toàn bất kể số lõi.

+0

Cảm ơn Danny. Nếu tôi bao gồm tất cả các thư viện cơ sở để lưu hoàn toàn và tương thích, ứng dụng được biên dịch rất đơn giản và nhỏ nhất sẽ lớn hơn 8Mb. Tôi muốn đánh lừa những rủi ro mà tôi đưa ra khi xuất bản một cái gì đó nhỏ hơn và trong khi câu trả lời của bạn diễn ra nhiều hơn một chút, nó không làm giảm nỗi sợ và nghi ngờ của tôi. –

+0

Đây là bản chất của việc xây dựng ứng dụng của bạn trên Xamarin tôi sợ. Nếu họ không cung cấp nhiều .so và cho bạn biết cái nào bạn cần đưa vào cho các tính năng cụ thể của Xamarin, điều này sẽ dẫn đến sưng lên ứng dụng. Về cơ bản, bạn bao gồm một loạt các mã mà ứng dụng của bạn có thể không cần vì cách chúng đang nhóm nền tảng của chúng. –

7

Tôi đã nhấp qua và đọc các nhận xét của Xamarin. Dựa trên việc đọc chúng, tôi nghĩ bạn đang đặt câu hỏi sai. Câu trả lời cho câu hỏi mà bạn đã hỏi là (như CommonsWare đã nêu trong bình luận của mình), "vâng, trừ khi Xamarin vặn thứ gì đó lên". Thật không may, tài liệu của họ chỉ ra rằng họ nghĩ rằng họ đã làm, cho là, vít một cái gì đó lên. Có một số lỗi chính tả trong tài liệu của họ gây nhầm lẫn mọi thứ một chút, đặc biệt ở một nơi (Phần 1.1) họ nói "là chủ đề an toàn" khi chúng rõ ràng có nghĩa là "KHÔNG phải là chủ đề an toàn". Họ xác định lại này một cách chính xác trong Mục 1.2:

Lưu ý: Mã armeabi Xamarin.Android của không phải là thread an toàn và không nên được sử dụng trên nhiều thiết bị CPU armeabi-v7a (được mô tả dưới đây). Sử dụng mã aremabi trên thiết bị armeabi-v7a lõi đơn là an toàn.

Tôi nghĩ rằng nếu bạn kết hợp thông tin từ các phần 1.2 và 1.1, điều đó trở nên rõ ràng những gì Xamarin đang nói cho bạn. Để được rõ ràng tôi chỉ cần nghỉ ngơi những gì tài liệu của họ nói, không thực hiện bất kỳ xác nhận về tính xác thực của tài liệu của họ. Đó là, trong trường hợp libs armeabi (không phải là thread an toàn) được tải trên một thiết bị đa lõi hoặc đa xử lý, những điều xấu có thể xảy ra. Trường hợp này có thể phát sinh do lỗi trong ICS (4.0.0-4.0.3). Do đó:

các ứng dụng được xây dựng bằng cách sử dụng Xamarin.Android 4.2 hoặc thấp hơn nên xác định một cách rõ ràng armeabi-v7a là duy nhất dựa trên ARM ABI

Dưới đây là các thông tin thực tế từ tài liệu của họ (định dạng được bổ sung) sắp xếp lại thành một trật tự có thể giúp làm cho nó rõ ràng hơn:

Từ Mục 1.2.1

Lưu ý: Xá mã số armeabi marin.Android là không an toàn chủ đề và không được sử dụng trên đa CPU thiết bị armeabi-v7a (được mô tả bên dưới). Sử dụng mã aremabi trên thiết bị armeabi-v7a lõi đơn là an toàn.

Từ mục 1.1

Do một lỗi trong Android 4.0.0, 4.0.1, 4.0.2, và 4.0.3, các thư viện nguồn gốc sẽ được chọn từ thư mục armeabi mặc dù có là một thư mục armeabi-v7a hiện tại và thiết bị là thiết bị armeabi-v7a. Lưu ý: Vì những lý do này, các ứng dụng được xây dựng bằng cách sử dụng Xamarin.Android 4.2 hoặc thấp hơn nên chỉ định rõ ràng armeabi-v7a là ABI dựa trên ARM duy nhất.

Tôi nghĩ rằng dựa trên phần còn lại của tài liệu, đây là đoạn đầu tiên trong Phần 1.1 nên nói (chỉnh sửa đậm là của tôi):

Ứng dụng Binary Interface sẽ được thảo luận chi tiết dưới đây, nhưng điều quan trọng là hãy nhớ rằng thời gian chạy armeabi sử dụng bởi Xamarin.Android là không chủ đề an toàn . Nếu ứng dụng có hỗ trợ vũ khí được triển khai tới đa CPU thiết bị armeabi-v7a, nhiều trường hợp lạ và ngoại lệ không thể giải thích sẽ xảy ra.

+0

Giải thích tuyệt vời và khá thuyết phục. Cảm ơn rất nhiều! –

+0

Số lượng lõi không có bất kỳ tác động nào đến an toàn luồng. Android có thể chuyển đổi chủ đề bất kỳ lúc nào ngay cả trên một thiết bị lõi duy nhất và điều này có thể ở giữa ghi bộ nhớ. Các tuyên bố trên không cho tôi bất kỳ sự tự tin nào về tính ổn định của Xamarin trên bất kỳ phần cứng nào. –

+0

Đây là một trong những lý do mà tôi chỉ ra rằng câu trả lời của tôi nhằm giúp làm sáng tỏ thông tin mà các tài liệu Xamarin đang cố truyền đạt - không đưa ra bất kỳ xác nhận nào về tính chính xác của tài liệu. Nếu bạn đọc đến gần cuối phần 1.3.2, nó chỉ ra rằng "Điều này cũng có thể dẫn đến các lỗi thời gian chạy tối nghĩa, vì armeabi không phải là SMP an toàn." Đọc của tôi về câu hỏi của JannieT là "điều Xamarin doc này đang cố gắng nói với tôi là gì?"; nó chắc chắn có vẻ như Xamarin đã tìm thấy một vấn đề và đang cố gắng cảnh báo người dùng của họ về nó (kém), vì vậy ý ​​định của tôi là giúp giải thích tài liệu. – ajh158

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