ГлавнаяФорумДневникиФотоальбомы

Войти через:
Новости Телефоны Игры Графика Программы Документация Еще ...

АвторСообщение
_iNM
1, добавлено: 17 Сен 2006 08:09
Обсуждаем здесь программирование на С\С++!

Знакомство с Symbian OSОперационная система Symbian — одно из наиболее интересных явлений в мире ОС за последние годы. Успешно противостоя натиску Microsoft на мобильном рынке, эта система сегодня стала едва ли не самой распространенной в смартфонах и коммуникаторах.

Symbian — далекий потомок операционной системы EPOC, изначально создававшейся для карманных компьютеров Psion. Компактная, быстрая и надежная ОС пережила несколько инкарнаций, в конце концов превратившись в современную Symbian. Платформа Symbian — уникальный пример системы, совместившей в себе как академические традиции с их тщательностью проработки базовых концепций, так и прагматичность, свойственную коммерческим проектам.

Работа над Symbian OS началась в октябре 1994 г., в то время в команде специалистов, работавшей над проектом Psion, окончательно сформировалось решение использовать Си++ как основу для ОС. К этому времени был накоплен достаточный опыт в области объектного программирования (в процессе разработки ПО и ГИП для EPOC16), и, по воспоминаниям авторов, первые два года ушли на тщательную проработку концепции. Во многом благодаря этому удалось создать действительно эффективную ОС, адаптированную к ограниченным ресурсам мобильных устройств. Первая версия ОС (тогда еще под названием EPOC) появилась на рынке в 1996 г., когда был выпущен КПК Psion Series 5. Версия EPOC Release 5, представленная в марте 1999 г., — это переработанная редакция со множеством дополнительных функций (преимущественно прикладных). В 2002 г. появился первый смартфон на базе этой ОС (Nokia 7650), затем — первый коммуникатор (Sony Ericsson P800), и, что называется, «процесс пошел». Впрочем, история развития Symbian — предмет отдельного разговора, здесь же ограничимся лишь упоминанием актуальных на момент написания этой статьи версий. Прежде всего это Symbian OS v7.0s (в вариантах Series 60 2nd Edition Feature Pack 1, 2 и 3; Nokia N70, N90), Symbian OS v9.1 (Series 60 3rd Edition; Nokia 3250, N71, N80, N91, N92, E60, E61, E70), а также редакции, используемые компанией Sony Ericsson: UIQ 1.1 (Symbian OS v6.1), UIQ 2.1 (Symbian OS v7.0), UIQ 3 (Symbian OS v9).


  • Ядро
    Symbian OS — едва ли не единственный пример распространенной и отработанной микроядерной (если говорить о версии ядра EKA2, то и наноядерной) операционной системы. Получается, что в реальной жизни ОС, основанные на прогрессивной концепции микроядра, с неизбежностью «обрастают костылями», нарушающими идеологическую стройность, но способствующими решению прикладных задач (например, перенос графической подсистемы в ядро при разработке Windows NT 4.0). Но создателям Symbian OS удалось совместить эффективность и концептуальную стройность, несмотря на то что современные версии этой системы предоставляют исключительно обширные возможности, в том числе средства для работы с потоковыми данными, стеками протоколов, критичными к латентности ядра, графикой и видео высокого разрешения). Более того, если говорить о ядре, то одной из основных особенностей версии Symbian 9.0 стал переход на технологию «наноядра» (ЕКА 2, EPOC Kernel Architecture 2). EKA2 — многопоточное ядро с высоким уровнем реентерабельности и атомарности операций (например, допускается вызов обработчика прерывания даже во время процедуры переключения контекста). Оно также обеспечивает возможность работы в режиме реального времени (изначально это делалось, чтобы разработчики аппаратных средств могли отказаться от GSM-модулей, функционирующих под управлением специализированных ОС, переложив эту задачу на центральный процессор).

    Будучи микроядерной операционной системой, Symbian «выносит» практически все прикладные (т. е. выходящие за пределы компетенции ядра) задачи в модули-серверы, функционирующие в пользовательском адресном пространстве. Это, правда, не избавляет от регулярных сбоев в смартфонах с этой ОС, но позволяет предотвратить потерю пользовательских данных.


  • Основные API
    Возможности Symbian OS весьма обширны — это вам не виртуальная машина J2ME с многочисленными ограничениями и не Palm OS, а действительно современная, мощная и функциональная операционная система. К ним относятся стандартные средства (планирование процессов и управление ресурсами, запуск программ и связывание динамических библиотек, вывод графики и работа с сетью), а также инструментарий для трехмерной графики (даже акселерированной посредством Open GS ES), работы с мультимедийными потоками в реальном времени (это не только музыка, но и VoIP), Location API (для подключения источников географической информации) и пр.

    Все возможности Symbian OS распределены по компонентам, независимым от остальной системы (при этом допускается удаление одного из них без ущерба для всего комплекса). Назначение базового API (модуль Base) очевидно, стоит только отметить, что вместо многих стандартных решений, таких, как, скажем, стандартная библиотека Си++, используются собственные решения, более эффективные в рамках идеологии этой ОС. Подсистема безопасности отвечает за реализацию криптографических алгоритмов, управление сертификатами, инсталляцию ПО и пр. Графический модуль содержит API для отрисовки графики и текста, управления шрифтами, вставки картинок и др. В него также входит клиентский API Window Server и подсистема анимации.

    Подсистема «прикладных каркасов» (application framework) — решение, специфичное для Symbian OS. Идеология Symbian OS предполагает разнесение прикладной логики программы и пользовательского интерфейса. Базовые структуры и принципы работы (например, предположение о том, что у всякой программы-редактора есть документ, с которым она работает) или средства обработки клавиатурного ввода заложены и частично реализованы в «каркасе». Фактически именно эта подсистема предоставляет реальным прикладным программам универсальный механизм для решения типовых задач. ГИП может отличаться от устройства к устройству, но принципы его работы неизменны.

    Программные «движки» (engines) инкапсулируют логику прикладных программ. Они независимы от ГИП и при необходимости их можно использовать напрямую (скажем, при доступе к данным календаря для его «движка» не важно, чей вызов обслуживается: собственного пользовательского интерфейса или сторонней программы). На этом же уровне функционируют подсистемы обработки мультимедиа и сервисные библиотеки. Наконец, стек протоколов содержит сетевые и коммуникационные компоненты, а также средства синхронизации и телефонии (подсистема расширяема, процесс подключения модулей, реализующих новые стандарты, прост).

    Подсистема безопасности (начиная с Symbian v9.x) предполагает предотвращение доступа к структуре каталогов (для «неподписанных» программ, например, запрещен доступ к каталогам других утилит, системному каталогу), доступ к некоторым данным возможен в режиме «только чтение». Самое же неприятное — так называемая «модель возможностей» (capabilities), определяющая доступность тех или иных API. Открытые API составляют около 60% от всех функций ОС, «базовые» включают в себя коммуникационные подсистемы (Интернет, Bluetooth, сотовая связь и др.) и PIM. Они тоже доступны, но попытка вызвать, скажем, функцию отсылки SMS со стороны несертифицированной программы приводит к появлению запроса на разрешение этого действия, тогда как сертифицированная сможет сделать это прозрачно и незаметно для пользователя. В «расширенные» API входят функции, позволяющие манипулировать системной информацией, а «права изготовителя» — предоставляют самый полный контроль над устройством.


  • Уникальные идентификаторы
    Уникальный идентификатор (UID) — фундаментальная, хотя и небесспорная концепция Symbian OS. Наличие схемы сквозной идентификации объектов полезно, но в ряде случаев создает неудобства. Впрочем, UID — это «реальность, данная нам», и любой, кто задумывается о разработке для Symbian OS, должен понимать, для чего они используются. В целом UID состоит из трех 32-бит значений: UID1, UID2 и UID3. UID1 — глобальный идентификатор системного уровня. В частности, он назначается исполнимым модулям и определяет их тип (программа, библиотека, и др.). UID2 задает тип программы (скажем, наличие или отсутствие ГИП). UID3 определяет принадлежность всех компонентов, имеющих отношение к заданной сущности.

    Идентификаторы UID, в частности, используются и для сопоставления файлов данных и обрабатывающих их программ. Объект может и не иметь UID (например, если файл был получен извне, то система пытается определить тип файла по таблице соответствий MIME-типов). UID3 — наиболее важный из идентификаторов, при появлении в ОС разных программ с одним идентификатором блокируются все (возникает системная ошибка). Существует также идентификатор платформы (Platform UID), который используется для обозначения совместимости прикладной программы с той или иной редакцией Symbian OS.

    Уникальность UID предполагает одну особенность, которая не всегда очевидна для начинающих разработчиков: UID действительно должны быть уникальными. На этапе разработки допускается использование «нелицензируемых» UID в диапазоне 0x01000000 — 0x0fffffff. Чтобы избежать накладок при выпуске программы, принята схема запроса UID у разработчика ОС, обычно для этого достаточно послать письмо по электронной почте (на адрес ...), в ответ на которое выдается несколько (обычно 10) идентификаторов.


  • Соглашения об именах
    При разработке для Symbian OS приняты определенные правила именования классов и других структур (подробно они изложены в документации). Соблюдать ли их в собственных программах — решать разработчику, но для упрощения работы с документацией и примерами их стоит знать. Так, например, префикс T назначается «простым» классам («классам-значениям», как ни странно смотрится такое сочетание), не имеющим конструктора и деструктора (например, числа) и структурам Си (в этом случае встречается и обозначение S). С — наследники CBase, обычно создаются посредством new. R — ресурсный класс (как правило, полиморфная DLL). Исходя из изложенных выше соображений, легко догадаться, что такие классы требуют вызова функций инициализации (например, Create) и завершения (Close). M — абстрактные классы, содержащие только виртуальные (pure virtual) функции. Имена переменных-членов принято начинать с i, имена аргументов — с a. Имена функций зависят от их специфики. Обычно это глагол, но функции, извлекающие значения, имеют имена, соответствующие переменной, но без префикса i. Вообще, имена функций в Symbian, как правило, одним глаголом не ограничиваются, — скорее, это длинные описательные предложения. Имена констант индицируются символом K в начале.


  • Структура программы
    Symbian — объектная операционная система. Все реализовано в виде объектов и классов. Вызов функции — действие, выходящее за пределы идеологии ОС. Учитывая, что в состав системы входят сотни классов и тысячи функций, такой подход можно только приветствовать.

    Де-факто типичная прикладная программа есть не что иное, как DLL, предоставляющая функции, которые вызываются системными объектами ГИП. Есть и другие варианты, но они встречаются реже (в частности, службы). В версии 9.x от этой практики отказались, программа может быть и полноценным исполнимым модулем (важное следствие — возможность размещения статических данных и обработка исключений в стиле Си++). Но среднестатистическая программа (файл с расширением .app) представляет собой исполнимый модуль, зависящий от «каркаса» (предоставленного ОС). Утрируя, можно сказать, что не программа, совершая действия, заложенные в нее разработчиком, время от времени обращается к ОС с целью выполнения каких-то действий, скажем отрисовки диалогового окна, а, наоборот, ОС запускает подсистему ГИП, а та «дергает» функции, возвращающие данные (точнее, объекты), которые отрисовываются системными средствами. Это, кстати, целиком вписывается в концепцию разделения прикладного ядра (engine) и интерфейса, а также убирает зависимость от конкретной графической библиотеки и теоретически (на практике, разумеется, хватает подводных камней) упрощает перенос ПО между системами с разными типами ГИП.

    Прикладная программа должна использовать четыре основных класса: системное ядро (Application), «документ» (Document), реализацию ГИП (App UI) и «графическое поле» (View). В классе «ядро» необходимо реализовать базовые функции, минимум — две (обе вызываются сразу после загрузки прикладной DLL). NewApplication() создает объект, и E32Main() определяет точку входа. Как таковой, этот объект отвечает за базовое взаимодействие программы с ОС. В прикладном классе, созданном посредством NewApplication(), могут быть определены свойства, общие для всех экземпляров данной программы. Объекты, разумеется, зависят от используемой редакции Symbian OS, — скажем, при работе с Series 60 ядро будет порождаться от класса CAknApplication.

    Далее необходимо создать «документ» (даже если он не нужен и впоследствии будет проигнорирован; вообще, «документ» — это довольно удобное структурированное хранилище информации, так что имеет смысл его использовать, раз уж создан). Здесь же системе сообщается UID (поскольку функция генерации экземпляра должна возвращать UID2). Необходимость создания документа обусловлена тем, что в ходе этого процесса инициализируются также системные компоненты ГИП. В целом эта схема похожа на атавизм времен EPOC с ее документно-ориентированной идеологией, но в действительности не лишена изящества и к ней довольно быстро привыкаешь. Как бы то ни было, стоит запомнить: даже если разрабатывается «Hello, World», необходим документ.

    Интерфейсный класс задает базовые элементы управления, запускает цикл обработки сообщений и т. д.

    Еще одно фундаментальное понятие практически для любой программы Symbian OS — вид (View). Это базовый элемент управления, с которым работает программа, выводя информацию. С некоторыми упрощениями можно назвать его «экранной формой», на которой размещаются прочие составные части ГИП. Логика работы с ним (как и вся архитектура и использование объектов управления в Symbian OS) — предмет, требующий отдельной статьи.


  • Инструментарий и разработка
    Разработка для Symbian OS (если говорить о Си++) обычно ведется на ПК. Среда разработки — привычная многим программистам Visual Studio, это также могут быть IDE Metrowerks CodeWarrior Development Studio, Borland C++BuilderX Mobile Edition, Carbide.C++ (относительно новая IDE, созданная компанией Nokia на базе Eclipse), снабженная дополнительными инструментальными пакетами (SDK). Разработчику доступны практически все привычные возможности в отношении как создания ПО, так и отладки (трассировка, просмотр переменных, стека вызовов, структур классов и др.).

    Отлаживаемая программа запускается в эмуляторе Symbian OS. Отметим, что эту подсистему правильнее было бы назвать симулятором, поскольку имитируются не аппаратные средства, а лишь программное окружение (соответствующие API операционной системы, реализованные поверх API Win32). При этом программные модули, которые загружаются в эмулятор, представляют собой исполнимые файлы для архитектуры x86 (не ARM, на базе которой построены смартфоны), соответствующее ПО для целевой платформы формируется после итоговой компиляции. Это предполагает определенную специфику (скажем, ранее была довольно распространена ситуация, когда программа, нормально функционировавшая в среде эмулятора, отказывалась работать на реальном устройстве), но сегодня эмулятор обеспечивает достаточно высокую степень сходства и проблемы возникают лишь при создании программ, нестандартно использующих API. В комплект инструментария для Symbian OS входят и средства для дистанционной отладки и анализа. С учетом двухуровневой структуры с разделением логики и интерфейса процесс отладки становится немного громоздким, если говорить о простом ПО. Но для крупного проекта такой подход упрощает работу, — в частности, будет целесообразно подготовить ряд специализированных тестов, обеспечивающих контроль прикладной логики пакета. При наличии отлаженного ядра с комплектом автоматизированных тестов перенос и адаптация программы между различными моделями и разновидностями Symbian OS превращаются в рутинные задачи. Symbian предлагает ряд инструментов для тестирования (в частности, программный каркас Test Driver).

    SDK Symbian определенно оценить довольно сложно. Он неплох — но непривычен. Основная сложность для начинающего состоит в том, чтобы разобраться с последовательностью формирования прикладной программы и назначением многочисленных инструментов. Ситуация усугубляется наличием упоминавшейся концепции разделения программы на практически независимые подсистемы; SDK буквально вынуждает следовать ей, требуя разнесения модулей по соответствующим каталогам. Кроме того, сам по себе SDK — сборник разнородных утилит, приемы работы с которыми не всегда последовательны, да и реализованы эти инструменты по-разному (вплоть до языков программирования: часть программ пакета построена на базе Perl, часть — Java, что-то — обычные исполняемые файлы). И еще один минус — SDK довольно медленный. На компиляцию кода даже для небольшой программы может потребоваться несколько минут. Но это, пожалуй, и все. При внимательном чтении документации, изучении примеров и знакомстве с идеологией платформы освоение SDK проблем не вызывает, специалист вполне в состоянии разобраться во всем за пару дней.

    Многие, наверное, уже догадались, что «SDK для Symbian OS» — вещь довольно расплывчатая при наличии такого количества редакций базовой системы. Несмотря на общую принадлежность к Symbian OS, конкретные SDK сильно различаются.

    Проекты для Symbian OS сохраняются в файлах .mmp (аналог привычных файлов make), которые содержат ссылки и команды, необходимые для обработки программных модулей, ресурсов и пр. При желании можно вести разработку практически в любой среде, хотя ряд операций в этом случае придется выполнять вручную (соответствующими утилитами командной строки, — в частности, это bldmake и abld; последний имеет дело с собственным файлом проекта, bld.inf — определяет активный проект). Но они тем не менее работают с .mmp-файлами.

    В файле .mmp указываются поля, название и тип целевого файла (поля TARGET и TARGETTYPE), уникальные идентификаторы, используемые в проекте (UID), идентификатор разработчика (VENDORID), путь к файлам проекта и их список (SOURCEPATH, SOURCE, USERINCLUDE, SYSTEMINCLUDE и др.), заголовочные и ресурсные файлы (для последних можно определить блоки, предполагающие дополнительную обработку), подключаемые библиотеки и т. д.

    Программа с ГИП должна иметь не менее двух ресурсных файлов. В первом записывается пиктограмма изображения, во втором — параметры регистрации (записывается в каталоге \private\10003a3f\apps; так называемое «централизованное хранилище», на первый взгляд похожее на реестр Windows, но в то же время существенно от него отличное). Аналогично задаются библиотеки (как минимум необходима euser.lib). Впрочем, большинство IDE успешно скрадывают сложности этого процесса (или способны импортировать файлы .mmp, записывая информацию в собственных структурах).


  • Эмулятор
    После инсталляции SDK в подкаталоге создается развесистое дерево каталогов (в подкаталоге epoc32\). Фактически существует две версии эмулятора — с отладочными средствами в системных библиотеках и без них. Кроме того, стоит знать место расположения образа диска Z:. В основе подсистемы хранения данных в Symbian OS лежит знакомая всем концепция логических дисков, в качестве системного используется обычно диск Z:. На нем записаны системные модули ОС. В реальном устройстве это обычно флэш-ППЗУ, причем предусматривается ряд ограничений, — например, загрузка драйвера устройства допускается только с него, — что в известной степени осложняет жизнь разного рода злоумышленникам (хотя и не решает проблемы полностью, поскольку существует несколько методов обхода этой блокировки). В эмуляторе же ему соответствует каталог RELEASE\WINSCW\UDEB\z\. Переводим: в этом каталоге собраны модули для Windows-версии SDK CodeWarrior (также существуют сборки для стандартного SDK, она обозначается аббревиатурой WINS, версии для архитектур ARM и THUMB обозначаются ARM4, ARMI или THUMB). UDEB — каталог, содержащий системные модули с отладочными (debug) средствами (буква U в данном случае — атавизм времен EPOC Release 5, та версия не была совместима с Unicode, а соответствующие наборы модулей назывались просто DEB или REL, отладочные или «релизы»). Назначение подкаталога z очевидно. Программа обычно размещается на «диске» С:, в каталоге system/apps/, диск D: обычно используется как временный носитель данных, которые не обязательно хранить постоянно. Эта структура в некоторых моделях может изменяться, но в целом она такова.

    Еще одна интересная особенность эмулятора — возможность запуска программ, не имеющих графического интерфейса. Это бывает необходимо на этапе отладки прикладного ядра пакета или при создании модулей-серверов. Интерфейс обеспечивает вполне обычно выглядящая программа-оболочка с интерфейсом командной строки (eshell; система команд довольно сильно напоминает DOS).


  • Локализация
    Проблема адаптации к национальным языкам в случае Symbian практически отсутствует. ОС предоставляет все необходимые средства для того, чтобы адаптировать интерфейс к требованиям тех или иных языков. Будучи системой, основанной на Unicode, Symbian OS может демонстрировать, скажем, арабский текст с вкраплениями русского и иероглифов. Эта возможность редко используется на практике, но в любом случае при выводе текста разработчик в общем не испытывает проблем. С использованием языков в интерфейсе дело обстоит чуть сложнее, но непреодолимых проблем нет и здесь. При создании многоязычного проекта обычно не требуется вносить какие-либо изменения в исходные тексты, достаточно подготовить соответствующее количество ресурсных модулей — система выберет нужный автоматически. При этом разные языковые версии модулей отличаются кодом языка (он используется как расширение файла) и процесс смены интерфейса пользователю напрямую не доступен, т. е. переключить можно лишь параметры региональных настроек. Это не всегда удобно (но при необходимости можно реализовать собственный механизм). Едва ли не основной подводный камень — возможность забыть о преобразовании ресурсного файла в Unicode. Языковой модуль включается в комплект инсталляционного файла, где пользователь и может выбрать его при инсталляции программы.


  • Инсталляция и распространение
    Инсталляция и распространение — процессы, которые в Symbian OS за последнее время стали менее удобными в основном из-за злоумышленников, которые избрали смартфоны своей очередной мишенью. Проблема вирусов как таковых в Symbian отсутствует (впрочем, классических вирусов сегодня вообще немного), куда больше проблем доставляют разного рода «троянские кони», маскирующиеся под прикладное ПО (и даже под антивирусы). Устанавливая такую программу, пользователь может считать, что имеет дело с благонамеренной утилитой или игрой, но получит «троянский модуль» (возможностей навредить много: чаще всего со смартфона похищается личная информация или же «троян» пытается использовать разного рода платные услуги, например основанные на SMS). Бороться с этим злом, безусловно, необходимо (думается, мало кто из создателей ПО захочет, чтобы его именем прикрывался «троянец»). На практике это выливается в ужесточение политики разработчиков ОС и изготовителей аппаратных средств, когда на смартфон допускается инсталляция только ПО, имеющего соответствующую цифровую подпись и прошедшего испытания в их лабораториях. Этот процесс оплачивается (250–600 долл. за попытку сертификации, которую программа не обязательно пройдет; отметим, что для создателей бесплатных программ предлагается и бесплатная сертификация, но на довольно жестких условиях), он занимает определенное время и требует дополнительных усилий.

    На этапе разработки автор может использовать «самоподписанные» программы или «сертификат разработчика» (он привязывается к серийному номеру самого телефона). Это упрощает процесс, но и накладывает ряд ограничений, — в частности, некоторые API доступны только сертифицированным партнерам. Список таких подсистем постоянно расширяется (на сегодня туда входят, например, низкоуровневая обработка нажатий клавиш, доступ к файловой системе и др.). Это обстоятельство отталкивает многих из тех, кто хотел бы попробовать свои силы в разработке для Symbian OS, и, если рассуждать здраво, может сильно повредить рыночным позициям ОС уже в недалеком будущем. Поскольку все эти «жестокости» в общем-то малоэффективны, количество «троянских модулей», как показывает практика, не уменьшается. Выгода от криминальных атак на смартфоны вполне окупает затраты на сертификацию, а замаскировать деструктивные действия под вполне безобидные операции квалифицированный разработчик сможет без особенных сложностей.

    Как бы то ни было, подготовленная для распространения программа должна быть запакована в архивный файл специального формата (с расширением .sis). Это основная форма существования дистрибутивных модулей для Symbian OS, отклонения наблюдаются довольно редко (хотя встречаются, например, если разработчик хочет усилить защиту от копирования и загружает компоненты пакета в память смартфона, пользуясь своими средствами). Этот файл должен быть скопирован в память телефона (или напрямую, или посредством коммуникационных утилит, обычно пакета PC Suite) и запущен там. Если цифровая подпись отсутствует, при попытке инсталляции выдается предупреждение о ее отсутствии. В большинстве современных моделей пользователь может инсталлировать программу на свой страх и риск, но, учитывая описанные выше тенденции, есть основания полагать, что в недалеком будущем установка несертифицированных модулей будет заблокирована (впрочем, здесь все зависит от политики изготовителя устройства).

    Формат SIS предоставляет довольно много возможностей для организации интеллектуального процесса установки. В частности, можно запросить выдачу текста (скажем, лицензионного соглашения), определить модули, от которых зависит данный пакет, задать выбор места инсталляции (в памяти телефона или на карте памяти), запустить программу и пр. Дистрибутивные файлы могут быть вложенными. С учетом требования цифровой подписи процесс формирования файла SIS — многоступенчатый, с отдельными этапами создания, подписи, генерации ключей и др. Сценарий процесса создания собственно дистрибутивного пакета описывается в файле PKG (синтаксис его вполне прост).

    Тесные рамки журнальной статьи не позволяют нам более подробно рассмотреть ряд интереснейших аспектов программирования в среде Symbian OS. Так, за кадром остались вопросы использования «активных объектов» (они упрощают обработку асинхронных событий и даже предоставляют средства для организации подобия кооперативной внутрипоточной многозадачности), возможности мощной и гибкой системы дескрипторов, организации обработки крупных массивов данных и многое другое. Но благодаря хорошо продуманной архитектуре и богатой функциональности какие-то существенные трудности возникают довольно редко. Что же касается подводных камней, которые доставляют массу неприятных минут начинающим создателям ПО, автор хотел бы надеяться, что изложенная информация поможет преодолеть их. И напомним, что только практика позволит разработчику освоить все возможности столь мощной системы, как Symbian OS.


По материалам: PC Magazine


Сборка приложения Hello World!
HelloWorld приложение
Оно может работать на любом Symbian OS устройстве. Проект Symbian OS приложения состоит из нескольких файлов: собственно исходников (.cpp и .h), файлов описания проекта (.mmp) и файлов описания компонент (bld.inf). Могут потребоваться и другие файлы.

Файл описания проекта необходим для корректной работы утилиты bldmake. Имя файла проекта должно соответствовать имени приложения. Другими словами, если мы разрабатываем программу HelloWorld.exe, файл описания проекта должен называться HelloWorld.mmp.

Цитата:
// HelloWorld.mmp
TARGET HelloWorld.exe
TARGETTYPE exe
UID 0
SOURCEPATH .
SOURCE HelloWorld.cpp
USERINCLUDE .
SYSTEMINCLUDE \Epoc32\include
LIBRARY euser.lib bafl.lib efsrv.lib



В отличие от файла описания проекта, файл описания компонент всегда называется одинаково: bld.inf. В этом файле указывается список проектных файлов:

Цитата:
// файл bld.inf
PRJ_MMPFILES

HelloWorld.mmp


Создадим простейшее консольное приложение. Пусть оно выводит на экран строку "Hello world!", дожидается нажатия клавиши и закрывается.

Цитата:
Листинг исходного кода HelloWorld.cpp
#include <e32base.h>
#include <e32cons.h>

_LIT(KTxtEPOC32EX,"EPOC32EX");
_LIT(KTxtExampleCode,"E32 SDK Example Code");
_LIT(KFormatFailed,"failed: panic code=%d");
_LIT(KTxtOK,"ok");
_LIT(KTxtPressAnyKey," [press any key]");

LOCAL_D CConsoleBase* console; // запишите сюда свое сообщение
LOCAL_C void doExampleL(); // именно это функция будет выполнять требуемые нам действия

//*********************************************//
// функция, осуществляющая печать //
//*********************************************//
LOCAL_C void doExampleL()
{
_LIT(KHelloWorldText,"Hello world!\n");

// создаем консольный объект
console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
CleanupStack::PushL(console);
// печатаем строку "Hello world"
console->Printf(KHelloWorldText);
// печатаем строку "press any key"
console->Printf(KTxtPressAnyKey);
// дожидаемся, пока пользователь нажмет кнопку
console->Getch();
CleanupStack::PopAndDestroy(); // закрываем консоль
}

//************************//
//* главная функция *//
//************************//
TInt E32Main()
{
__UHEAP_MARK;
CTrapCleanup* cleanup=CTrapCleanup::New(); // получаем чистый стек
TRAPD(error,doExampleL()); // завершаем инициализацию и выполняем пример
__ASSERT_ALWAYS(!error,User::Panic(KFormatFailed,error));
delete cleanup; // удаляем стек
__UHEAP_MARKEND;

return 0;
}



Компиляция
Существует два пути сборки Symbian OS приложения. Первый - использование утилит командной строки. С помощью этого метода вы можете собрать приложение для любого целевого устройства, поддерживаемого SDK (ARM4 и THUMB поддерживаются не всеми SDK). Второй путь - использовать Microsoft Visual Studio [Прим. переводчика: или любую другую IDE. В рамках статьи рассматривается только Microsoft Visual Studio.]. Этот метод кажется мне более предпочтительным, поскольку текстовый редактор и компилятор встроены в удобную графическую среду, что значительно упрощает процесс разработки и отладки приложения. Для отладки приложения Microsoft Visual Studio использует собственную WINS платформу. При переносе программы на целевую платформу (например, на armi или thumb), Вам все равно придется пользоваться командной строкой.

Для того чтобы собрать приложение с помощью командной строки надо:

Перейти в папку, содержащую .mmp файл проекта. Убедиться, что в этой же папке лежит файл bld.inf.
Выполните команду bldmake bldfiles. В результате ее выполнения будет создан файл abld.bat, который содержит информацию, полученную из .mmp файла проекта. (Обратите внимание, что после изменения .mmp файла нужно снова выполнять команду bldmake.)
Выполните команду abld build wins udeb. Она создает версию приложения с отладочной информацией для WINS платформы.
Выполните команду abld build armi urel. Она создает релиз версию приложения для целевого устройства.
После создания exe файла, его нужно скопировать в папку Epoc32\release\wins\udeb\.

Рассмотрим создание проекта и сборку приложения с помощью Microsoft Visual C++.

Перейти в папку, содержащую .mmp файл проекта. Убедиться, что в этой же папке лежит файл bld.inf.
Выполните команду bldmake bldfiles. В результате ее выполнения будет создан файл abld.bat, который содержит информацию, полученную из .mmp файла проекта. (Обратите внимание, что после изменения .mmp файла нужно снова выполнять команду bldmake.)
Выполните команду abld makefile vc6. В результате будет создан файл проекта и файл рабочей среды ( .dsp и .dsw ). Эти файлы можно использовать в Visual C++ 6.0.
Запустите Microsoft Visual C++ 6.0 и выберите команду Open Workspace из меню File.
Выберите файл с расширением .dsw в папке WINS\ вашего проекта.
Выберите команду Build или Rebuild All из меню Build. Будет выполнена сборка приложения.

Запуск приложения
После сборки консольного приложения, его можно запустить на эмуляторе или на целевом устройстве. В рамках этого документа рассмотрим только запуск на эмуляторе. Информация о запуске приложений на конкретных устройствах приведена в документации для соответствующих платформ.

Существует два способа запуска приложения на эмуляторе: можно запустить приложения из командной строки или из IDE (в данном случае из Microsoft Visual C++ 6.0).

В случае запуска из командной строки, скопируйте созданный файл helloworld.exe в папку Epoc32\release\wins\udeb\, затем перейдите в эту папку и запустите файл helloworld.exe. Для запуска приложения из Microsoft Visual C++ 6.0 нужно выполнить команду Execute HELLOWORLD.exe из меню Build. Оба этих способа приводят к одному результату: через несколько секунд запустится окно эмулятора, и Вы увидите картинку:



Статья собрана при помощи: Forum.Nokia.com


Документация!



Форумы разработчиков! (помимо нашего конечно! :-) )



Файлы!



Вопрос - Ответ!
В: Объясните, как переключить профиль на S60?
О:Код!
Код:
void CAppUi::ProfileSwitch()
   {
      CRepository* cr = CRepository::NewLC( KCRUidProfileEngine );
      TInt value;

      // Get the ID of the currently active profile:
      User::LeaveIfError( cr->Get( KProEngActiveProfile, value ) );
      if( value == 0 )
      {
         value = 1;
         cr->Set( KProEngActiveProfile, value);
         // Get the game and warning tone setting of the active profile:
         User::LeaveIfError( cr->Get( KProEngActiveWarningTones, value ) );
         // use value
         // Get the message alert setting of the active profile:
         User::LeaveIfError( cr->Get( KProEngActiveMessageAlert, value ) );
         // use value
         User::LeaveIfError( cr->Set( KProEngActiveMessageAlert, value ) );
         // use value
      }
      else
      {
         cr->Set( KProEngActiveProfile, 0 );
      }
      CleanupStack::PopAndDestroy( cr );
}

Переключение профиля обсуждается тут: http://discussion.forum.nokia.com/forum/showthread.php?t=74617
Осталось выяснить, как получить имена этих профайлов, что бы отобразить в своей аппликухе.


В: Как из приложения выключить микрофон на 9-м симбиане ?
О: Могу сказать, что никак этого сделать не получится. В силу особенностей и железа и самой архитектуры. Что бы это понять, можешь глянуть Audio routing limitations on S60 3rd Edition. Советую поискать другой способ решения задачи!

В: Visual c++6 при компиляции выдает ошибку:
Код:
e32def.h(835) : error C2146: syntax error : missing ';' before identifier 'TInt64'
e32def.h(835) : fatal error C1004: unexpected end of file found

Пример с книги:
#include <e32base.h>
#include <e32cons.h>


_LIT(KTxtEPOC32EX,"EPOC32EX");
_LIT(KTxtExampleCode,"E32 SDK Example Code");
_LIT(KFormatFailed,"failed: panic code=%d");
_LIT(KTxtOK,"ok");
_LIT(KTxtPressAnyKey," [press any key]");

LOCAL_D CConsoleBase* console; // запишите сюда свое сообщение
LOCAL_C void doExampleL(); // именно это функция будет выполнять требуемые нам действия

//*********************************************//
// функция, осуществляющая печать //
//*********************************************//
LOCAL_C void doExampleL()
{
_LIT(KHelloWorldText,"Hello world!\n");

// создаем консольный объект
console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
CleanupStack::PushL(console);
// печатаем строку "Hello world"
console->Printf(KHelloWorldText);
// печатаем строку "press any key"
console->Printf(KTxtPressAnyKey);
// дожидаемся, пока пользователь нажмет кнопку
console->Getch();
CleanupStack::PopAndDestroy(); // закрываем консоль
}

//************************//
//* главная функция *//
//************************//
Main() {
__UHEAP_MARK;
CTrapCleanup* cleanup=CTrapCleanup::New(); // получаем чистый стек
TRAPD(error,doExampleL()); // завершаем инициализацию и выполняем пример
__ASSERT_ALWAYS(!error,User::Panic(KFormatFailed,error));
delete cleanup; // удаляем стек
__UHEAP_MARKEND;

return 0;
}


Подскажите пожалуйста в чем проблемма.
О: Используй либо VS2003, либо Carbide C++. А VS2005 и выше, не поддерживаются SDK.

В: Как реализовать корректное "сворачивание" приложения?
О: У класса AppUi есть метод:
Код:
void HandleForegroundEventL(TBool aForeground)
  //1 to switch to the foreground.
  //0 to switch from the foreground

Вызывается при сворачивании и всплытии приложения. В нем и делай всю обработку.

В приложениях с DSA можно поступить проще. Достаточно корректно остановить таймеры в функциях AbortNow и Restart и установить флаг отрисовки в 0, чтобы уже сработавший таймер ничего не смог нарисовать.


В: Как полностью удалить 3rd Edition FP1 SDK, 3rd Edition FP2 SDK, 3rd Edition MR SDK?
О: В реестре ищи HKEY_LOCAL_MACHINE\SOFTWARE\Nokia\com.nokia.s60. Ключ instances содержит кол-во установленных СДК.
После удаления СДК, удали эту ветку.

В: После локализации приложения оно не кажется в телефоне русскими буквами, кажет крокозябры, типа видимо проблемы с кодировкрй. не подскажет ли кто - где что прописывать чтоб нормальные русский буквы были в меню , назварнии проги и диалогах? ЗЫ ресурсы раздельные, русский под кодом 16, грузит из точно откуда надо но не кажет русскими буквами!
О: В rss-файле, перед блоком с #include, добавь CHARACTER_SET UTF8. Если ресурсы сохранены в UTF-8, должно заработать.

В: Пытаюсь в своем приложении отловить закрытие и открытие слайдеров (основного и с муз. кнопками).
Информация здесь http://wiki.forum.nokia.com/index.php/Capturing_the_slider_events не верная. Уж не знаю, может для обычной N95 оно и так, но сильно сомневаюсь.
У себя же я имею, что вызывается KeyEvents:

Закрытие основного слайдера
aType = 0x0003, iCode = 0x0000, iScanCode = 0x00a9 (EStdKeyDevice5)
aType = 0x0002, iCode = 0x0000, iScanCode = 0x00a9

Закрытие музыкального слайдера
aType = 0x0003, iCode = 0x0000, iScanCode = 0x00ad (EStdKeyDevice9)
aType = 0x0002, iCode = 0x0000, iScanCode = 0x00ad

Т.е. по ссылке выше они перепутаны, но это не большое разочарование.

Основная беда в том, что при открытии любого слайдера KeyEvents не вызывается вообще!
Вопросы соответственно такие: почему такой фигня случается, кто виноват и что делать? Как отловить момент открытия слайдеров?

О: Для начала тебе нужно в твоем классе AppUi начать следить за этими кнопками. Делается через RWindowGroup::CaptureKey и RWindowGroup::CancelCaptureKeyUpAndDowns. После этого эвенты должны падать в offerkeyeventL твоего контрола.

В: Работа с EAppOrientationLandscape и вывод битмапов
О: Решение!

В: Как скрыть MenuBar?
О: А вот так! :-)

В: Как форматировать строку?Нужно вывести TInt на экран, делаю так.
Код:

R2DIntArray arr;
arr.Reset();
arr.At(0,1);
arr.Count();
TChar buff;
sprintf(buff, "%d", arr.Count());


Библиотеку stdio.h подключил, выводит ошибку:
Цитата:

the file 'STDIO.H' cannot be opened


Почему? И как можно это дело сделать по другому?

О: Вот так!
Код:
void CmytestAppUi::message(TInt dig)
   {
      _LIT(KError, "=> %d");
      TBuf<35> errorBuf;
      errorBuf.Format(KError, dig);
      TBufC<35> str(errorBuf);
     
      TInt NoteId = -1;
      CAknGlobalNote* dialog = CAknGlobalNote::NewLC();
      CleanupStack::PushL(dialog);
      NoteId = dialog->ShowNoteL(EAknGlobalErrorNote,str.Des());
      User::After(2000000);
      dialog->CancelNoteL(NoteId);
      CleanupStack::PopAndDestroy(dialog);
   }


В:
О:

В:
О:

Dima300
Новичок
НовичокПолезность: 0 (0)
Имя: Дима
Возраст: 38
С нами с: 09.05.2012
Сообщений: 3
0
1471, добавлено: 04 Июл 2015 20:49
Доброго времени суток

Подскажите, где можно скачать компилятор и\или среду разработки для Simbian OS серии 60?
Спасибо!

kostett_tx
Новичок
НовичокПолезность: 0 (0)
Имя: Constantine
Возраст: 22
С нами с: 24.01.2014
Сообщений: 3
Откуда: РФ, Архангельск
0
1472, добавлено: 18 Июл 2015 13:53
Присоединяюсь к оратору выше. Интересуют средства разработки под Symbian 6.1.

Добавлено через 2ч. 42мин. 21сек.
Опа, нашёл. Пардон за файлообменник, но всё есть.
http://www.ex.ua/976304
Список файлов:
ActivePerl-5.8.6.811-MSWin32-x86-122208.msi
Borland C++ BuilderX 1.5 ME.iso
nS60_sdk_v1_2.iso
s60_2nd_fp2_sdk_msb.iso
Прикрепил бы и сюда, да размер великоват.

baydala
Новичок
НовичокПолезность: 0 (0)
Имя: Максим
Возраст: 34
С нами с: 25.02.2010
Сообщений: 7
Откуда: Укр., Киев
Модель телефона: NOKIA E7-00
0
1473, добавлено: 16 Сен 2015 13:34
камрады, поделитесь sdk под анна(symbia 3 sdk) или белла (Qt SDK 1.1.3+Native API support for symbian belle).
может у кого завалялось
Хочеш жить - умей вертеться.

Mosk77
Новичок
НовичокПолезность: 0 (0)
Имя: Сергей
Возраст: 39
С нами с: 28.11.2011
Сообщений: 194
Откуда: Укр., Николаев
Модель телефона: N82(35)+N8(Anna)+N8(Belle)+808(FP2)
0
1474, добавлено: 21 Фев 2016 21:19
Уважаемые Господа !
Может кто то декомпилироваль 3 небольших файлика 27,8кбайт, 14,3кбайт и 9,6кбайт Скрытый текстможно и не за спасибо
N82-2шт (35.0.002) + N8 (Anna-022.014) and N8 (Belle-111.030.0609)and 808 (113.010.1507)

Yanoame
Новичок
НовичокПолезность: 0 (0)
Имя: A
Возраст: 26
С нами с: 08.04.2017
Сообщений: 1
Откуда: 2
0
1475, добавлено: 08 Апр 2017 22:18
Ребят поделитесь файлами Carbide c++ v1.2 и все остальные примочки к нему) Заранее признателен за помощь


Новая тема Написать ответ На страницу 1...979899
Часовой пояс: 3




Другие мобильные клубы
Samsung клубSony Ericsson клубSiemens клуб