Tại sao sử dụng mã armeabi-v7a trên mã armeabi?


141

Trong dự án hiện tại của tôi, tôi sử dụng nhiều tệp .so. Chúng được đặt tại thư mục armeabi và armeabi-v7a. Thật không may, một trong các tệp .so là 6MB và tôi cần giảm kích thước tệp. Thay vì có một tệp APK béo, tôi chỉ muốn sử dụng các tệp armeabi và xóa thư mục armeabi-v7a.

Theo tài liệu NDK, mã armeabi-v7a là mã armeabi mở rộng có thể chứa các hướng dẫn CPU bổ sung. Tất cả điều này vượt quá chuyên môn của tôi, nhưng tôi đặt câu hỏi tại sao người ta muốn có cả mã armeabi-v7a và armeabi. Phải có một lý do tốt để có cả hai, phải không?

Trên các thiết bị thử nghiệm của tôi, tất cả dường như hoạt động tốt. Chúng có CPU ARM v7. Có an toàn để cho rằng mọi thứ hoạt động bây giờ?


2
Bạn có thể muốn cho blogpost này đọc ngay bây giờ. Nó rất kỹ lưỡng và cập nhật: androidbycode.wordpress.com/tag/armeabi-v7a
IgorGanapolsky

2
Và bây giờ tài liệu nói:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Amir Rezazadeh

1
Đối với những người đến sau, hãy xem ở đây .
Amir Rezazadeh

Câu trả lời:


163

Phụ thuộc vào những gì mã gốc của bạn làm, nhưng v7a có hỗ trợ cho các hoạt động điểm nổi phần cứng, điều này tạo ra sự khác biệt rất lớn. armeabi sẽ hoạt động tốt trên tất cả các thiết bị, nhưng sẽ chậm hơn rất nhiều và sẽ không tận dụng được khả năng CPU của các thiết bị mới hơn. Đừng lấy một số điểm chuẩn cho ứng dụng cụ thể của bạn, nhưng loại bỏ các nhị phân armeabi-v7a thường không phải là một ý tưởng tốt. Nếu bạn cần giảm kích thước, bạn có thể muốn có hai apks riêng cho các thiết bị cũ hơn (armeabi) và mới hơn (armeabi-v7a).


1
Tôi có thể tìm thấy sự khác biệt giữa cả ABI ở đâu? Tôi rất khó hiểu để hiểu sự khác biệt thực sự ...
webshaker


1
có ý tưởng nào về một giải pháp tuyệt vời để có được google Play để cho phép bạn tải lên hai APK khác nhau này không? Không có cách nào để phân biệt trong bảng kê khai rằng chúng khác nhau, vì vậy Google Play chỉ muốn thay thế cái này bằng cái khác (chúng có mã phiên bản khác nhau)
Dean Wild

11
@DeanWild Google hiện đã thêm hỗ trợ cho việc nhắm mục tiêu các kiến ​​trúc CPU khác nhau trong tính năng nhiều cửa hàng Play Store: developer.android.com/guide/google/play/publishing/
Charles Harley

1
@IgorGanapolsky, cảm ơn bạn đã chỉ ra điều đó. Đây hiện là liên kết chính xác: developer.android.com/google/play/publishing/ Kẻ
Charles Harley

60

EABI = Giao diện nhị phân ứng dụng nhúng. Đó là các thông số kỹ thuật mà một thực thi phải tuân thủ để thực thi trong một môi trường thực thi cụ thể. Nó cũng chỉ định các khía cạnh khác nhau của quá trình biên dịch và liên kết cần thiết cho sự tương tác giữa các bộ công cụ được sử dụng cho Kiến trúc ARM. Trong bối cảnh này khi chúng ta nói về armeabi, chúng ta nói về kiến ​​trúc ARM và hệ điều hành GNU / Linux. Android tuân theo ARM GNU / Linux ABI cuối cùng.

Ứng dụng armeabi sẽ chạy trên ARMv5 (ví dụ ARM9) và ARMv6 (ví dụ ARM11). Bạn có thể sử dụng phần cứng Floating Point nếu bạn xây dựng ứng dụng của mình bằng các tùy chọn GCC thích hợp như -mfpu = vfpv3 -mfloat-abi = softfp để trình biên dịch tạo các lệnh dấu phẩy động cho phần cứng VFP và cho phép các quy ước gọi phao mềm. armeabi không hỗ trợ các quy ước gọi phao cứng (điều đó có nghĩa là các thanh ghi FP không được sử dụng để chứa các đối số cho một hàm), nhưng các hoạt động của FP trong CTNH vẫn được hỗ trợ.

Ứng dụng armeabi-v7a sẽ chạy trên các thiết bị Cortex A # như Cortex A8, A9 và A15. Nó hỗ trợ bộ xử lý đa lõi và nó hỗ trợ -mfloat-abi = hard . Vì vậy, nếu bạn xây dựng ứng dụng của mình bằng cách sử dụng -mfloat-abi = hard , nhiều lệnh gọi hàm của bạn sẽ nhanh hơn.


1
Theo nhà phát triển.android.com/ndk/guides/abis.html : The armeabi-v7a ABI uses the -mfloat-abi=softfp switch. Vì vậy, ý của bạn là gì khi hỗ trợ -mfloat-abi = hard ?
IgorGanapolsky

8

Thay vì có một tệp APK béo, tôi chỉ muốn sử dụng các tệp armeabi và xóa thư mục armeabi-v7a.

Ngược lại là một chiến lược tốt hơn nhiều. Nếu bạn phải minSdkVersion14 và tải apk của bạn lên cửa hàng chơi, bạn sẽ nhận thấy bạn sẽ hỗ trợ cùng một số thiết bị cho dù bạn có hỗ trợ armeabihay không. Do đó, không có thiết bị nào có Android 4 trở lên sẽ được hưởng lợi gì armeabicả.

Đây có lẽ là lý do tại sao Android NDK thậm chí không hỗ trợ armeabinữa theo phiên bản r17b. [ nguồn ]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.