Опубликовано: журнал "Системный администратор" №7-8, 2013г.
Создаем основу проекта
Продолжаем изучение инструментария Software Development Kit (SDK) — комплекта средств разработки для мобильной платформы Android, начатое в первой части статьи [1].
Нами были рассмотрены утилиты командной строки, которые в составе SDK можно совершенно свободно скачать для использования с сайта Android-разработчиков [2]. Покажем теперь, как с помощью этих инструментов создать первое приложение. По традиции это будет программа, которая выводит на экран фразу, ставшую в среде программистов, можно сказать, классикой. Итак, «HelloWorld!» на экране планшета — вот наша цель!
Как было показано в [1], инструментарий для создания приложений Android доступен для многих популярных операционных систем. Установив SDK, можно приступить к созданию приложения в своей любимой ОС. Для начала откройте консоль (терминал) и в подходящем каталоге создайте подкаталог HelloAndroid.
Если работаете в операционной системе Linux, то скомандуйте:
$mkdir HelloAndroid
Затем выполните следующую команду:
$android create project
--target 1
--name HelloAndroid
--path ./HelloAndroid
--activity HelloAndroid
--package com.example.helloandroid
Напомним, что android
— одна из рассмотренных нами основных утилит командной строки SDK (см. подробности в [1], [3]). Здесь она применяется для создания нового проекта со следующими параметрами:
--target — среда исполнения (target runtime), числовое значение параметра необходимо установить в зависимости от версии Android, для которой создается приложение. Его не стоит путать с понятием «уровень API», а подставить нужно значение id, которое для данного уровня API можно подсмотреть в выводе команды $android list targets
. Забегая вперед, скажем, что иногда для создания приложения под определенную версию мобильной ОС нужно установить дополнительные пакеты в SDK Manager. Для этого, запустив команду $android
без параметров, надо в окне Android SDK Manager отметить нужные пакеты, и нажать «Install packages» (см. рис.1);
Рис.1 Установка дополнительных пакетов в Android SDK Manager в ОС Ubuntu
--name и --path — соответственно имя и путь к файлам проекта;
--activity HelloAndroid. Activity (иногда переводят как «явление») в Android — сущность, которая отождествляется с отдельным экраном (окном) приложения с элементами пользовательского интерфейса. В распоряжении разработчиков имеются и другие варианты выполнения приложений (см. Таблица 1), например, Service — фоновая «служба» без пользовательского интерфейса (см. подробности в [4]). Однако, для вывода информации на экран нам понадобится создать именно Activity. HelloAndroid здесь – это имя Activity;
--package — этот параметр приложения обязателен, как и в обычной Java-программе , и должен быть уникальным. В идеальном случае он представляет собой DNS-имя сайта разработчика, записанное наоборот, но наша программа — всего лишь тест, поэтому подойдет что-то вроде com.example.helloandroid.
В результате выполнения команды $android create project
будут созданы все необходимые файлы и каталоги для компиляции, сборки и запуска нашего проекта. Но прежде чем сделать это, рассмотрим подробнее его структуру.
Таблица 1. Другие типы пользовательских компонентов в Android (кроме Activity и Service)
Content Provider (поставщик содержимого) | управляет общим набором данных приложения. Речь идет о содержимом, доступ к которому не ограничен одной программой, как пример - база данных «Адресная книга» |
Broadcast Receiver | компонент, который отвечает на объявления системных рассылок, и используется в случаях, когда необходимо перехватывать системные события - о низком заряде батарей или о том, что другое приложение выполнило «закачку» данных и т.д. |
Структура проекта
Опишем основные детали каркаса Android-проекта, знание которых необходимо для понимания процесса создания приложения.
Каталог src/. В этом каталоге располагаются исходные тексты программ проекта. Здесь утилита android создала ряд вложенных каталогов, соответствующий параметру --package com.example.helloandroid
(в данном случае, com/example/helloandroid
), и файл с исходным кодом на языке Java, имя которого мы указывали в параметре --name
, а именно - HelloAndroid.java.
Заметим также, что приложения Android не имеют единой точки входа, подобной функции main() в языках C/C++ или одноименному статическому методу в Java. Вместо этого, просмотрев файл HelloAndroid.java, мы увидим лишь класс HelloAndroid, унаследованный от класса Activity.
Файл AndroidManifest.xml (манифест-файл приложения — см. Листинг 1). Описывает основные характеристики приложения. Для нашего простого проекта достаточно того, что этот файл был сгенерирован автоматически. Открыв его в текстовом редакторе или просмотрев Листинг 1, можно убедиться, что в нем содержится информация о названии приложения, ссылка на используемую пиктограмму, а также некоторые другие параметры, относящиеся непосредственно к Activity, которые означают, что наше приложение может быть запущено (элемент <intent-filter>
с параметром <category android:name= "android.intent.category.LAUNCHER" />
) и будет отображено в списке приложений Android. А также, что Activity является главным для этого приложения (параметр <action android:name= "android.intent.action.MAIN" />
).
Листинг 1. Манифест-файл приложения HelloAndroid - AndroidManifest.xml
Три основных компонента приложений - Activity, Service и Broadcast receiver — активируются при помощи сообщений, называемых намерениями (intent). Например, если необходимо чтобы другое приложение (или пользователь) могло запустить Activity (как в нашем случае), нужно добавить соответствующий элемент <intent-filter> (фильтр намерений) с параметром <category android:name="android.intent.category.LAUNCHER" /> в элемент <Activity> в манифест-файле. См. Листинг 1. |
Каталог res/. Состоит из нескольких подкаталогов. В них содержатся ресурсы приложения. В drawable-hdpi, например, лежат рисунки для экранов с высоким разрешением. Рисункам для экранов других разрешений отведено место в соседних подкаталогах drawable. Интерес представляют также и два других каталога, layout/ и values/ — в них после создания нашего проекта появятся файлы main.xml и string.xml. О них мы обязательно поговорим позднее.
Итак, мы закончили беглый обзор структуры нашего проекта. Будьте уверены, мы в одном шаге от нашей цели! Создатели SDK настолько любят классику, что подготовили все для нашего «Hello World!» на экране эмулятора или планшета.
Установка и запуск приложения
Ну что же, настало время собрать наше приложение и установить его на эмулятор или на имеющееся под рукой устройство с операционной системой Android! Для этого необходимо сделать директорию проекта текущей:
$cd HelloAndroid
и выполнить следующую команду:
$ant debug
Здесь к работе подключается утилита ant, которая сделает всю черновую работу — прочитает параметры приложения из манифест-файла, скомпилирует java-файлы, извлечет ресурсы и упакует все в один файл с расширением .apk (Android Package), который представляет собой формат архивных исполняемых файлов-приложений для Android.
Не исключено, что выполнение команды пройдет не совсем гладко (см. список возможных ошибок в Таблице 2). Однако, если все необходимые программы и пакеты установлены, то на экране консоли через какое-то время появится сообщение о том, что все прошло без проблем: «BUILD SUCCESSFUL».
Таблица 2. Возможные ошибки при выполнении команды $ant debug
«Unknown command - ant/неизвестная команда - ant» | Необходимо установить программу ant. В зависимости от платформы — скачайте и распакуйте архив (см. ссылку [5]) или добавьте необходимый пакет. В Ubuntu, например, это можно сделать командой $sudo apt-get install ant1.8. Укажите также путь к утилите ant в переменной окружения PATH; |
«SDK does not have any Build Tools installed» | Означает, что при обновлении SDK не был отмечен пакет «Android SDK Build-tools». Необходимо установить пакет; |
«Unable to find a javac compiler» | В системе не найден JDK. Необходимо установить JDK (не ниже JDK 6) и определить переменную окружения JAVA_HOME, с указанием в ней пути к JDK. |
После выполнения предыдущей команды в каталоге проекта можно обнаружить новый подкаталог bin/. Там лежит скомпилированный файл нашего приложения — HelloAndroid-debug.apk. Приставка -debug означает что .apk-файл был собран в отладочном режиме (такой файл непригоден, например, для распространения через Google Play, об этом подробнее см. [6]).
Перейдем в подкаталог bin/ чтобы установить приложение:
$cd bin
Затем запустим эмулятор,
$emulator @em1
дождемся его загрузки и установим на него приложение:
$adb -e install HelloAndroid-debug.apk
Такая же команда, но с ключом -d, установит приложение на реальное устройство, подключенное к компьютеру. После сообщения об успешной установке найдите программу HelloAndroid в списке установленных приложений, запустите ее и... обязательно увидите на экране «Hello World, HelloAndroid».
Рис.2 Приложение HelloAndroid, установленное на эмуляторе в ОС Windows 7
Использование ресурсов Android-приложения
Постойте, скажет внимательный читатель, — а откуда на экране эмулятора или планшета появилась надпись «Hello World»? Если посмотреть исходный код в файле HelloAndroid.java из каталога /com/example/helloandroid проекта (см. Листинг 2), то ничего подобного «написать что-то где-то» мы не увидим. Для ответа на наш вопрос разберем подробнее применение ресурсов приложения (загляните в каталог res/ нашего проекта).
Листинг 2. Файл HelloAndroid.java из каталога src/com/example/helloandroid
import android.app.Activity;
import android.os.Bundle;
public class HelloAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
Нужно сказать, что если вы собираетесь писать приложения для Android, вам придется «полюбить» xml-формат. Именно его использует SDK для хранения ресурсов, всевозможных настроек (вспомните файл AndroidManifest.xml) и т.д. Отметим также, что Android SDK не одинок в использовании расширяемого языка разметки для построения графического интерфейса пользователя (GUI). Подобные технологии используют и другие современные фреймворки (Mozilla XUL, JavaFX, Microsoft Silverlight).
Чтобы понять откуда появились элементы графического интерфейса в нашем приложении, вспомним о двух xml-файлах проекта, которые уже упоминали ранее. Приведем эти файлы в Листингах 3 и 4.
Листинг 3. Файл /res/layout/main.xml
<LinearLayout xmlns:android="http:||schemas.android.com|apk|res|android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, HelloAndroid"
/>
</LinearLayout>
Листинг 4. Файл /res/values/strings.xml
<resources>
<string name="app_name">HelloAndroid</string>
</resources>
Рассмотрим файл main.xml подробнее (см. Листинг 3). Данные из этого и подобных ему файлов из каталога layout/ и используются для построения GUI в Android. Здесь мы видим также применение концепции Менеджера размещения (Layout), которая хорошо известна тем, кто работал, например, с библиотекой Java Swing — посмотрите на элемент <LinearLayout>
с параметрами orientation, layout_width, layout_height. А атрибуты элемента <TextView>
ответят на вопрос: «Откуда появилось приветствие Hello World на экране»?
По названию и содержанию файла values/string.xml видно, что он содержит описания строковых ресурсов приложения, а элемент с именем «app_name» — это название приложения, которое используется в файле AndroidManifest.xml в строке
android:label="@string/app_name"
И последнее о ресурсах. При сборке проекта в Android SDK автоматически генерируется вспомогательный класс, создающий ссылки на ресурсы проекта. Он называется R-класс (посмотрите каталог /gen/com/example/helloandroid). Теперь становится более понятной строка:
setContentView(R.layout.main);
файла HelloAndroid.java. Она говорит Java-машине примерно следующее: «Вывести на экран то, что содержится в файле определения разметки формы и ее элементов (/res/layout/main.xml), ссылки на ресурсы которых находятся в классе R».
В заключении хочется сказать, что в статье на примере простейшего приложения была показана структура проекта Android, логика взаимодействия различных частей проекта между собой, а также технология создания приложения с помощью инструментов SDK. Были пройдены практически все этапы создания приложения — от установки SDK до копирования на устройство. Конечно, мы не затронули еще множество аспектов разработки и нюансов различных технологий. Однако, если у читателя есть запас терпения и старания, то изучив API Android на примерах решения конкретных задач и закрепив знания на практике можно будет уверенно сказать: «Программирование для Android? Это - просто!».
P.S. Здесь попытался собрать (чтобы было под рукой) полезные команды для Android-разработчика (выполняются в командной строке, в Android Studio можно пользоваться вкладкой "Terminal", для некоторых команд необходимо обладать root-правами на Android-устройстве):
На компьютере разработчика | |
---|---|
adb devices | На компьютере разработчика - посмотреть подключенные к компьютеру Android-устройства |
adb -s emulator-5554 shell | На компьютере разработчика - подключиться к эмулятору для работы в командной строке (Unix-shell), "emulator-5554" имя устройства, подсмотренное в предыдущей команде |
adb push /path/to/file /avd/path | скопировать файл из /path/to/file хоста в /avd/path эмулятора |
adb install TheAppName.apk | Установить приложение TheAppName.apk. Аналогично использованию команды push необходимо указать путь к файлу .apk. См. далее здесь |
На Android-устройстве | |
ps | Вывод в shell списка запущенных процессов |
logcat | Вывод в shell Android-лога в режиме "реального времени". Будьте внимательны - лог очень большой, для фильтрации необходимых сообщений можно использовать фильтр grep, например так logcat | grep sound |
sqlite3 /data/data/ru.learn2prog.control.controller/databases/base.db | В shell эмулятора (или телефона) - подключиться к базе данных для работы в консоли СУБД Sqlite, "/data/data/ru.learn2prog.control.controller/databases/base.db" путь и имя базы данных приложения. |
netcfg | Посмотреть настройки сетевых интерфейсов |
am broadcast -a android.intent.action.BOOT_COMPLETED или am broadcast -a android.intent.action.BOOT_COMPLETED my.package.name |
Отправить системное сообщение ACTION_BOOT_COMPLETED всем приложениям или приложению my.package.name (вторая команда) |
.exit или .quit или Ctrl+Z | выход из консоли СУБД Sqlite |
Источники:
1. Программирование для Android? Это просто! Часть 1. //Системный администратор, №6, 2013г.
2. Сайт Google для разработчиков Android-приложений - http://developer.android.com
3. Страница Creating an Android Project (создание Android проекта) сайта для разработчиков на английском языке http://developer.android.com/intl/ru/training/basics/firstapp/creating-p...
4. Хашими С., Коматинени С., Маклин Д. Разработка приложений для Android. - СПб.: Питер, 2011, с.56.
5. Страница загрузки Ant http://ant.apache.org/bindownload.cgi
6. Publishing Overview — материал о распространении Android-приложений http://developer.android.com/intl/ru/tools/publishing/publishing_overvie...
Продолжение темы - статья об использовании ресурсов в Android.