ทำไมต้องใช้รหัส armeabi-v7a มากกว่ารหัส armeabi?


141

ในโครงการปัจจุบันของฉันฉันใช้ประโยชน์จากไฟล์. so หลายไฟล์ เหล่านี้ตั้งอยู่ที่โฟลเดอร์ armeabi และ armeabi-v7a น่าเสียดายที่ไฟล์. so หนึ่งไฟล์เป็น 6MB และฉันต้องการลดขนาดไฟล์ แทนที่จะมีไฟล์ APK ที่มีไขมันฉันต้องการใช้ไฟล์ armeabi และลบโฟลเดอร์ armeabi-v7a

ตามเอกสาร NDK รหัส armeabi-v7a ได้รับการขยายรหัส armeabi ซึ่งสามารถมีคำสั่ง CPU เพิ่มเติม ทั้งหมดนี้นอกเหนือไปจากความเชี่ยวชาญของฉัน แต่ฉันถามว่าทำไมจึงมีรหัส armeabi-v7a และ armeabi ต้องมีเหตุผลที่ดีที่จะมีทั้งคู่ใช่มั้ย

ในอุปกรณ์ทดสอบของฉันทั้งหมดนี้ดูเหมือนจะทำงานได้ดี สิ่งเหล่านี้มีซีพียู ARM v7 ปลอดภัยไหมที่จะคิดว่าทุกอย่างใช้งานได้ในตอนนี้?


2
คุณอาจต้องการอ่านบล็อกนี้ เป็นอย่างละเอียดและทันสมัย: androidbycode.wordpress.com/tag/armeabi-v7a
IgorGanapolsky

2
และตอนนี้หมอพูดว่า:armeabi is deprecated in NDK r16. Removed in NDK r17. No hard float.
Amir Rezazadeh

1
สำหรับผู้ที่มาต่อมาดูที่นี่
Amir Rezazadeh

คำตอบ:


163

ขึ้นอยู่กับโค้ดเนมของคุณทำ แต่ v7a มีการรองรับการทำงานของจุดลอยตัวของฮาร์ดแวร์ซึ่งสร้างความแตกต่างอย่างมาก armeabi จะทำงานได้ดีบนอุปกรณ์ทั้งหมด แต่จะช้ากว่ามากและจะไม่ใช้ประโยชน์จากความสามารถของ CPU ของอุปกรณ์รุ่นใหม่ ใช้มาตรฐานบางอย่างสำหรับแอปพลิเคชันของคุณโดยเฉพาะ แต่การลบไบนารี Armeabi-v7a นั้นไม่ใช่ความคิดที่ดี หากคุณต้องการลดขนาดคุณอาจต้องการมีสอง apks แยกสำหรับรุ่นเก่า (armeabi) และรุ่นใหม่ (armeabi-v7a)


1
ฉันจะค้นหาความแตกต่างระหว่าง ABI ทั้งสองได้จากที่ไหน ฉัน instersted มากที่จะเข้าใจความแตกต่างที่แท้จริง ...
webshaker


1
มีไอเดียเกี่ยวกับโซลูชันที่ยอดเยี่ยมสำหรับการใช้ Google Play เพื่อให้คุณอัปโหลด APK ที่แตกต่างกันทั้งสองนี้หรือไม่ ไม่มีวิธีที่จะแยกความแตกต่างในรายการที่แตกต่างกันดังนั้น Google Play เพียงแค่ต้องการแทนที่อย่างใดอย่างหนึ่งกับคนอื่น ๆ (พวกเขามีรหัสรุ่นที่แตกต่างกัน)
Dean Wild

11
@DeanWild Google ได้เพิ่มการสนับสนุนในขณะนี้สำหรับการกำหนดเป้าหมาย CPU สถาปัตยกรรมที่แตกต่างกันในร้านคุณลักษณะเอพีเคเล่นหลายdeveloper.android.com/guide/google/play/publishing/...
ชาร์ลส์ฮาร์เลย์

1
@IgorGanapolsky ขอบคุณที่ชี้ให้เห็น นี่เป็นลิงก์ที่ถูกต้องแล้ว: developer.android.com/google/play/publishing/…
Charles Harley

60

EABI = แอพพลิเคชั่นไบนารีตัวเชื่อมต่อแบบฝัง มันเป็นข้อกำหนดดังกล่าวที่จะต้องปฏิบัติตามเพื่อให้ดำเนินการในสภาพแวดล้อมการดำเนินการที่เฉพาะเจาะจง นอกจากนี้ยังระบุแง่มุมต่าง ๆ ของการรวบรวมและการเชื่อมโยงที่จำเป็นสำหรับการทำงานร่วมกันระหว่างเครื่องมือที่ใช้สำหรับสถาปัตยกรรม ARM ในบริบทนี้เมื่อเราพูดถึงarmeabiเราพูดเกี่ยวกับสถาปัตยกรรม ARM และ GNU / Linux OS Android เป็นไปตาม ARM-GNU / Linux ABI ของ end-endian

แอปพลิเคชัน armeabi จะทำงานบน ARMv5 (เช่น ARM9) และ ARMv6 (เช่น ARM11) คุณอาจใช้ฮาร์ดแวร์จุดลอยตัวหากคุณสร้างแอปพลิเคชันของคุณโดยใช้ตัวเลือก GCC ที่เหมาะสมเช่น-mfpu = vfpv3 -mfloat-abi = softfpซึ่งบอกคอมไพเลอร์เพื่อสร้างคำสั่งจุดลอยตัวสำหรับฮาร์ดแวร์ VFP และเปิดใช้งานการประชุมการโทรแบบลอยตัว armeabi ไม่สนับสนุนการประชุมการโทรแบบลอยตัว (หมายถึงการลงทะเบียน FP ไม่ได้ใช้เพื่อให้มีอาร์กิวเมนต์สำหรับฟังก์ชั่น) แต่การดำเนินการ FP ใน HW ยังคงได้รับการสนับสนุน

แอปพลิเคชัน armeabi-v7a จะทำงานบนอุปกรณ์ Cortex A # เช่น Cortex A8, A9 และ A15 จะสนับสนุนการประมวลผลแบบ multi-core และสนับสนุน-mfloat-ABI = ยาก ดังนั้นหากคุณสร้างแอปพลิเคชันของคุณโดยใช้-mfloat-abi = hardการเรียกใช้ฟังก์ชันจำนวนมากของคุณจะเร็วขึ้น


1
ตามdeveloper.android.com/ndk/guides/abis.htmlThe armeabi-v7a ABI uses the -mfloat-abi=softfp switch : ดังนั้นคุณหมายถึงอะไรโดยการสนับสนุน -mfloat-abi = hard ?
IgorGanapolsky

8

แทนที่จะมีไฟล์ APK ที่มีไขมันฉันต้องการใช้ไฟล์ armeabi และลบโฟลเดอร์ armeabi-v7a

ตรงกันข้ามเป็นกลยุทธ์ที่ดีกว่ามาก หากคุณมีminSdkVersionถึง 14 และอัปโหลด apk ของคุณไปยัง play store คุณจะสังเกตเห็นว่าคุณสนับสนุนอุปกรณ์จำนวนเดียวกันไม่ว่าคุณจะสนับสนุนarmeabiหรือไม่ก็ตาม ดังนั้นจึงไม่มีอุปกรณ์ที่ใช้ Android 4 หรือสูงกว่าซึ่งจะได้ประโยชน์จากarmeabiทั้งหมด

นี่อาจเป็นเหตุผลที่ Android NDK ไม่สนับสนุนarmeabiอีกต่อไปตามการแก้ไข r17b [ แหล่งที่มา ]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.