Добавлен: 29.10.2018
Просмотров: 48063
Скачиваний: 190
876
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
хэш-код содержащимся в нем значениям (сетевые системы работают несколько иначе).
Хэширование применяется, чтобы избежать хранения пароля в системе в незашиф-
рованном виде. Если пароль введен верно, то программа регистрации считывает из
файла
/etc/passwd
имя программы оболочки, которую предпочитает пользователь. Это
может быть программа bash, но также может быть и другая оболочка, например
csh
или
ksh
. Затем программа регистрации использует системные вызовы setuid и setgid, чтобы
установить для себя UID и GID пользователя (как мы помним, она была запущена
как SETUID root). После этого программа регистрации открывает клавиатуру для
стандартного ввода (дескриптор файла 0) и экран для стандартного вывода (дескрип-
тор файла 1), а также экран для вывода стандартного потока сообщений об ошибках
(дескриптор файла 2). Наконец, она запускает предпочтительную для пользователя
оболочку и таким образом завершает свою работу.
С этого момента начинает работу оболочка с установленными UID и GID, а также
стандартными потоками ввода, вывода и ошибок, настроенными на устройства ввода-
вывода по умолчанию. Все процессы, которые она запускает при помощи системного
вызова fork (то есть команды, вводимые пользователем с клавиатуры), автоматически
наследуют UID и GID оболочки, поэтому у них будет верное значение владельца
и группы. Все файлы, создаваемые этими процессами, также получают эти значения.
Когда какой-либо процесс пытается открыть файл, система сначала проверяет биты
защиты в i-узле файла для указанных вызывающей стороной значений рабочих UID
и GID, чтобы определить, разрешен ли доступ. Если доступ разрешен, то файл от-
крывается и процессу возвращается дескриптор файла. В противном случае файл не
открывается, а процессу возвращается значение –1. При последующих обращениях
к системным вызовам read и write проверка не выполняется. В результате если режим
защиты файла изменяется уже после того, как файл был открыт, то новый режим не
повлияет на процессы, которые уже успели открыть этот файл.
В операционной системе Linux и модель защиты, и ее реализация по существу точно
такие же, как и у большинства традиционных систем UNIX.
10.8. Android
Android — относительно новая операционная система, сконструированная для работы
на мобильных устройствах. Она основана на ядре Linux — для самой операционной
системы Android в ядро Linux введено всего лишь несколько новых понятий и ис-
пользуется большинство уже знакомых вам средств Linux (процессы, идентификаторы
пользователей, виртуальная память, файловые системы, планирование и т. д.), иногда
весьма отличными от их первоначального предназначения способами.
Спустя 5 лет после первого представления Android выросла в одну из наиболее рас-
пространенных операционных систем для смартфонов. Ее популярность пришла на
волне взрывного распространения смартфонов, и она находится в свободном доступе
для производителей мобильных устройств, что позволяет использовать ее в их про-
дукции. Она также является платформой с открытым кодом, что позволяет подстраи-
ваться под широкое многообразие устройств. Она приобрела популярность не только
для устройств, рассчитанных на покупателей, где в выгодном свете представлялось
наличие экосистемы из приложений сторонних разработчиков (вроде приложений для
планшетных компьютеров, телевизоров, игровых систем и медиаплееров), но все чаще
10.8. Android
877
находит применение в качестве встроенной операционной системы для специализи-
рованных устройств, нуждающихся в графическом интерфейсе пользователя (GUI),
таких как VOIP-телефоны, смарт-часы, приборные панели автомобилей, медицинские
устройства и бытовые приборы.
Значительная часть операционной системы Android написана на языке программиро-
вания высокого уровня Java. Ядро и большое количество библиотек низкого уровня
написаны на C и C++. Но существенная часть системы написана на Java, и весь API
приложений, за весьма небольшим исключением, также написан и издан на Java. Те
части Android, которые написаны на Java, имеют ярко выраженную тенденцию следо-
вания объектно-ориентированной модели, чему, собственно, способствует сам язык.
10.8.1. Android и Google
Android является весьма необычной операционной системой в том смысле, что в ней
открытый исходный код сочетается со сторонними приложениями с закрытым ис-
ходным кодом. Часть Android с открытым исходным кодом называется Android Open
Source Project (AOSP) и является полностью открытой с возможностью повсеместного
использования и изменения.
Важной целью Android является поддержка высокотехнологичной среды сторонних
приложений, что требует наличия стабильной реализации и API для приложений, ра-
ботающих в этой среде. Но в мире программ с открытым кодом, где каждый производи-
тель устройств может подстроить платформу под свои потребности, вскоре возникают
проблемы совместимости. Должен быть некий способ управления этим противоречием.
Частью решения этой проблемы для Android является документ определения совме-
стимости (Compatibility Definition Document (CDD)), который дает описание способов
поведения Android, позволяющих добиться совместимости с приложениями сторонних
разработчиков. В самом документе описывается, что нужно Android-устройству для
поддержки совместимости. Но без некоторых методов принуждения к такой совмести-
мости его требования могли бы часто игнорироваться. Для соблюдения совместимости
необходим какой-то дополнительный механизм.
В Android эта проблема была решена разрешением надстраивать дополнительные част-
ные службы над платформой с открытым кодом с предоставлением служб (как правило,
облачных), которые не могла реализовывать сама платформа. Поскольку такие службы
были частными, они могли ограничивать круг включаемых в них устройств, требуя,
таким образом, от этих устройств CDD-совместимости.
Google создала Android, чтобы получить возможность поддержки широкого круга част-
ных облачных служб наряду с широким набором служб, представленных самой компа-
нией Google: почтовой службы Gmail, службы синхронизации календаря и контактов,
службы обмена сообщениями между облаком и устройством и многих других, часть
из которых была видима пользователю, а часть — нет. Когда же дело касается предло-
жения совместимых приложений, то наиболее важной службой является Google Play.
Google Play — это онлайн-магазин компании Google для Android-приложений. Как пра-
вило, когда разработчики создают Android-приложения, они выставляют их в Google
Play. Поскольку Google Play (или любой другой магазин приложений) является каналом,
по которому приложения доставляются на Android-устройство, эта частная служба отве-
чает за то, что приложения будут работать на тех устройствах, которым она их доставляет.
878
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
В Google Play используются два основных механизма обеспечения совместимости.
Первый и наиболее важный заключается в требовании того, что любое устройство,
поставляемое с этим магазином, должно быть совместимым Android-устройством,
соответствующим CDD. Тем самым гарантируется основная линия поведения всех
устройств. Кроме того, магазин Google Play должен знать обо всех свойствах устрой-
ства, требуемых приложением (например, о наличии GPS для осуществления навига-
ции по карте), чтобы приложение не было доступно на тех устройствах, у которых это
свойство отсутствует.
10.8.2. История Android
Компания Google разработала Android в середине 2000-х годов, после приобретения
Android в виде недавно созданной компании, находившейся на ранней стадии раз-
вития. Практически все существующие сегодня разработки платформы Android были
выполнены под управлением компании Google.
Ранние разработки
Android, Inc. была компанией по производству программного обеспечения для вы-
сокотехнологичных мобильных устройств. Сначала компания проявляла интерес
к камерам, но вскоре переключилась на смартфоны, так как у них был более обшир-
ный рыночный потенциал. Эта исходная цель вылилась в решение имевшихся на тот
момент проблем в разработках для мобильных устройств путем привнесения в них
открытой платформы, являющейся надстройкой Linux, которая могла бы найти
широкое применение.
Были разработаны прототипы пользовательского интерфейса платформы, демон-
стрирующие положенные в ее основу замыслы. Для поддержки среды разработки
приложений платформа нацеливалась на три основных языка: JavaScript, Java и C++.
Google приобрела Android в июле 2005 года, предоставив необходимые ресурсы и под-
держку облачной службы для продолжения разработки Android до состояния готового
продукта. В это время собралась небольшая сплоченная группа специалистов, присту-
пившая к разработке основной инфраструктуры для платформы и основ для создания
приложений более высокого уровня.
В начале 2006 года планы были существенно скорректированы: вместо поддержки
нескольких языков программирования платформа для разработки приложений была
сфокусирована исключительно на языке программирования Java. Это изменение
далось нелегко, поскольку при исходном многоязыковом подходе всех охватывала
эйфория, связанная с разработкой «лучшей в мире» системы. Сконцентрированность
на одном языке казалась специалистам, предпочитавшим другие языки, шагом назад.
Но попытка сделать всех счастливыми может легко обернуться тем, что не будет
счастлив никто. Подстройка под три различных набора языковых API-интерфейсов
потребовала бы намного больше усилий, чем сфокусированность на одном языке,
сильно сокращая при этом качество поддержки каждого из языков. Решение сконцен-
трироваться на языке Java имело весьма большое значение для оптимизации качества
платформы и способности команды разработчиков уложиться в критические сроки.
Android разрабатывался одновременно с приложениями, которые должны были по-
ставляться в виде надстройки над операционной системой. У компании Google уже
10.8. Android
879
имелся большой выбор разнообразных служб, включая Gmail, Maps, Calendar, YouTube
и, конечно же, Search, которые должны были ставиться поверх Android. Знания, на-
копленные при реализации этих приложений в качестве надстройки над ранней плат-
формой, использовались при конструировании операционной системы. Такая обратная
связь с приложениями позволила избавиться от многих слабых мест в конструкции
платформы еще на ранней стадии разработки.
Основная часть раннего этапа разработки приложений была проделана с небольшой
частью основной платформы, фактически доступной разработчикам. Вся платформа
обычно запускалась внутри одного процесса, через симулятор, запускающий всю си-
стему, а приложения запускались на хост-компьютере как единый процесс. Следы этой
старой реализации видны и сегодня, о чем свидетельствует наличие в пакете программ
для разработки приложений (Software Development Kit (SDK)), которые Android-
программисты используют для написания приложений таких компонентов, как метод
Application.onTerminate.
В июне 2006 года в качестве целей при разработке приложений для планируемой про-
дукции были выбраны два аппаратных устройства. Первое, с кодовым названием Sooner
(«Ранний»), было основано на существующем смартфоне с QWERTY-клавиатурой
и экраном без сенсорного датчика. Целью использования этого устройства стал как
можно более ранний выпуск исходного продукта с использованием существующего
оборудования. Второе целевое устройство, с кодовым названием Dream («Мечта»),
было разработано специально для Android, для запуска его с полным набором преду-
смотренных функций. Оно включало большой (для того времени) сенсорный экран,
выдвижную QWERTY-клавиатуру, 3G-радиоканал (для более быстрого просмотра
веб-страниц), акселерометр, GPS и компас (для поддержки Google Maps), а также не-
которые другие приспособления.
Как только в центре внимания оказался график разработки программного обеспече-
ния, стало ясно, что иметь два графика разработки программ не имеет смысла: к тому
времени, когда появится возможность выпуска Sooner, его оборудование уже устареет.
Поэтому все усилия, прилагаемые к Sooner, были брошены на реализацию более важно-
го устройства Dream. Чтобы решить эту задачу, было решено отказаться от Sooner как
целевого устройства (хотя разработка этого оборудования продолжалась еще некоторое
время, пока не было готово более новое оборудование) и полностью сфокусироваться
на Dream.
Android 1.0
Впервые платформа Android была представлена публике в ноябре 2007 года, это был
предварительный SDK. Он состоял из аппаратного эмулятора, запускающего образ
полноценной системы Android-устройства и основных приложений, API-документации
и среды разработки. К этому моменту уже были готовы основная конструкция и ее ре-
ализация, которая во многом напоминала архитектуру современной системы Android,
которую мы будем рассматривать. Представление включало видеодемонстрации плат-
формы, запущенной на обоих аппаратных устройствах, Sooner и Dream.
На ранних этапах разработка Android велась с прицелом на серии ежеквартальных де-
монстраций, позволяющих показывать ход разработки и управлять процессом. Первым
более официальным выпуском для платформы стал SDK. Это потребовало принятия
всех частей, которые к этому моменту были объединены для разработки приложений,
880
Глава 10. Изучение конкретных примеров: Unix, Linux и Android
проведения их чистки, составления на них документации и создания единой среды
разработки для сторонних разработчиков.
Теперь разработки велись по двум направлениям: реагирования на отзывы об SDK для
дальнейшего совершенствования и завершения разработки API-функций и завершения
и приведения в стабильное состояние реализации, необходимой для поставок Dream-
устройства. За это время выполнен ряд публичных обновлений SDK, кульминацией
которого стал выпуск в августе 2008 года версии 0.9, содержавшей практически готовые
API-функции.
Сама платформа переживала бурное развитие, и весной 2008 года основное внимание
было перенесено на ее стабилизацию, чтобы можно было перейти к поставкам Dream.
К этому моменту в Android содержался большой объем кода, который никогда не по-
ставлялся в виде коммерческого продукта, с полным набором, от частей библиотеки C
до Dalvik-интерпретатора (запускающего приложения), системы и приложений.
В Android также использовалось немало оригинальных конструкторских идей, нигде
ранее не реализованных, и было неясно, насколько они удачны. Все это нужно было
собрать воедино в виде стабильного продукта, и команда провела несколько тревожных
месяцев в ожидании того, все ли их разработки удастся свести воедино и заставить
работать в соответствии с задуманным.
Наконец, в августе 2008 года программное обеспечение было признано стабильным
и готовым к поставкам. Сборки поступили на производство и стали появляться на
устройствах. В сентябре Android 1.0 был запущен на устройстве Dream, которое теперь
называлось T-Mobile G1.
Дальнейшее развитие
После выпуска Android 1.0 разработка продолжалась в быстром темпе. За следующие
5 лет состоялись 15 серьезных обновлений платформы с добавлением к исходному
выпуску версии 1.0 множества новых свойств и усовершенствований.
Исходный документ определения совместимости — Compatibility Definition Docu-
ment — в основном касался только совместимых устройств, которые были во многом
похожи на T-Mobile G1. В течение следующих лет диапазон совместимых устройств
сильно расширился. Давайте перечислим ключевые моменты этого процесса.
1. В течение 2009 года при переходе Android от версии 1.5 к версии 2.0 была создана
программная клавиатура, чтобы можно было избавиться от необходимости иметь
физическую клавиатуру, введена поддержка намного более крупных экранов (как
по размеру, так и по плотности пикселов) для бюджетных QVGA-устройств и но-
вых более крупных устройств с большой плотностью пикселов, таких как WVGA
Motorola Droid. Введено новое средство
Системная возможность
для выдачи отче-
та о том, какие аппаратные возможности они поддерживают, а также приложения
для обозначения того, какие аппаратные возможности им требуются. Последнее
является основным механизмом магазина Google Play, используемого для опре-
деления приложений, совместимых с конкретным устройством.
2. В течение 2011 года при переходе Android от версии 3.0 к версии 4.0 на плат-
форме была введена поддержка нового ядра для 10-дюймовых и более крупных
планшетных компьютеров. Теперь ядро платформы полностью поддерживало
размеры экранов любых устройств, от небольших QVGA-телефонов до смарт-