ไฟล์ .dex เป็นรูปแบบการขนส่งสําหรับไบต์โค้ด Dalvik ไฟล์ต้องมีข้อจำกัดทางไวยากรณ์และความหมายบางอย่างจึงจะเป็นไฟล์ .dex ที่ถูกต้องได้ และรันไทม์ต้องรองรับเฉพาะไฟล์ .dex ที่ถูกต้องเท่านั้น
ข้อจำกัดทั่วไปเกี่ยวกับความสมบูรณ์ของ .dex
ข้อจำกัดความสมบูรณ์ทั่วไปเกี่ยวข้องกับโครงสร้างที่ใหญ่ขึ้นของไฟล์ .dex ตามที่อธิบายไว้อย่างละเอียดใน.dex
| ตัวระบุ | คำอธิบาย | 
|---|---|
| G1 | หมายเลข magicของไฟล์.dexต้องเท่ากับdex\n035\0สำหรับเวอร์ชัน 35 หรือคล้ายกันสำหรับเวอร์ชันที่ใหม่กว่า | 
| G2 | Checksum ต้องเป็น checksum ของ Adler-32 สำหรับเนื้อหาทั้งหมดของไฟล์ ยกเว้นช่อง magicและchecksum | 
| G3 | ลายเซ็นต้องเป็นแฮช SHA-1 ของเนื้อหาไฟล์ทั้งหมด ยกเว้น magic,checksumและsignature | 
| G4 | 
 
 | 
| G5 | 
 
 | 
| G6 | endian_tagต้องมีค่าเป็นENDIAN_CONSTANTหรือREVERSE_ENDIAN_CONSTANT | 
| G7 | สำหรับแต่ละส่วน  
            ฟิลด์  | 
| G8 | ช่องออฟเซตทั้งหมดในส่วนหัวยกเว้น map_offต้องจัดแนว 4 ไบต์ | 
| G9 | ช่อง map_offต้องเป็น 0 หรือชี้ไปยังส่วนข้อมูล ในกรณีหลัง ส่วนdataต้องมีอยู่ | 
| G10 | ส่วน link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsและdataต้องไม่ทับซ้อนกันหรือทับส่วนหัว | 
| G11 | หากมีแผนที่ รายการแผนที่แต่ละรายการต้องมีประเภทที่ถูกต้อง แต่ละประเภทจะปรากฏได้สูงสุด 1 ครั้ง | 
| G12 | หากมีแผนที่ รายการแผนที่แต่ละรายการต้องมีออฟเซตและขนาดที่ไม่ใช่ 0 ส่วนออฟเซตต้องชี้ไปยังส่วนที่เกี่ยวข้องของไฟล์ (เช่น string_id_itemต้องชี้ไปยังส่วนstring_ids) และขนาดที่ชัดเจนหรือไม่ชัดเจนของรายการต้องตรงกับเนื้อหาและขนาดจริงของส่วน | 
| G13 | หากมีแผนที่อยู่ ออฟเซ็ตของรายการแผนที่ n+1ต้องมากกว่าหรือเท่ากับออฟเซ็ตของรายการแผนที่n plus than size of map entry nซึ่งหมายความว่ารายการจะไม่ทับซ้อนกันและเรียงจากต่ำไปสูง | 
| G14 | รายการประเภทต่อไปนี้ต้องมีออฟเซตที่สอดคล้องกับการจํานวน 4 ไบต์ string_id_item,type_id_item,proto_id_item,field_id_item,method_id_item,class_def_item,type_list,code_item,annotations_directory_item | 
| G15 | สําหรับ  สําหรับ   สำหรับ  | 
| G16 | สําหรับ type_id_itemแต่ละรายการ ช่องdescriptor_idxต้องมีข้อมูลอ้างอิงที่ถูกต้องไปยังรายการstring_idsสตริงที่อ้างอิงต้องเป็นตัวบ่งชี้ประเภทที่ถูกต้อง | 
| G17 | สําหรับ proto_id_itemแต่ละรายการ ช่องshorty_idxต้องมีข้อมูลอ้างอิงที่ถูกต้องไปยังรายการstring_idsสตริงที่อ้างอิงต้องเป็นตัวบ่งชี้ Shorty ที่ถูกต้อง นอกจากนี้ ฟิลด์return_type_idxต้องเป็นดัชนีที่ถูกต้องในส่วนtype_idsและฟิลด์parameters_offต้องเป็น 0 หรือออฟเซตที่ถูกต้องซึ่งชี้ไปยังส่วนdataหากไม่ใช่ 0 รายการพารามิเตอร์ต้องไม่มีรายการที่ว่างเปล่า | 
| G18 | สําหรับ field_id_itemแต่ละรายการ ทั้งช่องclass_idxและtype_idxต้องเป็นดัชนีที่ถูกต้องในรายการtype_idsรายการที่class_idxอ้างอิงต้องเป็นประเภทข้อมูลอ้างอิงแบบไม่ใช่อาร์เรย์ นอกจากนี้ ช่องname_idxต้องเป็นข้อมูลอ้างอิงที่ถูกต้องในส่วนstring_idsและเนื้อหาของรายการที่อ้างอิงต้องเป็นไปตามข้อกำหนดของMemberName | 
| G19 | สําหรับ method_id_itemแต่ละรายการ ช่องclass_idxต้องเป็นดัชนีที่ถูกต้องในส่วนtype_idsและรายการที่อ้างอิงต้องเป็นประเภทการอ้างอิงแบบไม่ใช่อาร์เรย์ ช่องproto_idต้องเป็นข้อมูลอ้างอิงที่ถูกต้องในรายการproto_idsช่องname_idxต้องเป็นข้อมูลอ้างอิงที่ถูกต้องในส่วนstring_idsและเนื้อหาของรายการที่อ้างอิงต้องเป็นไปตามข้อกำหนดของMemberName | 
| G20 | สําหรับ field_id_itemแต่ละรายการ ช่องclass_idxต้องเป็นดัชนีที่ถูกต้องในรายการtype_idsรายการที่อ้างอิงต้องเป็นประเภทข้อมูลอ้างอิงแบบไม่ใช่อาร์เรย์ | 
ข้อจำกัดของไบต์โค้ดแบบคงที่
ข้อจำกัดแบบคงที่คือข้อจำกัดขององค์ประกอบแต่ละรายการของไบต์โค้ด โดยปกติแล้ว การตรวจสอบจะดำเนินการได้โดยไม่ต้องใช้เทคนิคการควบคุมหรือการวิเคราะห์การไหลของข้อมูล
| ตัวระบุ | คำอธิบาย | 
|---|---|
| A1 | ต้องระบุอาร์เรย์ insns | 
| A2 | ออปโค้ดแรกในอาร์เรย์ insnsต้องมีดัชนีเป็น 0 | 
| A3 | อาร์เรย์ insnsต้องมีเฉพาะอ็อปโค้ด Dalvik ที่ถูกต้องเท่านั้น | 
| A4 | ดัชนีของคำสั่ง n+1ต้องเท่ากับดัชนีของคำสั่งnบวกความยาวของคำสั่งnโดยพิจารณาจากโอเปอเรนด์ที่เป็นไปได้ | 
| A5 | คำสั่งสุดท้ายในอาร์เรย์ insnsต้องสิ้นสุดที่ดัชนีinsns_size-1 | 
| A6 | เป้าหมาย gotoและif-<kind>ทั้งหมดต้องเป็นออปโค้ดภายในเมธอดเดียวกัน | 
| A7 | เป้าหมายทั้งหมดของคำสั่ง packed-switchต้องเป็นออปโค้ดภายในเมธอดเดียวกัน ขนาดและรายการเป้าหมายต้องสอดคล้องกัน | 
| A8 | เป้าหมายทั้งหมดของคำสั่ง sparse-switchต้องเป็นออปโค้ดภายในเมธอดเดียวกัน ตารางที่เกี่ยวข้องต้องสอดคล้องกันและจัดเรียงจากต่ำไปสูง | 
| A9 | ออบเจ็กต์ Bของคำสั่งconst-stringและconst-string/jumboต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่สตริง | 
| A10 | ออบเจ็กต์ Cของคำสั่งiget<kind>และiput<kind>ต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่ของฟิลด์ รายการที่อ้างอิงต้องแสดงถึงฟิลด์อินสแตนซ์ | 
| A11 | ออบเจ็กต์ Cของคำสั่งsget<kind>และsput<kind>ต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่ของฟิลด์ รายการที่อ้างอิงต้องแสดงฟิลด์แบบคงที่ | 
| A12 | ออบเจ็กต์ Cของคำสั่งinvoke-virtual,invoke-super,invoke-directและinvoke-staticต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่ของเมธอด | 
| A13 | ออบเจ็กต์ Bของคำสั่งinvoke-virtual/range,invoke-super/range,invoke-direct/rangeและinvoke-static/rangeต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่ของเมธอด | 
| A14 | เมธอดที่มีชื่อขึ้นต้นด้วย "<" ต้องเรียกใช้โดย VM โดยนัยเท่านั้น ไม่ใช่โดยโค้ดที่มาจากไฟล์ .dexข้อยกเว้นเพียงอย่างเดียวคือตัวเริ่มต้นอินสแตนซ์ ซึ่งinvoke-directอาจเรียกใช้ | 
| A15 | ออบเจ็กต์ Cของคำสั่งinvoke-interfaceต้องเป็นตัวบ่งชี้ที่ถูกต้องในพูลค่าคงที่ของเมธอดmethod_idที่อ้างอิงต้องอยู่ในอินเทอร์เฟซ (ไม่ใช่คลาส) | 
| A16 | ออบเจ็กต์ Bของคำสั่งinvoke-interface/rangeต้องเป็นตัวบ่งชี้ที่ถูกต้องในพูลค่าคงที่ของเมธอดmethod_idที่อ้างอิงต้องอยู่ในอินเทอร์เฟซ (ไม่ใช่คลาส) | 
| A17 | ออบเจ็กต์ Bของคำสั่งconst-class,check-cast,new-instanceและfilled-new-array/rangeต้องเป็นดัชนีที่ถูกต้องในพูลค่าคงที่ประเภท | 
| A18 | ออบเจ็กต์ Cของคำสั่งinstance-of,new-arrayและfilled-new-arrayต้องเป็นตัวบ่งชี้ที่ถูกต้องในพูลค่าคงที่ของประเภท | 
| A19 | มิติของอาร์เรย์ที่สร้างโดยคำสั่ง new-arrayต้องน้อยกว่า256 | 
| A20 | คำสั่ง newต้องไม่อ้างอิงคลาสอาร์เรย์ อินเทอร์เฟซ หรือคลาสนามธรรม | 
| A21 | ประเภทที่คำสั่ง new-arrayอ้างอิงต้องเป็นประเภทที่ถูกต้องซึ่งไม่ใช่ประเภทข้อมูลอ้างอิง | 
| A22 | รีจิสเตอร์ทั้งหมดที่คำสั่งอ้างอิงในรูปแบบความกว้างเดียว (ไม่ใช่คู่) ต้องถูกต้องสำหรับเมธอดปัจจุบัน กล่าวคือ ดัชนีต้องไม่ติดลบและน้อยกว่า registers_size | 
| A23 | รีจิสเตอร์ทั้งหมดที่คำสั่งอ้างอิงในรูปแบบความกว้าง 2 เท่า (คู่) ต้องถูกต้องสำหรับเมธอดปัจจุบัน กล่าวคือ ดัชนีของรายการต้องไม่ติดลบและน้อยกว่า registers_size-1 | 
| A24 | ออบเจ็กต์ method_idของคำสั่งinvoke-virtualและinvoke-directต้องอยู่ในคลาส (ไม่ใช่อินเทอร์เฟซ) ในไฟล์ Dex ก่อนเวอร์ชัน037ต้องดำเนินการเดียวกันกับคำสั่งinvoke-superและinvoke-static | 
| A25 | ออบเจ็กต์ method_idของคำสั่งinvoke-virtual/rangeและinvoke-direct/rangeต้องอยู่ในคลาส (ไม่ใช่อินเทอร์เฟซ) ในไฟล์ Dex ก่อนเวอร์ชัน037ต้องดำเนินการเดียวกันกับคำสั่งinvoke-super/rangeและinvoke-static/range | 
ข้อจำกัดของโครงสร้างไบต์โค้ด
ข้อจำกัดด้านโครงสร้างคือข้อจำกัดเกี่ยวกับความสัมพันธ์ระหว่างองค์ประกอบหลายอย่างของไบต์โค้ด โดยปกติแล้ว การตรวจสอบจะไม่สามารถทำได้หากไม่มีการใช้เทคนิคการควบคุมหรือการวิเคราะห์การไหลของข้อมูล
| ตัวระบุ | คำอธิบาย | 
|---|---|
| B1 | จำนวนและประเภทของอาร์กิวเมนต์ (รีจิสเตอร์และค่าทันที) ต้องตรงกับคำสั่งเสมอ | 
| B2 | คู่ที่ลงทะเบียนต้องไม่แยกออกจากกัน | 
| B3 | คุณต้องกำหนดรีจิสทอร์ (หรือคู่) ก่อนจึงจะอ่านได้ | 
| B4 | คำสั่ง invoke-directต้องเรียกใช้ตัวเริ่มต้นอินสแตนซ์หรือเมธอดในคลาสปัจจุบันหรือซุปเปอร์คลาสของคลาสนั้นเท่านั้น | 
| B5 | คุณต้องเรียกใช้ตัวเริ่มต้นอินสแตนซ์ในอินสแตนซ์ที่ยังไม่ได้เริ่มต้นเท่านั้น | 
| วิตามินบี 6 | เรียกใช้เมธอดอินสแตนซ์ได้เฉพาะในอินสแตนซ์ที่เริ่มต้นแล้ว และเข้าถึงฟิลด์อินสแตนซ์ได้เฉพาะในอินสแตนซ์ที่เริ่มต้นแล้ว | 
| B7 | ต้องไม่ใช้รีจิสเตอร์ที่มีผลลัพธ์ของคำสั่ง new-instanceหากมีการดำเนินการคำสั่งnew-instanceเดียวกันอีกครั้งก่อนที่จะเริ่มต้นอินสแตนซ์ | 
| B8 | ตัวเริ่มต้นอินสแตนซ์ต้องเรียกตัวเริ่มต้นอินสแตนซ์อื่น (คลาสหรือซุปเปอร์คลาสเดียวกัน) ก่อนจึงจะเข้าถึงสมาชิกอินสแตนซ์ได้
           ข้อยกเว้นคือช่องอินสแตนซ์ที่ไม่ได้รับช่วงมา ซึ่งสามารถกําหนดค่าได้ก่อนเรียกตัวเริ่มต้นอื่น และโดยทั่วไปแล้วคลาส Object | 
| B9 | อาร์กิวเมนต์จริงของเมธอดทั้งหมดต้องเข้ากันได้กับการกําหนดค่ากับอาร์กิวเมนต์อย่างเป็นทางการที่เกี่ยวข้อง | 
| บีเท็น | สำหรับการเรียกใช้เมธอดอินสแตนซ์แต่ละครั้ง อินสแตนซ์จริงต้องเข้ากันได้กับการกำหนดค่าของคลาสหรืออินเทอร์เฟซที่ระบุไว้ในวิธีการ | 
| B11 | คำสั่ง return<kind>ต้องตรงกับประเภทผลลัพธ์ของเมธอด | 
| วิตามินบี 12 | เมื่อเข้าถึงสมาชิกที่ได้รับการปกป้องของซุปเปอร์คลาส ประเภทจริงของอินสแตนซ์ที่เข้าถึงต้องเป็นคลาสปัจจุบันหรือคลาสย่อยคลาสใดคลาสหนึ่งของซุปเปอร์คลาสนั้น | 
| B13 | ประเภทของค่าที่เก็บไว้ในช่องแบบคงที่ต้องเข้ากันได้กับการกำหนดหรือแปลงเป็นประเภทของช่องได้ | 
| B14 | ประเภทของค่าที่จัดเก็บไว้ในช่องต้องเข้ากันได้กับการกำหนดหรือแปลงเป็นประเภทของช่องได้ | 
| B15 | ประเภทของค่าทุกค่าที่จัดเก็บไว้ในอาร์เรย์ต้องเข้ากันได้กับประเภทคอมโพเนนต์ของอาร์เรย์ | 
| B16 | ออบเจ็กต์ Aของคำสั่งthrowต้องเข้ากันได้กับjava.lang.Throwableในแง่ของการกําหนดค่า | 
| B17 | คำสั่งสุดท้ายที่เข้าถึงได้ของเมธอดต้องเป็นคำสั่ง gotoย้อนกลับหรือสาขา,returnหรือthrowจะต้องไม่สามารถออกจากอาร์เรย์insnsที่ด้านล่าง | 
| B18 | ระบบจะไม่อ่านครึ่งหนึ่งของคู่รีจิสเตอร์เดิมที่ไม่ได้กำหนด (ถือว่าไม่ถูกต้อง) จนกว่าจะมีการกำหนดใหม่โดยคำสั่งอื่น | 
| B19 | คําสั่ง move-result<kind>ต้องอยู่ต่อจาก (ในอาร์เรย์insns) คําสั่งinvoke-<kind>ทันที ข้อยกเว้นเพียงอย่างเดียวคือคำสั่งmove-result-objectซึ่งอาจมีคำสั่งfilled-new-arrayนำหน้าด้วย | 
| B20 | คำสั่ง move-result<kind>ต้องอยู่ต่อจาก (ในโฟลว์การควบคุมจริง) คำสั่งreturn-<kind>ที่ตรงกันโดยทันที (ต้องไม่มีการข้ามไป) ข้อยกเว้นเพียงอย่างเดียวคือคำสั่งmove-result-objectซึ่งอาจมีคำสั่งfilled-new-arrayอยู่ก่อนหน้า | 
| B21 | คําสั่ง move-exceptionต้องปรากฏเป็นคําสั่งแรกในตัวแฮนเดิลข้อยกเว้นเท่านั้น | 
| B22 | การควบคุมโฟลว์ต้องเข้าถึงคำสั่งจำลอง packed-switch-data,sparse-switch-dataและfill-array-dataไม่ได้ | 
