Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.
Общие ограничения целостности .dex
 Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .
| Идентификатор | Описание | 
|---|---|
| Г1 | magicномер файла.dexдолжен бытьdex\n035\0для версии 35 или аналогичный для более поздних версий. | 
| G2 | Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magicполя и поляchecksum. | 
| G3 | Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic,checksumиsignature. | 
| G4 |     | 
| G5 |     | 
| G6 | endian_tagдолжен иметь значениеENDIAN_CONSTANTилиREVERSE_ENDIAN_CONSTANT | 
| G7 |  Для каждой из разделов   Поля  | 
| G8 | Все поля смещения в заголовке, кроме map_off, должны быть выровнены по четырем байтам. | 
| G9 | Поле map_offдолжно быть либо нулевым, либо указывать на раздел данных. В последнем случае разделdataдолжен существовать. | 
| G10 | Ни одна из link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsи разделовdataне должна перекрывать друг друга или заголовок. | 
| G11 | Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза. | 
| G12 | Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_itemдолжно указывать на разделstring_ids), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела. | 
| G13 | Если карта существует, то смещение записи карты n+1должно быть больше или равно смещению записи картыn plus than size of map entry n. Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому. | 
| G14 | Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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. Ссылочная строка должна быть допустимым коротким дескриптором. Кроме того, полеreturn_type_idxдолжно быть допустимым индексом в разделеtype_ids, а полеparameters_offдолжно быть либо нулевым, либо действительным смещением, указывающим на разделdata. Если значение не равно нулю, список параметров не должен содержать пустых записей. | 
| 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. Ссылочная запись не должна быть ссылочным типом, отличным от массива. | 
Статические ограничения байт-кода
Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.
| Идентификатор | Описание | 
|---|---|
| А1 | Массив insnsне должен быть пустым. | 
| А2 | Первый код операции в массиве insnsдолжен иметь нулевой индекс. | 
| А3 | Массив insnsдолжен содержать только допустимые коды операций Dalvik. | 
| А4 | Индекс инструкции n+1должен равняться индексу инструкцииnплюс длине инструкцииnс учетом возможных операндов. | 
| А5 | Последняя инструкция в массиве insnsдолжна заканчиваться индексомinsns_size-1. | 
| А6 | Все цели gotoиif-<kind>должны быть кодами операций одного и того же метода. | 
| А7 | Все цели инструкции packed-switchдолжны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными. | 
| А8 | Все цели инструкции sparse-switchдолжны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию. | 
| А9 | Операнд Bинструкцийconst-stringиconst-string/jumboдолжен быть допустимым индексом в пуле строковых констант. | 
| А10 | Операнд Cинструкцийiget<kind>иiput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра. | 
| А11 | Операнд Cинструкцийsget<kind>иsput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле. | 
| А12 | Операнд Cинструкцийinvoke-virtual,invoke-super,invoke-directиinvoke-staticдолжен быть допустимым индексом в пуле констант метода. | 
| А13 | Операнд Bинструкцийinvoke-virtual/range,invoke-super/range,invoke-direct/rangeиinvoke-static/rangeдолжен быть допустимым индексом в пуле констант метода. | 
| А14 | Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex. Единственным исключением является инициализатор экземпляра, который можно вызвать с помощьюinvoke-direct. | 
| А15 | Операнд Cинструкцииinvoke-interfaceдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А16 | Операнд Bинструкцииinvoke-interface/rangeдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А17 | Операнд Bинструкцийconst-class,check-cast,new-instanceиfilled-new-array/rangeдолжен быть допустимым индексом в пуле констант типа. | 
| А18 | Операнд Cинструкцийinstance-of,new-arrayиfilled-new-arrayдолжен быть допустимым индексом в пуле констант типа. | 
| А19 | Размеры массива, созданного командой создания new-arrayдолжны быть меньше256. | 
| А20 | newинструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы. | 
| А21 | Тип, на который ссылается инструкция создания new-arrayдолжен быть допустимым, не ссылочным типом. | 
| А22 | Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size. | 
| А23 | Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1. | 
| А24 | Операнд method_idинструкцийinvoke-virtualиinvoke-directдолжен принадлежать классу (а не интерфейсу). В файлах Dex до версии037то же самое должно быть справедливо для инструкцийinvoke-superиinvoke-static. | 
| А25 | Операнд method_idинструкцийinvoke-virtual/rangeиinvoke-direct/rangeдолжен принадлежать классу (а не интерфейсу). В файлах Dex до версии037то же самое должно быть справедливо для инструкцийinvoke-super/rangeиinvoke-static/range. | 
Структурные ограничения байт-кода
Структурные ограничения — это ограничения на отношения между несколькими элементами байт-кода. Обычно их невозможно проверить без использования методов контроля или анализа потока данных.
| Идентификатор | Описание | 
|---|---|
| Б1 | Количество и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции. | 
| Б2 | Пары регистров никогда не должны разбиваться. | 
| Б3 | Регистр (или пара) должен быть назначен первым, прежде чем его можно будет прочитать. | 
| Б4 | Инструкция invoke-directдолжна вызывать инициализатор экземпляра или метод только в текущем классе или одном из его суперклассов. | 
| Б5 | Инициализатор экземпляра должен вызываться только для неинициализированного экземпляра. | 
| Б6 | Методы экземпляра можно вызывать только в экземплярах, а поля экземпляра доступны только в уже инициализированных экземплярах. | 
| Б7 | Регистр, содержащий результат команды new-instance, не должен использоваться, если та же самая инструкцияnew-instanceснова выполняется до инициализации экземпляра. | 
| Б8 | Инициализатор экземпляра должен вызвать другой инициализатор экземпляра (того же класса или суперкласса), прежде чем можно будет получить доступ к каким-либо членам экземпляра. Исключениями являются ненаследуемые поля экземпляра, которые можно назначить перед вызовом другого инициализатора, а также класс Objectв целом. | 
| Б9 | Все фактические аргументы метода должны быть совместимы по присваиванию с соответствующими формальными аргументами. | 
| Б10 | Для каждого вызова метода экземпляра фактический экземпляр должен быть совместим по назначению с классом или интерфейсом, указанным в инструкции. | 
| Б11 | Инструкция return<kind>должна соответствовать типу возвращаемого значения своего метода. | 
| Б12 | При доступе к защищенным членам суперкласса фактический тип экземпляра, к которому осуществляется доступ, должен быть либо текущим классом, либо одним из его подклассов. | 
| Б13 | Тип значения, хранящегося в статическом поле, должен быть совместимым по присваиванию или конвертируемым в тип поля. | 
| Б14 | Тип значения, хранящегося в поле, должен быть совместимым по присваиванию или конвертируемым в тип поля. | 
| Б15 | Тип каждого значения, хранящегося в массиве, должен быть совместим по присваиванию с типом компонента массива. | 
| Б16 | Операнд Aинструкцииthrowдолжен быть совместим по назначению сjava.lang.Throwable. | 
| Б17 | Последняя достижимая инструкция метода должна быть либо инструкцией обратного gotoили перехода, либо инструкциейreturn, либо инструкциейthrow. Не должно быть возможности оставить массивinsnsвнизу. | 
| Б18 | Неназначенная половина бывшей пары регистров не может быть прочитана (считается недействительной) до тех пор, пока она не будет переназначена какой-либо другой инструкцией. | 
| Б19 | Инструкции move-result<kind>должна предшествовать (в массивеinsns) инструкцияinvoke-<kind>. Единственным исключением является инструкцияmove-result-object, которой также может предшествовать инструкцияfilled-new-array. | 
| Б20 | Инструкции move-result<kind>должна предшествовать (в фактическом потоке управления) соответствующая инструкцияreturn-<kind>(к ней нельзя переходить). Единственным исключением является инструкцияmove-result-object, которой также может предшествовать инструкцияfilled-new-array. | 
| Б21 | Инструкция move-exceptionдолжна появляться только в качестве первой инструкции в обработчике исключений. | 
| Б22 | Псевдоинструкции packed-switch-data,sparse-switch-dataиfill-array-dataне должны быть доступны для потока управления. | 
 Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.
Общие ограничения целостности .dex
 Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .
| Идентификатор | Описание | 
|---|---|
| Г1 | magicномер файла.dexдолжен бытьdex\n035\0для версии 35 или аналогичный для более поздних версий. | 
| G2 | Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magicполя и поляchecksum. | 
| G3 | Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic,checksumиsignature. | 
| G4 |     | 
| G5 |     | 
| G6 | endian_tagдолжен иметь значениеENDIAN_CONSTANTилиREVERSE_ENDIAN_CONSTANT | 
| G7 |  Для каждой из разделов   Поля  | 
| G8 | Все поля смещения в заголовке, кроме map_off, должны быть выровнены по четырем байтам. | 
| G9 | Поле map_offдолжно быть либо нулевым, либо указывать на раздел данных. В последнем случае разделdataдолжен существовать. | 
| G10 | Ни одна из link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsи разделовdataне должна перекрывать друг друга или заголовок. | 
| G11 | Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза. | 
| G12 | Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_itemдолжно указывать на разделstring_ids), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела. | 
| G13 | Если карта существует, то смещение записи карты n+1должно быть больше или равно смещению записи картыn plus than size of map entry n. Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому. | 
| G14 | Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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. Ссылочная строка должна быть допустимым коротким дескриптором. Кроме того, полеreturn_type_idxдолжно быть допустимым индексом в разделеtype_ids, а полеparameters_offдолжно быть либо нулевым, либо действительным смещением, указывающим на разделdata. Если значение не равно нулю, список параметров не должен содержать пустых записей. | 
| 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. Ссылочная запись не должна быть ссылочным типом, отличным от массива. | 
Статические ограничения байт-кода
Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.
| Идентификатор | Описание | 
|---|---|
| А1 | Массив insnsне должен быть пустым. | 
| А2 | Первый код операции в массиве insnsдолжен иметь нулевой индекс. | 
| А3 | Массив insnsдолжен содержать только допустимые коды операций Dalvik. | 
| А4 | Индекс инструкции n+1должен равняться индексу инструкцииnплюс длине инструкцииnс учетом возможных операндов. | 
| А5 | Последняя инструкция в массиве insnsдолжна заканчиваться индексомinsns_size-1. | 
| А6 | Все цели gotoиif-<kind>должны быть кодами операций одного и того же метода. | 
| А7 | Все цели инструкции packed-switchдолжны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными. | 
| А8 | Все цели инструкции sparse-switchдолжны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию. | 
| А9 | Операнд Bинструкцийconst-stringиconst-string/jumboдолжен быть допустимым индексом в пуле строковых констант. | 
| А10 | Операнд Cинструкцийiget<kind>иiput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра. | 
| А11 | Операнд Cинструкцийsget<kind>иsput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле. | 
| А12 | Операнд Cинструкцийinvoke-virtual,invoke-super,invoke-directиinvoke-staticдолжен быть допустимым индексом в пуле констант метода. | 
| А13 | Операнд Bинструкцийinvoke-virtual/range,invoke-super/range,invoke-direct/rangeиinvoke-static/rangeдолжен быть допустимым индексом в пуле констант метода. | 
| А14 | Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex. Единственным исключением является инициализатор экземпляра, который можно вызвать с помощьюinvoke-direct. | 
| А15 | Операнд Cинструкцииinvoke-interfaceдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А16 | Операнд Bинструкцииinvoke-interface/rangeдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А17 | Операнд Bинструкцийconst-class,check-cast,new-instanceиfilled-new-array/rangeдолжен быть допустимым индексом в пуле констант типа. | 
| А18 | Операнд Cинструкцийinstance-of,new-arrayиfilled-new-arrayдолжен быть допустимым индексом в пуле констант типа. | 
| А19 | Размеры массива, созданного командой создания new-arrayдолжны быть меньше256. | 
| А20 | newинструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы. | 
| А21 | Тип, на который ссылается инструкция создания new-arrayдолжен быть допустимым, не ссылочным типом. | 
| А22 | Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size. | 
| А23 | Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1. | 
| А24 | Операнд method_idинструкцийinvoke-virtualиinvoke-directдолжен принадлежать классу (а не интерфейсу). В файлах Dex до версии037то же самое должно быть справедливо для инструкцийinvoke-superиinvoke-static. | 
| А25 | Операнд method_idинструкцийinvoke-virtual/rangeиinvoke-direct/rangeдолжен принадлежать классу (а не интерфейсу). В файлах Dex до версии037то же самое должно быть справедливо для инструкцийinvoke-super/rangeиinvoke-static/range. | 
Структурные ограничения байт-кода
Структурные ограничения — это ограничения на отношения между несколькими элементами байт-кода. Обычно их невозможно проверить без использования методов контроля или анализа потока данных.
| Идентификатор | Описание | 
|---|---|
| Б1 | Количество и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции. | 
| Б2 | Пары регистров никогда не должны разбиваться. | 
| Б3 | Регистр (или пара) должен быть назначен первым, прежде чем его можно будет прочитать. | 
| Б4 | Инструкция invoke-directдолжна вызывать инициализатор экземпляра или метод только в текущем классе или одном из его суперклассов. | 
| Б5 | Инициализатор экземпляра должен вызываться только для неинициализированного экземпляра. | 
| Б6 | Методы экземпляра можно вызывать только в экземплярах, а поля экземпляра доступны только в уже инициализированных экземплярах. | 
| Б7 | Регистр, содержащий результат команды new-instance, не должен использоваться, если та же самая инструкцияnew-instanceснова выполняется до инициализации экземпляра. | 
| Б8 | Инициализатор экземпляра должен вызвать другой инициализатор экземпляра (того же класса или суперкласса), прежде чем можно будет получить доступ к каким-либо членам экземпляра. Исключениями являются ненаследуемые поля экземпляра, которые можно назначить перед вызовом другого инициализатора, а также класс Objectв целом. | 
| Б9 | Все фактические аргументы метода должны быть совместимы по присваиванию с соответствующими формальными аргументами. | 
| Б10 | Для каждого вызова метода экземпляра фактический экземпляр должен быть совместим по назначению с классом или интерфейсом, указанным в инструкции. | 
| Б11 | Инструкция return<kind>должна соответствовать типу возвращаемого значения своего метода. | 
| Б12 | При доступе к защищенным членам суперкласса фактический тип экземпляра, к которому осуществляется доступ, должен быть либо текущим классом, либо одним из его подклассов. | 
| Б13 | Тип значения, хранящегося в статическом поле, должен быть совместимым по присваиванию или конвертируемым в тип поля. | 
| Б14 | Тип значения, хранящегося в поле, должен быть совместимым по присваиванию или конвертируемым в тип поля. | 
| Б15 | Тип каждого значения, хранящегося в массиве, должен быть совместим по присваиванию с типом компонента массива. | 
| Б16 | Операнд Aинструкцииthrowдолжен быть совместим по назначению сjava.lang.Throwable. | 
| Б17 | Последняя достижимая инструкция метода должна быть либо инструкцией обратного gotoили перехода, либо инструкциейreturn, либо инструкциейthrow. Не должно быть возможности оставить массивinsnsвнизу. | 
| Б18 | Неназначенная половина бывшей пары регистров не может быть прочитана (считается недействительной) до тех пор, пока она не будет переназначена какой-либо другой инструкцией. | 
| Б19 | Инструкции move-result<kind>должна предшествовать (в массивеinsns) инструкцияinvoke-<kind>. Единственным исключением является инструкцияmove-result-object, которой также может предшествовать инструкцияfilled-new-array. | 
| Б20 | Инструкции move-result<kind>должна предшествовать (в фактическом потоке управления) соответствующая инструкцияreturn-<kind>(к ней нельзя переходить). Единственным исключением является инструкцияmove-result-object, которой также может предшествовать инструкцияfilled-new-array. | 
| Б21 | Инструкция move-exceptionдолжна появляться только в качестве первой инструкции в обработчике исключений. | 
| Б22 | Псевдоинструкции packed-switch-data,sparse-switch-dataиfill-array-dataне должны быть доступны для потока управления. | 
 Файл .dex — это транспортный формат для байт-кода Dalvik. Существуют определенные синтаксические и семантические ограничения для того, чтобы файл был допустимым файлом .dex , и среда выполнения должна поддерживать только допустимые файлы .dex.
Общие ограничения целостности .dex
 Общие ограничения целостности касаются более крупной структуры файла .dex , как подробно описано в формате .dex .
| Идентификатор | Описание | 
|---|---|
| Г1 | magicномер файла.dexдолжен бытьdex\n035\0для версии 35 или аналогичный для более поздних версий. | 
| G2 | Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, за исключением magicполя и поляchecksum. | 
| G3 | Подпись должна представлять собой хеш SHA-1 всего содержимого файла, за исключением magic,checksumиsignature. | 
| G4 |     | 
| G5 |     | 
| G6 | endian_tagдолжен иметь значениеENDIAN_CONSTANTилиREVERSE_ENDIAN_CONSTANT | 
| G7 |  Для каждой из разделов   Поля  | 
| G8 | Все поля смещения в заголовке, кроме map_off, должны быть выровнены по четырем байтам. | 
| G9 | Поле map_offдолжно быть либо нулевым, либо указывать на раздел данных. В последнем случае разделdataдолжен существовать. | 
| G10 | Ни одна из link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsи разделовdataне должна перекрывать друг друга или заголовок. | 
| G11 | Если карта существует, каждая запись карты должна иметь допустимый тип. Каждый тип может появиться не более одного раза. | 
| G12 | Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (т. е. string_id_itemдолжно указывать на разделstring_ids), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела. | 
| G13 | Если карта существует, то смещение записи карты n+1должно быть больше или равно смещению записи картыn plus than size of map entry n. Это подразумевает непересекающиеся записи и упорядочение от низкого к высокому. | 
| G14 | Следующие типы записей должны иметь смещение, выровненное по четырем байтам: 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. Ссылочная строка должна быть допустимым коротким дескриптором. Кроме того, полеreturn_type_idxдолжно быть допустимым индексом в разделеtype_ids, а полеparameters_offдолжно быть либо нулевым, либо действительным смещением, указывающим на разделdata. Если значение не равно нулю, список параметров не должен содержать пустых записей. | 
| 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. Ссылочная запись не должна быть ссылочным типом, отличным от массива. | 
Статические ограничения байт-кода
Статические ограничения — это ограничения на отдельные элементы байт-кода. Обычно их можно проверить без использования методов контроля или анализа потока данных.
| Идентификатор | Описание | 
|---|---|
| А1 | Массив insnsне должен быть пустым. | 
| А2 | Первый код операции в массиве insnsдолжен иметь нулевой индекс. | 
| А3 | Массив insnsдолжен содержать только допустимые коды операций Dalvik. | 
| А4 | Индекс инструкции n+1должен равняться индексу инструкцииnплюс длине инструкцииnс учетом возможных операндов. | 
| А5 | Последняя инструкция в массиве insnsдолжна заканчиваться индексомinsns_size-1. | 
| А6 | Все цели gotoиif-<kind>должны быть кодами операций одного и того же метода. | 
| А7 | Все цели инструкции packed-switchдолжны быть кодами операций одного и того же метода. Размер и список целей должны быть последовательными. | 
| А8 | Все цели инструкции sparse-switchдолжны быть кодами операций одного и того же метода. Соответствующая таблица должна быть последовательной и отсортированной по возрастанию. | 
| А9 | Операнд Bинструкцийconst-stringиconst-string/jumboдолжен быть допустимым индексом в пуле строковых констант. | 
| А10 | Операнд Cинструкцийiget<kind>иiput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять поле экземпляра. | 
| А11 | Операнд Cинструкцийsget<kind>иsput<kind>должен быть допустимым индексом в пуле констант полей. Ссылочная запись должна представлять статическое поле. | 
| А12 | Операнд Cинструкцийinvoke-virtual,invoke-super,invoke-directиinvoke-staticдолжен быть допустимым индексом в пуле констант метода. | 
| А13 | Операнд Bинструкцийinvoke-virtual/range,invoke-super/range,invoke-direct/rangeиinvoke-static/rangeдолжен быть допустимым индексом в пуле констант метода. | 
| А14 | Метод, имя которого начинается с '<', должен вызываться только неявно виртуальной машиной, а не кодом, созданным из файла .dex. Единственным исключением является инициализатор экземпляра, который можно вызвать с помощьюinvoke-direct. | 
| А15 | Операнд Cинструкцииinvoke-interfaceдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А16 | Операнд Bинструкцииinvoke-interface/rangeдолжен быть допустимым индексом в пуле констант метода. Ссылочныйmethod_idдолжен принадлежать интерфейсу (а не классу). | 
| А17 | Операнд Bинструкцийconst-class,check-cast,new-instanceиfilled-new-array/rangeдолжен быть допустимым индексом в пуле констант типа. | 
| А18 | Операнд Cинструкцийinstance-of,new-arrayиfilled-new-arrayдолжен быть допустимым индексом в пуле констант типа. | 
| А19 | Размеры массива, созданного командой создания new-arrayдолжны быть меньше256. | 
| А20 | newинструкция не должна ссылаться на классы массивов, интерфейсы или абстрактные классы. | 
| А21 | Тип, на который ссылается инструкция создания new-arrayдолжен быть допустимым, не ссылочным типом. | 
| А22 | Все регистры, на которые ссылается инструкция одинарной ширины (не парные), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size. | 
| А23 | Все регистры, на которые ссылается инструкция в виде двойной ширины (пары), должны быть допустимы для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size-1. | 
| А24 | 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/rangeTrancs. | 
Структурные ограничения байт -кодов
Структурные ограничения являются ограничениями на отношения между несколькими элементами байт -кода. Они обычно не могут быть проверены без использования контроля или методов анализа данных.
| Идентификатор | Описание | 
|---|---|
| Б1 | Число и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции. | 
| Б2 | Пары регистрации никогда не должны быть разбиты. | 
| B3 | Регистр (или пара) должен быть назначен сначала, прежде чем его можно будет прочитать. | 
| B4 | Инструкция invoke-directдолжна вызвать инициализатор экземпляра или метод только в текущем классе или одном из его суперкладов. | 
| Б5 | Инициализатор экземпляра должен быть вызван только в ненициализованном экземпляре. | 
| Б6 | Методы экземпляра могут быть вызваны только на полях экземпляра, и можно получить доступ только на уже инициализированных экземплярах. | 
| Б7 | Регистр, который содержит результат инструкции new-instanceне должен использоваться, если та жеnew-instanceинструкция снова выполняется до того, как экземпляр будет инициализирован. | 
| Б8 | Инициализатор экземпляра должен вызвать другой экземпляр инициализатора (тот же класс или Superclass), прежде чем можно получить доступ к любому экземпляру. Исключениями являются неудовлетворенные поля экземпляра, которые могут быть назначены перед вызовом другого инициализатора и класса Objectв целом. | 
| Б9 | Все фактические аргументы метода должны соответствовать назначению с их соответствующими формальными аргументами. | 
| Б10 | Для каждого вызова метода экземпляра фактический экземпляр должен быть совместимы с назначением с классом или интерфейсом, указанным в инструкции. | 
| Б11 | Инструкция return<kind>должна соответствовать типу возврата его метода. | 
| Б12 | При доступе к защищенным членам суперкласса фактический тип доступного экземпляра должен быть либо текущим классом, либо одним из его подклассов. | 
| Б13 | Тип значения, хранящегося в статическом поле, должен соответствовать назначению или конвертируемым или конвертируемым с типом поля. | 
| Б14 | Тип значения, хранящегося в поле, должен соответствовать назначению или конвертируемым с типом поля. | 
| Б15 | Тип каждого значения, хранящегося в массиве, должен соответствовать назначению с типом компонента массива. | 
| B16 | Aинструкцииthrowдолжен быть совместимы с заданием сjava.lang.Throwable. | 
| Б17 | Последняя добраемая инструкция метода должна быть либо обратной goto, либо ветвью,returnили инструкциейthrow. Не должно быть возможно оставить массивinsnsвнизу. | 
| B18 | Незначенная половина бывшей пары регистрации не может быть прочитана (считается недействительной) до тех пор, пока она не будет переизведена какой-либо другой инструкцией. | 
| Б19 | Инструкция move-result<kind>должна быть непосредственно предшествующей (в массивеinsns) инструкциейinvoke-<kind>. Единственным исключением является инструкцияmove-result-object, которым также может предшествовать инструкцияfilled-new-array. | 
| Б20 | Инструкция move-result<kind>должна быть непосредственно предшествующей (в фактическом потоке управления) с помощью соответствующей инструкцииreturn-<kind>(она не должна быть подпрыгнута). Единственным исключением является инструкцияmove-result-object, которым также может предшествовать инструкцияfilled-new-array. | 
| B21 | Инструкция move-exceptionдолжна появляться только в качестве первой инструкции в обработчике исключений. | 
| B22 | packed-switch-data,sparse-switch-dataи псевдо-инструктивыfill-array-dataне должны быть достигнуты при потоке управления. | 
 Файл .dex является транспортным форматом для Dalvik Bytecode. Существуют определенные синтаксические и семантические ограничения для файла, который является допустимым файлом .dex , и время выполнения требуется для поддержки только допустимых файлов .dex.
Общие ограничения целостности.
 Общие ограничения целостности связаны с более крупной структурой файла .dex , как подробно описано в .dex format .
| Идентификатор | Описание | 
|---|---|
| Г1 | magicколичество файла.dexдолжно бытьdex\n035\0для версии 35 или аналогично для более поздних версий. | 
| G2 | Контрольная сумма должна быть контрольной суммой Adler-32 всего содержимого файла, кроме поля magicиchecksum. | 
| G3 | Подпись должна быть хэш SHA-1 всего содержимого файла, кроме magic,checksumиsignature. | 
| G4 |     | 
| G5 |     | 
| G6 | endian_tagдолжен иметь либо значение:ENDIAN_CONSTANTилиREVERSE_ENDIAN_CONSTANT | 
| G7 |  Для каждой из   Поля  | 
| G8 | Все поля смещения в заголовке, кроме map_off, должны быть с четырьмя байтами. | 
| G9 | Поле map_offдолжно быть либо ноль, либо указывать в раздел данных. В последнем случае должен существовать разделdata. | 
| G10 | Ни одна из link,string_ids,type_ids,proto_ids,field_ids,method_ids,class_defsи разделовdataдолжны перекрывать друг друга или заголовок. | 
| G11 | Если карта существует, то каждая запись карты должна иметь допустимый тип. Каждый тип может появляться не более одного раза. | 
| G12 | Если карта существует, то каждая запись карты должна иметь ненулевое смещение и размер. Смещение должно указывать на соответствующий раздел файла (то есть string_id_itemдолжен указывать в разделstring_ids), а явный или неявный размер элемента должен соответствовать фактическому содержимому и размеру раздела. | 
| G13 | Если карта существует, то смещение записи карты n+1должно быть больше или равно смещению записи картыn plus than size of map entry n. Это подразумевает непересекающиеся записи и приказ от низких до высоких. | 
| G14 | Следующие типы записей должны иметь смещение с четырьмя байтами: 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. Ссылка на ссылку должна быть допустимым коротким дескриптором. Кроме того, полеreturn_type_idxдолжен быть действительным индексом в разделеtype_ids, а полеparameters_offдолжно быть либо ноль, либо действительным смещением, указывающим в разделdata. Если ненулевой, список параметров не должен содержать никаких пустовых записей. | 
| 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. Наслаждаемая запись должна быть ссылочным типом, не являющимися арестом. | 
Статические ограничения байт -кодов
Статические ограничения являются ограничениями на отдельные элементы байт -кода. Они обычно могут быть проверены без использования контроля или методов анализа данных.
| Идентификатор | Описание | 
|---|---|
| А1 | Массив insnsне должен быть пустым. | 
| А2 | Первый Opcode в массиве insnsдолжен иметь индекс. | 
| А3 | Массив insnsдолжен содержать только действительные Dalvik Opcodes. | 
| А4 | Индекс инструкции n+1должен равняться индексу инструкцииnплюс продолжительность инструкцииnс учетом возможных операндов. | 
| А5 | Последняя инструкция в массиве insnsдолжна заканчиваться на индексеinsns_size-1. | 
| А6 | Все gotoиif-<kind>должны быть выборы в одном и том же методе. | 
| А7 | Все цели инструкции packed-switchдолжны быть опкомпомированием в пределах одного и того же метода. Размер и список целей должны быть последовательными. | 
| А8 | Все целевые показатели sparse-switchинструкции должны быть выбором в одном и том же методе. Соответствующая таблица должна быть последовательной и отсортированной от низкой до высокой. | 
| А9 | Операн Bconst-stringиconst-string/jumboинструкций должен быть допустимым индексом в пул строковой константы. | 
| А10 | Операнд Cиз инструкцийiget<kind>иiput<kind>должен быть действительным индексом в постоянном пуле поле. Наслаждаемая запись должна представлять поле экземпляра. | 
| A11 | Операнд Cofsget<kind>иsput<kind>Инструкции должны быть действительным индексом в постоянный пул поля. Наслаждаемая запись должна представлять статическое поле. | 
| А12 | Операнд Cof theinvoke-virtual,invoke-super,invoke-directиinvoke-staticдолжен быть действительным индексом в пуле постоянного метода. | 
| А13 | Опель Bof theinvoke-virtual/range,invoke-super/range,invoke-direct/rangeи инструкцииinvoke-static/rangeдолжны быть действительным индексом в пуле постоянного метода. | 
| A14 | Метод, название которого начинается с «<», должен только вызывать виртуальную машину, а не код, происходящий из файла .dex. Единственным исключением является инициализатор экземпляра, который может быть вызванinvoke-direct. | 
| A15 | Операн CИнструкцииinvoke-interfaceдолжен быть допустимым индексом в пуле постоянного метода. Способныйmethod_idдолжен принадлежать к интерфейсу (не классу). | 
| A16 | Опец Bоперан из инструкцииinvoke-interface/rangeдолжен быть допустимым индексом в пуле постоянного метода. Способныйmethod_idдолжен принадлежать к интерфейсу (не классу). | 
| A17 | B-операнд Bconst-class,check-cast,new-instanceиfilled-new-array/rangeдолжен быть допустимым индексом в пуле постоянного типа. | 
| A18 | Операнд Cinstance-of,new-arrayи инструкцийfilled-new-arrayдолжен быть действительным индексом в постоянный пул типа. | 
| A19 | Размеры массива, созданного new-arrayинструкцией, должны составлять менее256. | 
| А20 | newинструкция не должна относиться к классам массива, интерфейсам или абстрактным классам. | 
| A21 | Тип, упомянутый инструкцией с new-arrayдолжен быть действительным типом без ссылки. | 
| A22 | Все регистры, упомянутые инструкцией в моде с одной шириной (не пары), должны быть действительными для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем registers_size. | 
| A23 | Все регистры, упомянутые инструкцией в моде с двойной шириной (пара), должны быть действительными для текущего метода. То есть их индексы должны быть неотрицательными и меньше, чем 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/rangeTrancs. | 
Структурные ограничения байт -кодов
Структурные ограничения являются ограничениями на отношения между несколькими элементами байт -кода. Они обычно не могут быть проверены без использования контроля или методов анализа данных.
| Идентификатор | Описание | 
|---|---|
| Б1 | Число и типы аргументов (регистры и непосредственные значения) всегда должны соответствовать инструкции. | 
| Б2 | Пары регистрации никогда не должны быть разбиты. | 
| B3 | Регистр (или пара) должен быть назначен сначала, прежде чем его можно будет прочитать. | 
| B4 | Инструкция invoke-directдолжна вызвать инициализатор экземпляра или метод только в текущем классе или одном из его суперкладов. | 
| Б5 | Инициализатор экземпляра должен быть вызван только в ненициализованном экземпляре. | 
| Б6 | Методы экземпляра могут быть вызваны только на полях экземпляра, и можно получить доступ только на уже инициализированных экземплярах. | 
| Б7 | Регистр, который содержит результат инструкции new-instanceне должен использоваться, если та жеnew-instanceинструкция снова выполняется до того, как экземпляр будет инициализирован. | 
| Б8 | Инициализатор экземпляра должен вызвать другой экземпляр инициализатора (тот же класс или Superclass), прежде чем можно получить доступ к любому экземпляру. Исключениями являются неудовлетворенные поля экземпляра, которые могут быть назначены перед вызовом другого инициализатора и класса Objectв целом. | 
| Б9 | Все фактические аргументы метода должны соответствовать назначению с их соответствующими формальными аргументами. | 
| Б10 | Для каждого вызова метода экземпляра фактический экземпляр должен быть совместимы с назначением с классом или интерфейсом, указанным в инструкции. | 
| Б11 | Инструкция return<kind>должна соответствовать типу возврата его метода. | 
| Б12 | При доступе к защищенным членам суперкласса фактический тип доступного экземпляра должен быть либо текущим классом, либо одним из его подклассов. | 
| Б13 | Тип значения, хранящегося в статическом поле, должен соответствовать назначению или конвертируемым или конвертируемым с типом поля. | 
| Б14 | Тип значения, хранящегося в поле, должен соответствовать назначению или конвертируемым с типом поля. | 
| Б15 | Тип каждого значения, хранящегося в массиве, должен соответствовать назначению с типом компонента массива. | 
| B16 | Aинструкцииthrowдолжен быть совместимы с заданием сjava.lang.Throwable. | 
| Б17 | Последняя добраемая инструкция метода должна быть либо обратной goto, либо ветвью,returnили инструкциейthrow. Не должно быть возможно оставить массивinsnsвнизу. | 
| B18 | Незначенная половина бывшей пары регистрации не может быть прочитана (считается недействительной) до тех пор, пока она не будет переизведена какой-либо другой инструкцией. | 
| Б19 | Инструкция move-result<kind>должна быть непосредственно предшествующей (в массивеinsns) инструкциейinvoke-<kind>. Единственным исключением является инструкцияmove-result-object, которым также может предшествовать инструкцияfilled-new-array. | 
| Б20 | Инструкция move-result<kind>должна быть непосредственно предшествующей (в фактическом потоке управления) с помощью соответствующей инструкцииreturn-<kind>(она не должна быть подпрыгнута). Единственным исключением является инструкцияmove-result-object, которым также может предшествовать инструкцияfilled-new-array. | 
| B21 | Инструкция move-exceptionдолжна появляться только в качестве первой инструкции в обработчике исключений. | 
| B22 | packed-switch-data,sparse-switch-dataи псевдо-инструктивыfill-array-dataне должны быть достигнуты при потоке управления. |