Zeyomir's Blog Bo piękniej jest wiedzieć coś o wszystkim…

3Gru/13Off
» «

Android i maven w jednym stali domu- podstawy

Pisanie aplikacji na androida jest dość łatwe i przyjemne. Przynajmniej do czasu kiedy trzeba dołączyć zewnętrzną bibliotekę... a potem kolejną... i kolejną... a potem jeszcze przekazać taki projekt innym programistom.

W świecie Javy "serwerowej" problem zarządzania zależnościami i ogólnie pojętej konfiguracji projektu i procesu budowania został rozwiązany już dawno. Aż dziwne, że w świecie Androida rozwiązanie to jest wciąż tak słabo znane. Mowa oczywiście o mavenie (oczywiście jest tego więcej, ale maven jest chyba najbardziej znany i nim właśnie się zajmiemy).

Maven pozwala opisać w formie xmla wszystkie zależności (biblioteki) projektu, oraz daje możliwość automatycznego ich pobrania. Oprócz tego możemy w tym samym xmlu opisać w jaki sposób projekt powinien wyglądać (jakie mamy foldery i który co zawiera) i jak ma być budowany (to tak w skrócie- oczywiście możliwości ma dużo więcej, a dodając pluginy to możliwości są wręcz nieograniczone). Nie przedłużając- podam krótki przepis jak używać mavena w projektach androidowych.

Krok 1. Instalacja mavena :)

Żeby czegoś używać, trzeba to najpierw mieć ;). Pobieramy sobie mavena ze strony projektu. Proponuję zaciągnąć od razu 2 wersje: 3.1.1 i 3.0.5. Jest to spowodowane tym, że niestety nie wszystko jest jeszcze kompatybilne z nowszymi wersjami, a z kolei część rzeczy będzie wymagać wersji najnowszej dostępnej. Przynajmniej na początku czeka nas więc odrobina żonglowania wersjami.

Ściągnięte archiwa rozpakowujemy gdzieś na dysku. Proponuję rozpakować obok siebie w katalogach odpowiednio maven3 i maven31. Teraz musimy dodać odpowiednie zmienne środowiskowe- u mnie wygląda to tak (ja mam mavena 3.0.5, Ty na razie wskaż ścieżkę do mavena 3.1.1):

JAVA_HOME = C:\Program Files\Java\jdk1.7.0_45
M2_HOME = D:\Dev\maven
PATH += ;D:\Dev\maven\bin

Teraz otwórzmy konsolę (cmd.exe). Sprawdzamy czy możemy wywołać mavena:

C:\>mvn --version
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 14:51:28+0100)
Maven home: D:\Dev\maven
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.7.0_45\jre
Default locale: pl_PL, platform encoding: Cp1250
OS name: "windows 8", version: "6.2", arch: "amd64", family: "windows"
Krok 2. Konfigurujemy repozytorium (nieobowiązkowe)

Domyślnie maven będzie ściągał wszystkie biblioteki do katalogu .m2/repository w katalogu głównym użytkownika. Nie ma w tym nic złego, ja jednak wolę mieć je na osobnym dysku dzięki czemu nie muszę ściągać bibliotek od nowa po formacie ;). Możemy wymusić zmianę miejsca trzymania tego repozytorium bibliotek dodając w pliku .m2/settings.xml (tworząc go jeśli jeszcze nie istnieje) następujący snippet:

<settings>
<localRepository>D:\Dev\maven_repo</localRepository>
</settings>
Krok 3. Dodajemy biblioteki androida do naszego repo

Gdyby świat był piękny, nie potrzebowalibyśmy tego kroku. Niestety w momencie pisania tego wpisu najnowsza dostępna wersja androida to 4.4 (KitKat), a w oficjalnym repozytorium mavena nadal wisi wersja 4.1. Czy to się zmieni? Ciężko powiedzieć... na szczęście możemy sami "włożyć"  potrzebne biblioteki do naszego lokalnego repozytorium. Spokojnie, nie będziemy tego robić ręcznie :). Zrobi to za nas ten projekt. Zasadniczo wszystko jest ładnie opisane w readme, ale dla wygody opiszę proces tutaj:

  1. uzupełniamy zmienne środowiskowe:
    ANDROID_HOME = D:\Dev\Android\android-sdk\sdk
    PATH += ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools
  2. upewniamy się, że w android-sdk\sdk\platforms mamy foldery z nazwami w stylu android-api_level, np android-19 (jeśli nie, to znaczy, że mamy starego sdk-managera, wywalamy cały folder android-sdk i ściągamy najnowszą wersję)
  3. ściągamy WSZYSTKIE pakiety z androidowego sdk-managera
  4. ściągamy powyższy projekt (po prawej mamy 'download zip'), rozpakowujemy, wchodzimy do tego katalogu z konsoli
  5. wydajemy komendę mvn install

W tym miejscu powinniśmy zmienić zmienne systemowe tak, żeby wskazywały na mavena 3.0.5.

Krok 4A. Wygenerowanie projektu mavenowo-androidowego

Istnieje możliwość wygenerowania gotowego projektu androidowo-mavenowego. Wystarczy w konsoli wklepać to (zamieniając your.company na nazwę głównego pakietu jakiego chcemy używać oraz my-android-application na nazwę naszej aplikacji):

mvn archetype:generate
-DarchetypeArtifactId=android-quickstart
-DarchetypeGroupId=de.akquinet.android.archetypes
-DarchetypeVersion=1.0.11
-DgroupId=your.company
-DartifactId=my-android-application

więcej w tym temacie w dokumentacji.

Jest to niezły sposób, żeby szybko zobaczyć 'o co w tym wszystkim chodzi', nie jest jednak doskonały. Używa bibliotek androida z głównego repo mavena, przez co nie mamy dostępu do najnowszych wersji. Możemy to oczywiście w prosty sposób naprawić, ustawiając zależności w taki sposób jak przy zmienianiu projektu androidowego w mavenowy (krok 4B).

Krok 4B. Zmienienie zwykłego projektu androidowego w projekt mavenowy

Można by oczywiście stworzyć nowy projekt mavenowy i przekopiować do niego źródła ręcznie, ale jest to droga na około. Zmienienie naszego projektu w projekt mavenowy jest całkiem proste. Wystarczy dodać w głównym katalogu projektu plik pom.xml z poniższą zawartością:

<?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">
  <properties>
    <version>0.6.4.1</version>
    <sdk>19</sdk>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.zeyomir.ocfun</groupId>
  <artifactId>ocFun</artifactId>
  <version>${versionName}</version>
  <packaging>apk</packaging>
  <name>OpenCachingFun</name>
  <dependencies>
    <dependency>
      <groupId>android</groupId>
      <artifactId>android</artifactId>
      <version>4.4_r1</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>${project.artifactId}</finalName>
    <sourceDirectory>src/main/java</sourceDirectory>
    <plugins>
      <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>android-maven-plugin</artifactId>
        <version>3.6.0</version>
        <configuration>
          <sdk>
            <platform>${sdk}</platform>
          </sdk>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

A następnie usunąć niepotrzebne już pliki i foldery: libsbin, build.xml, build.properties. Oczywiście w version, name, artifactId i groupId wstaw wartości odpowiednie dla Twojego projektu. W powyższym przykładzie wykorzystywany jest android 4.4 (api v.19)- najnowszy dostępny na dzień pisania wpisu. Powinieneś ustawić takie samo jakie masz w target sdk w swoim AndroidManifest.xml.

Co dalej?

I to tyle jeśli chodzi o podstawy- masz już wstępnie skonfigurowany projekt mavenowy. W drugiej części pokażę jak do projektu dodawać biblioteki i skąd je brać, a także bardziej zaawansowane wykorzystanie mavena i maven-android-plugin (w tym deployowanie i debugowanie na emulatorze/urządzeniu usb i generowanie podpisanych plików apk gotowych do publikowania w sklepie Google Play).

» «
Tagged as: , Komentarze
Komentarze (1) Trackbacks (0)
  1. Hi
    Generalnie fajny tutorial, niewiele jest przydatnych rzeczy w sieci na ten temat. Mam tylko jedną uwagę… pisz więcej dlaczego coś trzeba zrobić, a nie tylko ‚że trzeba’.

    Na przykład „W tym miejscu powinniśmy zmienić zmienne systemowe tak, żeby wskazywały na Mavena 3.0.5.”. Proponuję dodać chociaż info o znanym issue 225 (http://code.google.com/p/maven-android-plugin/issues/detail?id=225), przynajmniej dopóki nie jest to naprawione. Przydało by się też info jak doinstalować (używając toola mosabua) google-apis i tylko wybrane wersje androida (np.: mvn install -P 2.3.3).


Trackbacks are disabled.