Бывают случаи, когда разработчикам нужно решить достаточно простую, я бы сказал даже, банальную задачу: вставить в код программы номер версии или дату компиляции приложения. Эта информация чрезвычайно полезна при последующем сопровождении: ведь всегда нужно знать, с какой версией имеешь дело.
Столкнувшись с этой задачей, я с удивлением обнаружил, что готовых средств для её решения во Flex3/Flex4 нет. Это крайне странно. Не могли же профессиональные разработчики забыть о такой необходимой вещи! И действительно, расследование показало, что внутри SWF-файлов всегда присутствуют определенные части, изменяющиеся при каждой компиляции. Именно этим и объясняется тот факт, что при перекомпиляции проекта результат часто имеет другой размер — файлы SWF сжаты, а результат работы упаковщика зависит от входных данных, которые, как я уже говорил, меняются всегда. Более пристальный взгляд показал, что в файле изменяется часть структуры, которая именуется декомпиляторами не иначе как SERIALNUMBER. Эта структура не документирована, но исследование показало, что в конце её лежит целое число 8-ми байт длиной. Число это - количество миллисекунд с начала 1970-года. Т.е. это ровно то, что возвращает свойство time у объекта Date. Осталась самая малость - прочесть из SWF своё код, найди в нем эту структуру и прочитать её последние 8 байт. Вопрос доступа к собственному коду — это, безусловно, интересная головоломка, но решилась достаточно быстро:
LoaderInfo.getLoaderInfoByDefinition(this).bytes;
Структура SWF-файла документирована, так что далее было легко.
Готовый код выложен на http://code.google.com/p/flex-ad-by/
Достаточно просто вызвать метод SWF.readCompilationDate().
Лицензия — BSD, что, по моему, свободнее некуда. Проверено во Flex3/Flex4. Пользуйтесь на здоровье.
четверг, 25 сентября 2008 г.
SWF compilation date
Подписаться на:
Сообщения (Atom)