ตั้งแต่ Android 5.0 การทำงานที่เหมาะสมของสแต็กเครือข่าย Android ในเคอร์เนล Linux ต้องใช้คอมมิตจำนวนหนึ่งที่ส่งไปยังต้นทางเมื่อไม่นานมานี้ หรือยังไม่ได้ส่งไปยังต้นทาง การยืนยันฟังก์ชันการทำงานของเคอร์เนลที่จำเป็นหรือติดตามคอมมิตที่ขาดหายไปด้วยตนเองไม่ใช่เรื่องง่าย ทีม Android จึงแชร์การทดสอบที่ใช้เพื่อให้แน่ใจว่าเคอร์เนลทำงานตามที่คาดไว้
เหตุผลที่ควรทำการทดสอบ
การทดสอบเหล่านี้มีขึ้นด้วยเหตุผลหลักๆ 3 ประการ ดังนี้
- โดยปกติแล้วเวอร์ชันที่แน่นอนของเคอร์เนล Linux ที่ใช้ในอุปกรณ์จะ ขึ้นอยู่กับอุปกรณ์นั้นๆ และยากที่จะทราบว่าเคอร์เนล ทำงานได้อย่างถูกต้องหรือไม่โดยไม่ได้ทำการทดสอบ
- การส่งต่อและ ส่งกลับแพตช์เคอร์เนลไปยังเคอร์เนลเวอร์ชันต่างๆ หรือ Device Tree ที่แตกต่างกันอาจทำให้เกิดปัญหาเล็กๆ น้อยๆ ที่มองไม่เห็นหากไม่ได้ ทำการทดสอบ
- ฟีเจอร์เครือข่ายใหม่อาจต้องใช้ฟังก์ชันการทำงานของเคอร์เนลใหม่หรือการแก้ไขข้อบกพร่องของเคอร์เนล
หากการทดสอบไม่ผ่าน สแต็กเครือข่ายของอุปกรณ์ จะทำงานไม่ถูกต้อง ซึ่งทำให้เกิดข้อบกพร่องในการเชื่อมต่อที่ผู้ใช้มองเห็น (เช่น การหลุดออกจาก เครือข่าย Wi-Fi) อุปกรณ์น่าจะไม่ผ่านการทดสอบชุดเครื่องมือทดสอบความเข้ากันได้ของ Android (CTS) ด้วย
ใช้การทดสอบ
การทดสอบใช้ User-Mode Linux เพื่อบูต เคอร์เนลเป็นกระบวนการในเครื่องโฮสต์ Linux ดูส่วน การสร้างสภาพแวดล้อมการบิลด์สำหรับ เวอร์ชันระบบปฏิบัติการที่เหมาะสม เฟรมเวิร์กการทดสอบหน่วย จะบูตเคอร์เนลด้วยอิมเมจดิสก์ที่เหมาะสมและเรียกใช้การทดสอบจาก ระบบไฟล์ของโฮสต์ การทดสอบเขียนด้วย Python และใช้อินเทอร์เฟซ TAP เพื่อ ทดสอบลักษณะการทำงานของเคอร์เนลและ Socket API
คอมไพล์เคอร์เนลสำหรับ ARCH=um
หากต้องการเรียกใช้การทดสอบ
เคอร์เนลต้องคอมไพล์สำหรับ ARCH=um SUBARCH=x86_64 นี่คือสถาปัตยกรรมที่รองรับทั้งต้นทางและในโครงสร้างเคอร์เนล Android ทั่วไป (เช่น android-4.4) แต่ในบางครั้ง เคอร์เนลของอุปกรณ์จะไม่คอมไพล์ในโหมดนี้เนื่องจากโครงสร้างอุปกรณ์มีโค้ดเฉพาะอุปกรณ์หรือโค้ดเฉพาะฮาร์ดแวร์ในไฟล์ทั่วไป (เช่น sys/exit.c)
ในหลายกรณี การตรวจสอบว่าโค้ดเฉพาะฮาร์ดแวร์อยู่เบื้องหลัง #ifdefก็เพียงพอแล้ว โดยปกติแล้วควรเป็น #ifdef ในตัวเลือกการกำหนดค่าที่ควบคุมฟีเจอร์เฉพาะที่เกี่ยวข้องกับโค้ด หากไม่มีตัวเลือกการกำหนดค่าดังกล่าว ให้ใส่โค้ดเฉพาะฮาร์ดแวร์ภายในบล็อก #ifndef CONFIG_UML
โดยทั่วไปแล้ว ผู้ให้บริการโครงสร้างเคอร์เนล
(เช่น ผู้ให้บริการชิปเซ็ตหรือ SoC) ควรเป็นผู้รับผิดชอบในการแก้ไขปัญหานี้ เรากำลังทำงานร่วมกับ OEM และผู้ให้บริการเพื่อให้มั่นใจว่าเคอร์เนลปัจจุบันและอนาคตจะคอมไพล์สำหรับ ARCH=um
SUBARCH=x86_64 ได้โดยไม่ต้องทำการเปลี่ยนแปลงใดๆ
ทำการทดสอบ
การทดสอบอยู่ที่ kernel/tests/net/test
เราขอแนะนำให้เรียกใช้การทดสอบจาก AOSP main เนื่องจากเป็นเวอร์ชันล่าสุด ในบางกรณี ฟีเจอร์เคอร์เนลที่จำเป็นสำหรับการทำงานที่เหมาะสมใน Android เวอร์ชันที่เผยแพร่ยังไม่มีการทดสอบที่ครอบคลุมทั้งหมดในเวอร์ชันที่เผยแพร่ ดูข้อมูลเกี่ยวกับวิธีเรียกใช้การทดสอบได้ที่ไฟล์ README ของการทดสอบเครือข่ายเคอร์เนล โดยพื้นฐานแล้ว ให้เรียกใช้คำสั่งต่อไปนี้จากด้านบนของทรีเคอร์เนล
ANDROID_TREE/kernel/tests/net/test/run_net_test.sh all_tests.sh
ผ่านการทดสอบ
ไฟล์ต้นฉบับ Python
ของการทดสอบเครือข่ายเคอร์เนลมีความคิดเห็นที่ระบุการคอมมิตเคอร์เนลที่ทราบว่า
จำเป็นต้องใช้ในการผ่านการทดสอบ การทดสอบควรผ่านในโครงสร้างเคอร์เนลทั่วไป ซึ่งก็คือ
สาขาเคอร์เนลทั่วไป android-4.4 ขึ้นไปในโปรเจ็กต์
kernel/common
ใน AOSP ดังนั้น การผ่านการทดสอบในเคอร์เนลจึงเป็นเพียงเรื่องของการ
ผสานจากสาขาเคอร์เนลทั่วไปที่เกี่ยวข้องอย่างต่อเนื่อง
การสนับสนุน
รายงานปัญหา
รายงานปัญหาเกี่ยวกับการทดสอบเครือข่ายเคอร์เนลในเครื่องมือติดตามปัญหาของ Android โดยใช้ป้ายกำกับComponent-Networking
การคอมมิตเอกสารและการเพิ่มการทดสอบ
รายงานปัญหาตามที่อธิบายไว้ข้างต้น และหากเป็นไปได้ ให้อัปโหลดการเปลี่ยนแปลงเพื่อแก้ไขปัญหา ในกรณีต่อไปนี้
- การทดสอบไม่ผ่านในทรีเคอร์เนลทั่วไป
- คุณ พบคอมมิตที่จำเป็นซึ่งไม่ได้กล่าวถึงในความคิดเห็นของแหล่งที่มา
- การทำให้การทดสอบผ่านในเคอร์เนลต้นทางต้องมีการเปลี่ยนแปลงที่สำคัญ
- คุณเชื่อว่าการทดสอบนั้นเจาะจงมากเกินไป หรือการทดสอบล้มเหลวในเคอร์เนลในอนาคต
- คุณต้องการเพิ่มการทดสอบหรือเพิ่มความครอบคลุมในการทดสอบที่มีอยู่