เหตุใดจึงมีเมล็ด Android แตกต่างกันมากมาย (โปรดตอบคำถามทางเทคนิค)


17

Android เป็นเคอร์เนลทั่วไปที่ใช้กับอุปกรณ์ทั้งหมดหรือไม่ ตัวอย่างเช่น CentOS จะติดตั้งบน Dell, HP และฮาร์ดแวร์อื่น ๆ ที่หลากหลาย แน่ใจว่ามีโมดูลที่แตกต่างกัน แต่ก็ยังคง CentOS

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

คำตอบ:


24

เมล็ดแตกต่างจากผู้ผลิตผู้ผลิต เมล็ดเหล่านั้นจำนวนมากมาจากเคอร์เนลหุ้นบริสุทธิ์แหล่งที่พบใน CAF สิ่งที่ผู้ผลิตเหล่านี้ทำคือนำแหล่งข้อมูลเหล่านั้นมาปรับเปลี่ยนให้เหมาะสมกับบอร์ด / ชิปเซ็ตที่ใช้รวมถึงใช้ไดรเวอร์ของตัวเอง

ลองมองดูรอบ ๆ ตัวคุณดูดีมีหน้าจอทัชสกรีนชุดรูปแบบของชิปเซ็ต wifi ไม่พูดถึงมาตรความเร่งเซ็นเซอร์เซ็นเซอร์แบตเตอรี่เข็มทิศเสียงกราฟิก

การใช้แหล่งที่มาของเคอร์เนลจากแหล่งหนึ่งตัวอย่างเช่น HTC จะไม่ทำงานบน Samsung และในทางกลับกัน

ผู้ผลิตมีอิสระที่จะหยิบเชอร์รี่หรือออกบิตต่าง ๆ ที่รวมอยู่ในแผงวงจร ไม่มีกฎที่ยากหรือเร็วเข้ามาเกี่ยวข้อง ดังนั้นการแฮ็ค / การแก้ไขจำนวนมากเพื่อให้เคอร์เนลทำงานอย่างถูกต้อง

คุณต้องไม่เปรียบเทียบกับเมล็ดกระจาย Linux บนเดสก์ท็อปที่มี PCI, PCI-Express, SATA, VGA, SVGA, USB, อีเธอร์เน็ตเนื่องจากเป็นเกมสวนบอลที่แตกต่างกันโดยสิ้นเชิง ความแตกต่างที่สำคัญกับ CentOS และ Linux Kernel ของ Android คือ - ไดรเวอร์ทั้งหมดจะถูกรวบรวมเป็นโมดูลหรือในตัวดังนั้นการกระจาย Linux ใด ๆ ก็จะ "ทำงานนอกกรอบ" อีกครั้งด้วยการกระจาย Linux บนเดสก์ท็อป - คุณมีสถาปัตยกรรมเดียว - x86 ดังนั้นหนึ่งลินุกซ์เคอร์เนลจากคอมพิวเตอร์ Dell บอกว่าสามารถทำงานได้นอกกรอบบน Lenovo โดยมีการรวบรวมไดรเวอร์ที่เป็นมาตรฐาน

อย่าลืมว่าในโลก Android นั้นมีเคอร์เนลที่สร้างขึ้นสำหรับชิปเซ็ต ARM เฉพาะเช่น ARMv6, ARMv7, มี TEGRA, มี EXYNOS และพวกมันเข้ากันไม่ได้กับไบนารี่ ดังนั้นหากเคอร์เนลถูกคอมไพล์สำหรับ TEGRA ให้ลืมมันจะไม่ทำงานบน ARMv7!

เหตุผลที่เมล็ดบางส่วนใน Android ดูเหมือนจะ "เสีย" ขึ้นอยู่กับผู้ผลิต บางตัว (Zte เป็นหนึ่งในตัวอย่างที่ดีมาก) ปล่อยแหล่งข้อมูล butchered ที่อาจรวบรวมจากแหล่งที่มา แต่ไม่สามารถบูตได้เนื่องจากไดรเวอร์ที่ขาดหายไปซึ่งไม่ครอบคลุมอยู่ในใบอนุญาต GPLv2 หรือ GPLv3 นั่นคือปัญหาดังนั้นแฮกเกอร์บางคนต้องไปเที่ยวรอบ ๆ GitHub เพื่อหาเบาะแส; ผู้ผลิตบางรายถ้าไม่ทั้งหมดทำตาม การจุติมาปัจจุบันของแหล่งกำเนิดของ Zte นั้นมีค่าเท่ากับ 2.6.35.7 แต่ในความเป็นจริงแล้วแหล่งที่มาจริงของ 2.6.32.9 ที่มาพร้อมกับการแก้ไขมากมายดังนั้นจึงไม่ได้เป็นตัวแทนเคอร์เนลจริงสำหรับ 2.6.35.7!

นี่คือที่ผู้ผลิตจะต้องปล่อยแหล่งที่มาของพวกเขาไม่เพียง แต่ไม่สอดคล้องกับ GPLv2 หรือใหม่กว่า แต่สำหรับชุมชนที่จะสามารถแก้ไขได้เช่นการเพิ่มความสามารถในการโอเวอร์คล็อก

ดังนั้นจึงมีการแฮ็คที่เกี่ยวข้องกับเบื้องหลังและยุ่งเกี่ยวกับไดรเวอร์ที่พยายามทำให้มันทำงานได้และมันก็ไม่ง่ายที่จะทำการดีบักเช่นกัน .. ไดรเวอร์บางตัวอาจมีลิขสิทธิ์ข้ามแต่ไม่สามารถแจกจ่ายได้ขึ้นอยู่กับข้อและเงื่อนไขตาม การเจรจาต่อรอง

โชคดีที่ตอนนี้ทุกอย่างเปลี่ยนไปด้วยเคอร์เนลแหล่งที่มา 3.xx เนื่องจากไดรเวอร์ Android ได้รวมเข้ากับแหล่งข้อมูลหลักแล้ว แต่มี gotcha!

ลองย้ายเคอร์เนล 3.xx ไปยังโทรศัพท์ที่มีอยู่ซึ่งมีอายุประมาณ 12-18 เดือน ไม่ใช่โอกาสของสโนว์บอลในนรกที่จะทำงานนั่นเป็นเพราะปัจจัยที่แตกต่างกันแหล่งที่มาที่ 3.xx นั้นแตกต่างอย่างมากกับแหล่ง 2.6.x และจะใช้การแฮ็คจำนวนมากเพื่อให้มันทำงาน - ฉันควรรู้ได้ลองแล้ว การพอร์ต 2.6.38.6 ซอร์สโค้ดสำหรับ Zte Blade และล้มเหลว

ในทำนองเดียวกันเคอร์เนลรุ่นล่าสุด 3.0.1 - เมื่อทำงานในโครงการ ics4blade บน Modaco ได้พยายามหลายครั้งในการพอร์ต แต่มันก็ลงเอยกับความจริงง่ายๆที่ Zte ทำระเบียบที่ไม่ดีมากของแหล่งซึ่งทำให้การย้ายไม่ได้อยู่ใกล้ .


โหวตขึ้นทุกรอบ !!! ขอบคุณสำหรับคำตอบโดยละเอียด
user974896

คุณยินดีอย่างมาก! อะไรก็ได้ที่คุณต้องรู้! : D
t0mm13b

จากสิ่งที่คุณพูดไดรเวอร์ไม่ได้รวบรวมทั้งหมดเป็นโมดูล แต่รวมอยู่ในเคอร์เนลเองดังนั้นแม้ว่า CM จะได้รับเคอร์เนลที่ทำงานบนอุปกรณ์มันไม่สามารถเพียงแค่ "ย้ายโมดูล XXX" ไปยังโครงสร้างใหม่และใช้งานได้เพราะ อาจไม่มีโมดูล XXX ไดรเวอร์จะต้องถูกตามล่าแฮ็ก (อาจ) และคอมไพล์ใหม่
user974896

2
ถูกต้องและยังมีไดรเวอร์ที่แตกต่างกันดังนั้นไดรเวอร์หนึ่งสำหรับหน้าจอสัมผัสบนโทรศัพท์มือถือเครื่องหนึ่งจะไม่ทำงานบนโทรศัพท์มือถือเครื่องอื่นที่ใช้หน้าจอสัมผัสที่แตกต่างกัน นอกจากนี้ประเด็นสำคัญอีกข้อที่ควรทราบ - ไดรเวอร์บางตัวขึ้นอยู่กับรุ่นของเคอร์เนล - Zte นำเอา Atheros Wifi ไดรเวอร์สำหรับ Blade รุ่นออกมาและไดรเวอร์จะไม่ทำงานเว้นแต่เคอร์เนลเป็นรุ่น 2.6.35.7 รุ่นอื่น ๆ wifi break - นี่เป็นการแสดงให้เห็นถึงการพึ่งพาในวิธีที่ค่อนข้างแฮ็คและแตกหักในการทำสิ่งต่าง ๆ เช่นนั้น
t0mm13b

12

สถาปัตยกรรมพีซีสร้างขึ้นรอบ ๆ ส่วนสินค้าโภคภัณฑ์เพราะมันเริ่มต้นจากการโคลนของผลิตภัณฑ์เฉพาะคือพีซี IBM ซึ่งได้รับการออกแบบมาโดยเฉพาะเพื่อให้เข้ากันได้กับมัน โดยทั่วไปแล้วคุณสามารถใช้โปรแกรมหรืออุปกรณ์ต่อพ่วงจากพีซีที่ใช้ร่วมกันได้และนำไปไว้ในที่อื่นและคาดว่าจะใช้งานได้ ความสามารถนั้นมีประโยชน์มากพอที่คนจะเรียกร้องอย่างต่อเนื่องแม้ในขณะที่เทคโนโลยีมีการพัฒนา คุณสามารถใส่การ์ด PCI Express ลงในพีซีที่ทันสมัยใด ๆ ก็ได้เหมือนกับที่คุณสามารถใส่การ์ด ISA ลงในพีซีโคลนใด ๆ ก็ได้

สมาร์ทโฟนไม่มีประวัติดังกล่าว พวกเขากำลังออกแบบเป็นผลิตภัณฑ์เสาหินระบบที่สมบูรณ์ประกอบด้วยฮาร์ดแวร์และซอฟต์แวร์ที่ "เพิ่งทำงาน" ตามที่เป็นอยู่ ไม่มีความคาดหวังว่าผู้คนจะนำชิ้นส่วนออกมาจากโทรศัพท์เครื่องหนึ่งและนำไปไว้ในโทรศัพท์เครื่องอื่นดังนั้นวิศวกรไม่จำเป็นต้องคำนึงถึงการทำงานร่วมกันเมื่อพวกเขาออกแบบผลิตภัณฑ์

แม้จะอยู่ในแหล่งต้นไม้ลินุกซ์มีจำนวนมากของการกระจายตัวในไดรเวอร์สำหรับแพลตฟอร์ม ARM เนื่องจากโทรศัพท์ถูกออกแบบมาตามหลังประตูปิดทีมวิศวกรรมใน บริษัท ต่าง ๆ มักจะทำงานซ้ำซ้อนโดยทั่วไปจะออกแบบฮาร์ดแวร์เดียวกันกับคู่แข่งแล้วเขียนไดรเวอร์ของตนเองสำหรับการออกแบบของตนเอง เมื่อเสร็จแล้วและเปิดตัวผลิตภัณฑ์พวกเขาตรงไปทำงานต่อไป; มันไม่คุ้มค่ากับเวลาของพวกเขาที่จะกลับไปและปรับโครงสร้างไดรเวอร์สำหรับผลิตภัณฑ์ที่ผ่านมาหรือรวมเข้ากับไดรเวอร์ของคู่แข่ง ผลที่ได้คือไดรเวอร์ที่ใช้ครั้งเดียวเหลือเฟือสำหรับอุปกรณ์ที่มีลักษณะคล้ายกัน แต่ไม่เหมือนกัน

นอกจากนี้สมาร์ทโฟนมักใช้SOCซึ่งมีฮาร์ดแวร์พิเศษที่รวมเข้ากับโปรเซสเซอร์ สำหรับบางสิ่งนี้อาจเป็นมากกว่าเรื่องของการโหลดหรือไม่โหลดไดรเวอร์บางตัว เคอร์เนลโดยรวมอาจต้องสร้างขึ้นด้วยตัวเลือกการกำหนดค่าพิเศษสำหรับการทำงานบน SOC หนึ่งซึ่งไม่สามารถใช้ร่วมกับตัวเลือกพิเศษที่จำเป็นในการทำงานบน SOC อื่น


5

เหตุผลก็คือเนื่องจากเคอร์เนลลินุกซ์ของ Android นั้นไม่ได้ทำการคอมไพล์บน Android แต่จะต้องมีการคอมไพล์ข้ามจากคอมพิวเตอร์เครื่องอื่น สิ่งนี้ทำให้เกิดปัญหาต่าง ๆ เนื่องจากการกำหนดค่าอุปกรณ์ไม่พร้อมใช้งานในเวลารวบรวมและไม่สามารถคอมไพล์เคอร์เนลทั่วไปพร้อมไดรเวอร์ทั้งหมดเนื่องจากข้อ จำกัด ด้านพื้นที่ (ในขณะที่เดสก์ท็อปส่วนใหญ่มีไดรเวอร์ทั้งหมดที่คอมไพล์ลงในโมดูลที่โหลดจาก initramfs) . นักพัฒนาจึงต้องคิดออกว่าไดรเวอร์ใดที่จะจัดทำแพ็กเกจสำหรับอุปกรณ์เฉพาะแต่ละชิ้น ไม่เพียงแค่นั้นไดรเวอร์แต่ละตัวจะมีตัวเลือกเวลาเป็นสิบหรือมากกว่านั้นในการรวบรวมเวลาเพื่อสลับคุณสมบัติของไดรเวอร์ต่างๆและผู้ผลิตมักจะไม่ปล่อยการกำหนดค่าอย่างเป็นทางการของพวกเขา (ผู้กระทำผิดที่เลวร้ายที่สุดไม่ได้เปิดไดรเวอร์ของพวกเขา สำเนาของไดรเวอร์ให้ทันสมัย)

การเขียนโปรแกรมควบคุมนั้นยากกว่าการเขียนโปรแกรมแอปพลิเคชันเนื่องจากไม่มีเคอร์เนลที่ป้องกันคุณจากฮาร์ดแวร์ที่ไม่แน่นอนที่มีความต้องการเวลาแบบเรียลไทม์ที่เฉพาะเจาะจงและสิ่งนี้และหมายความว่าแม้การมีคุณสมบัติด้านประสิทธิภาพที่แตกต่างกัน บางเหตุการณ์ในเวลาจริงยากจากฮาร์ดแวร์ การพลาดเหล่านี้อาจปรากฏขึ้นเป็นข้อบกพร่องหรือปัญหาด้านประสิทธิภาพ

ปัญหาอื่นคือความเข้ากันไม่ได้ของไบนารี มีสาเหตุสองประการที่ทำให้เกิดความไม่ลงรอยกันของไบนารีได้อันดับแรกคือชนิดของ CPU ซึ่งได้รับการครอบคลุมโดย t0mm13b ดี แต่ปัญหาอื่น ๆ ที่เกี่ยวข้องกับการพอร์ตคือความเข้ากันไม่ได้ของ ABI (อินเทอร์เฟซไบนารีของแอปพลิเคชัน) หากผู้ผลิตไม่เปิดแหล่งไดรเวอร์ของพวกเขาแล้วนักพัฒนาจะต้องใช้โมดูลรวบรวมจาก ROM หุ้น สิ่งนี้ทำให้เกิดปัญหาความเข้ากันไม่ได้ของ ABI ต่าง ๆ เนื่องจากโมดูลไดรเวอร์มีความคาดหวังที่เฉพาะเจาะจงเช่นโครงสร้างเลย์เอาต์และพารามิเตอร์การเรียกใช้ฟังก์ชันและเมื่อเคอร์เนลถูกคอมไพล์จึงไม่มีไฟล์ส่วนหัวเพื่ออธิบาย ABI ณ เวลาที่ไดรเวอร์ ถูกรวบรวม ดังนั้นนักพัฒนาจึงต้องทำวิศวกรรมย้อนกลับไดรเวอร์เพื่อสร้างไฟล์ส่วนหัวหรือไฟล์ส่วนหัวในแผนผังต้นกำเนิดอาจมีการปรับเปลี่ยนอย่างมากเนื่องจากคอมไพล์ไดรเวอร์ถูกคอมไพล์และนักพัฒนาต้องเปลี่ยนการแก้ไขเหล่านั้นเพื่อให้เคอร์เนลเข้ากันได้อีกครั้งกับ ABI ของไดรเวอร์ การคอมไพล์สำหรับไดรเวอร์ไบนารีจะไม่ก่อให้เกิดข้อผิดพลาดในการคอมไพล์เนื่องจากพารามิเตอร์ของฟังก์ชั่นไม่ตรงกันหรือ struct เข้ากันไม่ได้มันจะทำให้อุปกรณ์ของคุณพังในขณะที่มันกำลังทำงานและการดีบักปัญหาเหล่านี้เป็นเรื่องยากมาก ในโลกของพีซีเราคุ้นเคยกับความยุ่งเหยิงที่ nVidia และ ATi ทิ้งไว้ให้เราเนื่องจากพวกเขายืนยันที่จะปล่อยไดร์เวอร์แบบไบนารีเท่านั้นโดยคิดว่ามีระเบียบนั้นสำหรับไดรเวอร์ทั้งหมดลองจินตนาการถึง "ความสนุก" ที่สร้างขึ้น

ฮาร์ดแวร์ของพีซีโดยทั่วไปจะมีมาตรฐานที่ดีกว่าฮาร์ดแวร์มือถือพีซีส่วนใหญ่ไม่ต้องการไดรเวอร์สำหรับ vibrators, accelerometer, Gyroscope, วิทยุ 3G, เซ็นเซอร์ความใกล้ชิด, NFC ฯลฯ แม้ในอุปกรณ์ที่มี 3G ก็มักจะเชื่อมต่อกับฮาร์ดแวร์โดยใช้มาตรฐาน การเชื่อมต่อเช่น PCMCIA หรือ PCI-E


4

ดี .... ไดรเวอร์และเคอร์เนลไม่เหมือนกันทั้งหมด

ไดรเวอร์เป็นสิ่งที่ควบคุมเสาอากาศของเซลล์, WiFi, บลูทู ธ และอื่น ๆ เหล่านี้เป็นไดรเวอร์ที่เป็นกรรมสิทธิ์เพราะผู้ผลิตต้องสร้างวิธี (ไดรเวอร์) เพื่อพูดคุยกับฮาร์ดแวร์ของพวกเขา

เคอร์เนลเป็นระดับตัวกลางระหว่าง OS / แอปพลิเคชันและไดรเวอร์จริง (หรือ cpu หรือหน่วยความจำหรือฮาร์ดแวร์อื่น ๆ ) เป็นสิ่งที่ช่วยให้ระบบปฏิบัติการ / แอพของคุณเชื่อมต่อกับส่วนประกอบฮาร์ดแวร์เหล่านี้

เมล็ดทั้งหมดที่คุณเห็นนับล้านนั้นไม่ได้แตกต่างกันมากนัก โดยทั่วไปโปรแกรมเมอร์ / ผู้ดัดแปลงจะใช้เคอร์เนลที่มีอยู่และ "ปรับแต่ง" เพื่อลองและรับประสิทธิภาพที่แตกต่างออกไป คุณสามารถบอกได้ว่าพวกเขากำลังปรับเท่านั้น (ส่วนใหญ่) "การกำหนดค่า" ของเคอร์เนล ในโลก Android ตัวดัดแปลงเหล่านี้มักจะมองที่: โอเวอร์คล็อกหรือโอเวอร์คล็อกนาฬิกาซีพียู (สำคัญสำหรับการประหยัดอายุการใช้งานแบตเตอรี่หรือพยายามที่จะใช้งานแอพพลิเคชั่นที่ต้องใช้กำลังประมวลผลมากที่สุดเช่นวิดีโอเกม emulators volting (เพื่อประหยัดอายุการใช้งานแบตเตอรี่โดยการเรียกใช้ CPU ของคุณนอกพารามิเตอร์ชุดเดิม ... ซึ่งจะแตกต่างกันไปในแต่ละบุคคลเพราะไม่มีซีพียูสองตัวทำ 100% เหมือนกันทั้งหมด)


สิ่งที่ฉันหมายถึงเป็นตัวอย่างกับ CyanogenMod มีข้อร้องเรียนของ wifi, bluetooth และอื่น ๆ ของฉันอยู่เสมอ เหตุใดจึงต้องมีไดรเวอร์ "พอร์ต" ถึง CyanogenMod เหตุใดพวกเขาจึงไม่สามารถใช้ไดรเวอร์หุ้นคัดลอกไปยังอุปกรณ์และเรียกใช้พวกเขาด้วย CyanogenMod
user974896

ไม่มีสิ่งเช่นไดรเวอร์ "หุ้น" สำหรับอุปกรณ์ อุปกรณ์ทุกชิ้นมีไดรเวอร์ที่แตกต่างกันสำหรับฮาร์ดแวร์เช่นกล้อง, ชิป wifi ฯลฯ และพวกเขามักจะเป็นแหล่งปิดดังนั้นพวกเขาจึงต้อง "แฮ็ค" ของพวกเขาผ่านการให้ไดรเวอร์ทำงาน
Ryan Conrad

1
ใช่ แต่ทำไมต้องแฮ็ค หากพวกเขาทำงานกับเคอร์เนล OEM ทำไมคุณไม่สามารถย้ายไฟล์ไดรเวอร์และไลบรารีที่เกี่ยวข้องไปยังการติดตั้ง Cyanogen mod ได้เนื่องจากเคอร์เนลนั้นเหมือนกัน
user974896

1

โทรศัพท์และอื่น ๆ ที่ฝังตัวไม่มี BIOS เพื่อให้สิ่งที่เป็นนามธรรมระหว่างฮาร์ดแวร์และระบบปฏิบัติการผลที่ตามมาคือระบบปฏิบัติการที่รวบรวมไว้สำหรับฮาร์ดแวร์ที่ใช้งานอยู่ แม้กระทั่งอุปกรณ์ที่ใช้ชุดชิปเดียวกันก็สามารถกำหนดค่าได้หลายวิธี (โดยใช้ตัวเลือก comms บัสเป็นต้น) \ ผลลัพธ์ก็คือเคอร์เนลต้องถูกคอมไพล์ตามลำดับ เนื่องจากไม่มีความคาดหวังของการเปลี่ยนแปลงในฮาร์ดแวร์จึงไม่มีการตรวจจับฮาร์ดแวร์ที่ดำเนินการ เคอร์เนลบูทเร็วขึ้นและเล็กลงด้วย - นี่คือหลักการมาตรฐานของระบบปฏิบัติการฝังตัว


0

CentOS ติดตั้งบนฮาร์ดแวร์ที่แตกต่างกัน แต่

  1. มันคือพีซีทั้งหมดที่มีความแตกต่างน้อยกว่าโทรศัพท์
  2. เคอร์เนล Ubuntu, เคอร์เนล Debian และเคอร์เนลระดับต้นเป็นแหล่งเคอร์เนลที่แตกต่างกันทั้งหมด

สำหรับจุดที่สองของคุณให้ดูคำตอบที่โพสต์ไว้ก่อนหน้านี้

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