Программирование для Android - это просто! Android для начинающих ч.II

Опубликовано: журнал "Системный администратор" №7-8, 2013г.

Создание приложения с помощью Android SDK и инструментов командной строки

Создаем основу проекта

Продолжаем изучение инструментария 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);


Окно Android SDK Manager
Рис.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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http:||schemas.android.com|res|android"
 package="com.example.helloandroid"
 android:versionCode="1"
 android:versionName="1.0">
  <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
    <activity android:name="HelloAndroid" android:label="@string/app_name">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>
Три основных компонента приложений - 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».

Приложение HelloAndroid в эмуляторе
Рис.2 Приложение HelloAndroid, установленное на эмуляторе в ОС Windows 7

Использование ресурсов Android-приложения

Постойте, скажет внимательный читатель, — а откуда на экране эмулятора или планшета появилась надпись «Hello World»? Если посмотреть исходный код в файле HelloAndroid.java из каталога /com/example/helloandroid проекта (см. Листинг 2), то ничего подобного «написать что-то где-то» мы не увидим. Для ответа на наш вопрос разберем подробнее применение ресурсов приложения (загляните в каталог res/ нашего проекта).

Листинг 2. Файл HelloAndroid.java из каталога src/com/example/helloandroid

package 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

<?xml version="1.0" encoding="utf-8"?>

<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

<?xml version="1.0" encoding="utf-8"?>

<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.