Учебные материалы

Создание Android-проектов с использованием Maven

Этот урок освещает создание простого Android проекта с Maven.

Что вы создадите

Вы создадите Android приложение, которое отображает время дня, а потом соберете его Maven'ом.

Что вам потребуется

  • Примерно 15 минут свободного времени
  • Любимый текстовый редактор или IDE
  • JDK 6 и выше
  • Android SDK
  • Android устройство или эмулятор

Как проходить этот урок

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

Чтобы начать с нуля, перейдите в Настройка проекта.

Чтобы пропустить базовые шаги, выполните следующее:

Когда вы закончите, можете сравнить получившийся результат с образцом в gs-maven-android/complete.

Настройка проекта

Для начала, вам необходимо настроить Android проект для сборки Maven. Т.к. основное внимание данного урока уделено Maven, сделайте проект настолько простым, насколько это возможно. Если вы впервые работаете с Android проектами, установите и настройте ADT.

Создание структуры каталогов

В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/org/hello для *nix систем:

└── src
    └── main
        └── java
            └── org
                └── hello

Создание Android манифеста

Android Manifest содержит всю информацию, необходимую для запуска Android приложения и оно не будет собираться без него.

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.hello"
    android:versionCode="1"
    android:versionName="1.0.0" >

    <application android:label="@string/app_name" >
        <activity
            android:name=".HelloActivity"
            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>

Добавьте текстовую строку. Текстовые строки могут ссылаться на файлы приложения или другие источники.

res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Android Maven</string>
</resources>

Теперь определите визуальную структуру пользовательского интерфейса вашего приложения.

res/layout/hello_layout.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:id="@+id/text_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

В директории src/main/java/org/hello вы можете создать любой Java класс, какой захотите. В соответствии с задачей урока, создайте следующий класс:

src/main/java/org/hello/HelloActivity.java

package org.hello;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_layout);
    }

    @Override
    public void onStart() {
        super.onStart();
        TextView textView = (TextView) findViewById(R.id.text_view);
        textView.setText("Hello world!");
    }

}

Установка Maven

Теперь у вас есть проект, который вы можете собрать с помощью Maven. Следующим шагом будет установка Maven.

Загрузите Maven как zip-файл с http://maven.apache.org/download.cgi. Достаточно только бинарники, поэтому смотрите ссылку на apache-maven-{version}-bin.zip или apache-maven-{version}-bin.tar.gz.

Загрузите и распакуйте файл, затем добавьте bin каталог в переменную окружения PATH.

Чтобы протестировать устаноку Maven, запустите mvn из командной строки:

mvn -v

Если все хорошо, то вы должны увидеть информацию об установке, похожую на эту:

Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T11:37:52-06:00)
Maven home: /usr/local/apache-maven/apache-maven-3.2.1
Java version: 1.8.0, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.2", arch: "x86_64", family: "mac"

Теперь у вас есть установленный Maven.

Настройка простой Maven сборки

Теперь, когда Maven установлен, вам необходимо создать определение Maven проекта через XML-файл pom.xml. Помимо всего остального, этот файл содержит имя проекта, версию и зависимости, которые он имеет от внешних библиотек.

Создайте файл с названием pom.xml в корне проекта и поместите в него следующее содержимое:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.hello</groupId>
    <artifactId>gs-maven-android</artifactId>
    <version>0.1.0</version>
    <packaging>apk</packaging>

    <properties>
        <!-- используйте UTF-8 для всех -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>4.1.1.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.9.0-rc.1</version>
                <configuration>
                    <sdk>
                        <platform>19</platform>
                    </sdk>
                    <deleteConflictingFiles>true</deleteConflictingFiles>
                    <undeployBeforeDeploy>true</undeployBeforeDeploy>
                </configuration>
                <extensions>true</extensions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Это простейший pom.xml файл, который необходим для сборки Android проекта. Он состоит из следующих настроек проекта:

  • <modelVersion> - версия POM модели(всегда 4.0.0)
  • <groupId> - Группа или организация, которой принадлежит проект
  • <artifactId> - Имя, которое будет дано артефакту библиотеки проекта(к примеру, название этого АРК файла)
  • <version> - Версия проекта, с которой он будет собран
  • <packaging> - Как проект будет собран, в данном случае как Android APK

Секция dependencies определяет список зависимостей проекта. В частности, она определяет единственную зависимость от Android библиотеки. В элементе dependency зависимость определяется деревом дочерних элементов:

  • <groupId> - Группа или огранизация, которой принадлежит зависимость
  • <artifactId> - Требуемая библиотека
  • <version> - Конкретная версия требуемой библиотеки
  • <scope> - Область видимости зависимостей. По умолчанию - compile, т.е. доступные во время компиляции

В данном случае <scope> элемент имеет значение provided. Зависимости этого типа необходимы для компиляции кода проекта, но будут доступны и во время выполнения кода. К примеру, Android API всегда доступен, когда Android приложение запущено.

Секция <build> определяет дополнительную конфигурацию для сборки приложения. В этой секции есть секция <plugins>, которая содержит список плагинов, которые добавляют функциональность процессу сборки. Здесь определена конфигурация для Android Maven Plugin. Для этой зависимости также имеются элементы <groupId>, <artifactId> и <version>. Плагин также содержит следующие элементы:

  • <configuration> - Конфигурация плагина. Здесь вы определяете, с каким Android Platform SDK будет собираться проект
  • <extensions> - Комбинация указания значений true и apk для <packaging> передает управление [Android Maven Plugin] в процессе сборки.

На текущий момент вы определили пока минимальный Maven проект.

Сборка Android кода

Сейчас Maven готов к сборке. Вы можете выполнить выполнить несколько задач сборки уже сейчас, включая компиляцию кода проекта, создание библиотеки пакета(JAR файл) и установить библиотеку в локальный репозиторий Maven зависимостей.

Попробуйте собрать:

mvn compile

Эта команда запускает Maven, говоря ему выполнить задачу compile. Когда он завершит её, вы должны найти скомпилированные .class файлы в каталоге target/classes.

Т.к. вы вряд ли захотите работать или распостранять .class файлы непосредственно, взамен этого возможно запустить package задачу:

mvn package

Эта задача компилирует ваш Java код, запускает тесты и упаковывает код в JAR файл каталоге target. Имя JAR файла состоит из значений <artifactId> и <version> проекта. К примеру, исходя из содержимого pom.xml файла, отображенного ранее, JAR файл будет называться gs-maven-android-0.1.0.jar.

Т.к. вы установили значение элемента <packaging> в "apk", результатом будет АРК файл в target каталоге в дополнение к JAR файлу. Этот АРК файл является упакованным Android приложением, готовым к развертыванию на устройстве или эмуляторе.

Android Maven плагин предоставляет несколько Maven задач, которые вы можете использовать в различных фазах процесса сборки или взаимодействия с устройством и эмулятором. Список доступных задач вы можете увидеть, выполнив команду:

mvn android:help

Описание записимостей

Простой Hello World пример полностью самодостаточен и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений, зависят от внешних библиотек, предоставляющих некоторую функциональность.

К примеру, предположим, что вы хотите, чтобы приложение отображало текущие дату и время. Несмотря на то, что вы фактически можете использовать дату и время из нативных Java библиотек, возможно использовать более интересные для этого вещи, которые предоставляют Joda Time библиотеки.

Для этого, измените HelloActivity.java как показано ниже:

src/main/java/org/hello/HelloActivity.java

package org.hello;

import org.joda.time.LocalTime;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class HelloActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.hello_layout);
    }

    @Override
    public void onStart() {
        super.onStart();
        LocalTime currentTime = new LocalTime();
        TextView textView = (TextView) findViewById(R.id.text_view);
        textView.setText("The current local time is: " + currentTime);
    }

}

В этом примере используемый Joda Time LocalTime класс возвращает и отображает текущее время.

Если вы запустите mvn package сейчас, то сборка завершится с ошибкой, потому что вы не описали Joda Time как компилируемую зависимость в сборке. Для исправления этой ошибки, просто добавьте следующие строки в секцию <dependencies> файла pom.xml.

<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.3</version>
</dependency>

Пересборка Android кода с зависимостями

Теперь, если вы выполните mvn compile или mvn package, то Maven должен разрешить Joda Time зависимость из Maven Central репозитория и успешно собрать проект.

Ниже приведена полная версия pom.xml файла:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.hello</groupId>
    <artifactId>gs-maven-android</artifactId>
    <version>0.1.0</version>
    <packaging>apk</packaging>

    <properties>
        <!-- use UTF-8 for everything -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.android</groupId>
            <artifactId>android</artifactId>
            <version>4.1.1.4</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>com.jayway.maven.plugins.android.generation2</groupId>
                <artifactId>android-maven-plugin</artifactId>
                <version>3.9.0-rc.1</version>
                <configuration>
                    <sdk>
                        <platform>19</platform>
                    </sdk>
                    <deleteConflictingFiles>true</deleteConflictingFiles>
                    <undeployBeforeDeploy>true</undeployBeforeDeploy>
                </configuration>
                <extensions>true</extensions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Итог

Поздравляем! Вы только что создали простой, но эффективный Maven проект с целью сборки Android проектов.

С оригинальным текстом урока вы можете ознакомиться на spring.io.

comments powered by Disqus