ตั้งแต่ Android 5.0 การทำงานที่เหมาะสมของสแต็กเครือข่าย Android บนเคอร์เนล Linux จำเป็นต้องมีคอมมิตจำนวนหนึ่งที่มีการอัปสตรีมเมื่อไม่นานมานี้หรือยังไม่ได้ทำการอัปสตรีม การตรวจสอบฟังก์ชันเคอร์เนลที่จำเป็นด้วยตนเองหรือติดตามคอมมิตที่ขาดหายไปไม่ใช่เรื่องง่าย ดังนั้นทีม Android จึงแชร์การทดสอบที่ใช้เพื่อให้แน่ใจว่าเคอร์เนลทำงานตามที่คาดไว้
ทำไมต้องทำการทดสอบ?
การทดสอบเหล่านี้เกิดขึ้นจากสาเหตุหลักสามประการ:
- โดยทั่วไปแล้วเวอร์ชันที่แน่นอนของเคอร์เนล Linux ที่ใช้บนอุปกรณ์จะเป็นเวอร์ชันเฉพาะของอุปกรณ์ และเป็นการยากที่จะทราบว่าเคอร์เนลใดทำงานได้อย่างถูกต้องโดยไม่ต้องทำการทดสอบ
- การส่งต่อพอร์ตและพอร์ตด้านหลังแพตช์เคอร์เนลไปยังเวอร์ชันเคอร์เนลที่แตกต่างกันหรือแผนผังอุปกรณ์ที่แตกต่างกันอาจทำให้เกิดปัญหาเล็กๆ น้อยๆ ที่ไม่สามารถมองเห็นได้หากไม่ทำการทดสอบ
- คุณสมบัติเครือข่ายใหม่อาจต้องใช้ฟังก์ชันเคอร์เนลใหม่หรือการแก้ไขข้อบกพร่องของเคอร์เนล
หากการทดสอบไม่ผ่าน กลุ่มเครือข่ายของอุปกรณ์จะทำงานไม่ถูกต้อง ทำให้เกิดข้อบกพร่องในการเชื่อมต่อที่ผู้ใช้มองเห็นได้ (เช่น เครือข่าย Wi-Fi หลุด) อุปกรณ์มีแนวโน้มที่จะไม่ผ่านการทดสอบชุดทดสอบความเข้ากันได้ของ Android (CTS)
การใช้การทดสอบ
การทดสอบใช้ User-Mode Linux เพื่อบู๊ตเคอร์เนลเป็นกระบวนการบนเครื่องโฮสต์ Linux โปรดดู การสร้างสภาพแวดล้อม Build สำหรับเวอร์ชันระบบปฏิบัติการที่เหมาะสม เฟรมเวิร์กการทดสอบหน่วยจะบู๊ตเคอร์เนลด้วยดิสก์อิมเมจที่เหมาะสม และรันการทดสอบจากระบบไฟล์โฮสต์ การทดสอบเขียนด้วยภาษา Python และใช้อินเทอร์เฟซ TAP เพื่อฝึกพฤติกรรมเคอร์เนลและซ็อกเก็ต 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
การจัดทำเอกสารการกระทำและเพิ่มการทดสอบ
โปรดรายงานปัญหาตามที่อธิบายไว้ข้างต้น และหากเป็นไปได้ให้อัปโหลดการเปลี่ยนแปลงเพื่อแก้ไขปัญหา หาก:
- การทดสอบไม่ผ่านเคอร์เนลทรีทั่วไป
- คุณพบการกระทำที่จำเป็นที่ไม่ได้กล่าวถึงในความคิดเห็นของแหล่งที่มา
- การทดสอบเพื่อส่งต่อเคอร์เนลอัปสตรีมจำเป็นต้องมีการเปลี่ยนแปลงครั้งใหญ่
- คุณเชื่อว่าการทดสอบมีการระบุมากเกินไป หรือการทดสอบล้มเหลวกับเคอร์เนลในอนาคต
- คุณต้องการเพิ่มการทดสอบเพิ่มเติมหรือความครอบคลุมเพิ่มเติมให้กับการทดสอบที่มีอยู่