Erzeugen einer Android App unter Linux auf der Konsole

Arbeiten mit dem Android Studio kann heute jedes Kind. Mal eben eine neue Furz App bauen oder einen Online Shop in einer Android App einbinden. Alles kein Problem und tausend Mal gemacht. Aber wie währe es, den kompletten Build Prozess auf einem Server zu automatisieren? Auch dafür gibt es eine Lösung und die setzt sich aus dem Android SDK für Linux und gradle zusammen.
Die Installation und Einrichtung ist eigentlich nicht kompliziert, aber es sind doch eine ganze Reihe von Schritten nötig, um die Umgebung unter OpenSUSE einzurichten.
1. Download Android SDK für Linux

android@openSUSE-421-64-minimal:~> wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
--2016-01-11 13:39:28--  http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
Resolving dl.google.com (dl.google.com)... 2a00:1450:4009:802::200e, 216.58.213.174
Connecting to dl.google.com (dl.google.com)|2a00:1450:4009:802::200e|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 326412652 (311M) [application/x-tar]
Saving to: ‘android-sdk_r24.4.1-linux.tgz’
100%[=========================================>] 326,412,652 78.1MB/s   in 5.3s
2016-01-11 13:39:34 (58.9 MB/s) - ‘android-sdk_r24.4.1-linux.tgz’ saved [326412652/326412652]

2. Entpacken der Zip Datei

android@openSUSE-421-64-minimal:~> tar -xvzf android-sdk_r24.4.1-linux.tgz
….
android@openSUSE-421-64-minimal:~/android-sdk-linux> ls -altr
total 24
-rw-r--r--  1 android users 1158 Oct 14 03:57 SDK Readme.txt
drwxr-xr-x  2 android users 4096 Oct 14 03:57 platforms
drwxr-xr-x  2 android users 4096 Oct 14 03:57 add-ons
drwxr-xr-x  5 android users 4096 Oct 14 03:57 .
drwxr-xr-x 12 android users 4096 Oct 14 10:02 tools
drwxr-xr-x  3 android users 4096 Jan 11 13:40 ..

3. Update des SDK durchführen
Warum jetzt schon eine Update? Weil es in der Datei SDK Readme.txt steht:
Zitat:
The Android SDK archive initially contains only the basic SDK tools. It does not contain an Android platform or any third-party libraries. In fact, it doesn’t even have all the tools you need to develop an application.

From the command-line you can also directly trigger an update by
executing:
tools/android update sdk –no-ui

Also gut. Erst mal ein Update …

android@openSUSE-421-64-minimal:~/android-sdk-linux> tools/android update sdk --no-ui
Refresh Sources:
  Fetching https://dl.google.com/android/repository/addons_list-2.xml
  Validate XML
  Parse XML
  Fetched Add-ons List successfully
  Refresh Sources
  Fetching URL: https://dl.google.com/android/repository/repository-11.xml
  Validate XML: https://dl.google.com/android/repository/repository-11.xml
  Parse XML:    https://dl.google.com/android/repository/repository-11.xml
  Fetching URL: https://dl.google.com/android/repository/addon.xml
  Validate XML: https://dl.google.com/android/repository/addon.xml
  Parse XML:    https://dl.google.com/android/repository/addon.xml
  Fetching URL: https://dl.google.com/android/repository/addon-6.xml
  Validate XML: https://dl.google.com/android/repository/addon-6.xml
  Parse XML:    https://dl.google.com/android/repository/addon-6.xml
  Fetching URL: https://dl-ssl.google.com/glass/gdk/addon.xml
  Validate XML: https://dl-ssl.google.com/glass/gdk/addon.xml
  Parse XML:    https://dl-ssl.google.com/glass/gdk/addon.xml
  Fetching URL: https://dl.google.com/android/repository/extras/intel/addon.xml
  Validate XML: https://dl.google.com/android/repository/extras/intel/addon.xml
  Parse XML:    https://dl.google.com/android/repository/extras/intel/addon.xml
  Fetching URL: https://dl.google.com/android/repository/sys-img/android/sys-img.xml
  Validate XML: https://dl.google.com/android/repository/sys-img/android/sys-img.xml
  Parse XML:    https://dl.google.com/android/repository/sys-img/android/sys-img.xml
  Fetching URL: https://dl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Validate XML: https://dl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Parse XML:    https://dl.google.com/android/repository/sys-img/android-wear/sys-img.xml
  Fetching URL: https://dl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Validate XML: https://dl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Parse XML:    https://dl.google.com/android/repository/sys-img/android-tv/sys-img.xml
  Fetching URL: https://dl.google.com/android/repository/sys-img/google_apis/sys-img.xml
  Validate XML: https://dl.google.com/android/repository/sys-img/google_apis/sys-img.xml
  Parse XML:    https://dl.google.com/android/repository/sys-img/google_apis/sys-img.xml
  Fetching URL: https://dl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Validate XML: https://dl.google.com/android/repository/sys-img/x86/addon-x86.xml
  Parse XML:    https://dl.google.com/android/repository/sys-img/x86/addon-x86.xml
.....
Installing Archives:
  Preparing to install archives
  Downloading Android SDK Platform-tools, revision 23.1
  Installing Android SDK Platform-tools, revision 23.1
  Stopping ADB server failed (code -1).
    Installed Android SDK Platform-tools, revision 23.199%)
  Downloading Android SDK Build-tools, revision 23.0.2
  Installing Android SDK Build-tools, revision 23.0.2
    Installed Android SDK Build-tools, revision 23.0.299%)
  Downloading Documentation for Android SDK, API 23, revision 1
  Installing Documentation for Android SDK, API 23, revision 1
    Installed Documentation for Android SDK, API 23, revision 199%)
  Downloading SDK Platform Android 6.0, API 23, revision 2
  Installing SDK Platform Android 6.0, API 23, revision 2
    Installed SDK Platform Android 6.0, API 23, revision 297%)
  Downloading SDK Platform Android 5.1.1, API 22, revision 2
  Installing SDK Platform Android 5.1.1, API 22, revision 2
    Installed SDK Platform Android 5.1.1, API 22, revision 296%)
  Downloading SDK Platform Android 5.0.1, API 21, revision 2
  Installing SDK Platform Android 5.0.1, API 21, revision 2
    Installed SDK Platform Android 5.0.1, API 21, revision 296%)
  Downloading SDK Platform Android 4.4W.2, API 20, revision 2
  Installing SDK Platform Android 4.4W.2, API 20, revision 2
    Installed SDK Platform Android 4.4W.2, API 20, revision 297%)
  Downloading SDK Platform Android 4.4.2, API 19, revision 4
  Installing SDK Platform Android 4.4.2, API 19, revision 4
    Installed SDK Platform Android 4.4.2, API 19, revision 497%)
  Downloading SDK Platform Android 4.3.1, API 18, revision 3
  Installing SDK Platform Android 4.3.1, API 18, revision 3
    Installed SDK Platform Android 4.3.1, API 18, revision 397%)
  Downloading SDK Platform Android 4.2.2, API 17, revision 3
  Installing SDK Platform Android 4.2.2, API 17, revision 3
    Installed SDK Platform Android 4.2.2, API 17, revision 397%)
  Downloading SDK Platform Android 4.1.2, API 16, revision 5
  Installing SDK Platform Android 4.1.2, API 16, revision 5
    Installed SDK Platform Android 4.1.2, API 16, revision 596%)
  Downloading SDK Platform Android 4.0.3, API 15, revision 5
  Installing SDK Platform Android 4.0.3, API 15, revision 5
    Installed SDK Platform Android 4.0.3, API 15, revision 596%)
  Downloading SDK Platform Android 2.3.3, API 10, revision 2
  Installing SDK Platform Android 2.3.3, API 10, revision 2
    Installed SDK Platform Android 2.3.3, API 10, revision 298%)
  Downloading SDK Platform Android 2.2, API 8, revision 3
  Installing SDK Platform Android 2.2, API 8, revision 3
    Installed SDK Platform Android 2.2, API 8, revision 399%)
  Downloading Samples for SDK API 23, revision 2
  Installing Samples for SDK API 23, revision 2
    Installed Samples for SDK API 23, revision 297%)
  Downloading Samples for SDK API 22, revision 6
  Installing Samples for SDK API 22, revision 6
    Installed Samples for SDK API 22, revision 697%)
  Downloading Samples for SDK API 21, revision 4
  Installing Samples for SDK API 21, revision 4
    Installed Samples for SDK API 21, revision 496%)
  Downloading Samples for SDK API 20, revision 3
  Installing Samples for SDK API 20, revision 3
    Installed Samples for SDK API 20, revision 395%)
  Downloading Samples for SDK API 19, revision 6
  Installing Samples for SDK API 19, revision 6
    Installed Samples for SDK API 19, revision 694%)
  Downloading Samples for SDK API 18, revision 1
  Installing Samples for SDK API 18, revision 1
    Installed Samples for SDK API 18, revision 195%)
  Downloading Samples for SDK API 17, revision 1
  Installing Samples for SDK API 17, revision 1
    Installed Samples for SDK API 17, revision 195%)
  Downloading Samples for SDK API 16, revision 1
  Installing Samples for SDK API 16, revision 1
    Installed Samples for SDK API 16, revision 196%)
  Downloading Samples for SDK API 15, revision 2
  Installing Samples for SDK API 15, revision 2
    Installed Samples for SDK API 15, revision 296%)
  Downloading Samples for SDK API 10, revision 1
  Installing Samples for SDK API 10, revision 1
    Installed Samples for SDK API 10, revision 195%)
  Downloading Samples for SDK API 8, revision 1
  Installing Samples for SDK API 8, revision 1
    Installed Samples for SDK API 8, revision 196%)
  Downloading GPU Debugging tools, revision 1.0.3
  Installing GPU Debugging tools, revision 1.0.3
    Installed GPU Debugging tools, revision 1.0.399%)
  Downloading Android Support Repository, revision 25
  Installing Android Support Repository, revision 25
    Installed Android Support Repository, revision 2599%)
  Downloading Android Support Library, revision 23.1.1
  Installing Android Support Library, revision 23.1.1
    Installed Android Support Library, revision 23.1.193%)
  Downloading Android Auto Desktop Head Unit emulator, revision 1.1
  Installing Android Auto Desktop Head Unit emulator, revision 1.1
    Installed Android Auto Desktop Head Unit emulator, revision 1.199%)
  Downloading Google Play services, revision 29
  Installing Google Play services, revision 29
    Installed Google Play services, revision 2996%)
  Downloading Google Repository, revision 24
  Installing Google Repository, revision 24
    Installed Google Repository, revision 2499%)
  Downloading Google Play APK Expansion Library, revision 3
  Installing Google Play APK Expansion Library, revision 3
    Installed Google Play APK Expansion Library, revision 378%)
  Downloading Google Play Billing Library, revision 5
  Installing Google Play Billing Library, revision 5
    Installed Google Play Billing Library, revision 596%)
  Downloading Google Play Licensing Library, revision 2
  Installing Google Play Licensing Library, revision 2
    Installed Google Play Licensing Library, revision 272%)
  Downloading Android Auto API Simulators, revision 1
  Installing Android Auto API Simulators, revision 1
    Installed Android Auto API Simulators, revision 199%)
  Downloading Google Web Driver, revision 2
  Installing Google Web Driver, revision 2
    Installed Google Web Driver, revision 299%)
  Downloading Google APIs, Android API 23, revision 1
  Installing Google APIs, Android API 23, revision 1
    Installed Google APIs, Android API 23, revision 189%)
  Downloading Google APIs, Android API 22, revision 1
  Installing Google APIs, Android API 22, revision 1
    Installed Google APIs, Android API 22, revision 189%)
  Downloading Google APIs, Android API 21, revision 1
  Installing Google APIs, Android API 21, revision 1
    Installed Google APIs, Android API 21, revision 189%)
  Downloading Google APIs (x86 System Image), Android API 19, revision 18
  Installing Google APIs (x86 System Image), Android API 19, revision 18
    Installed Google APIs (x86 System Image), Android API 19, revision 1899%)
  Downloading Google APIs (ARM System Image), Android API 19, revision 18
  Installing Google APIs (ARM System Image), Android API 19, revision 18
    Installed Google APIs (ARM System Image), Android API 19, revision 1899%)
  Downloading Glass Development Kit Preview, Android API 19, revision 11
  Installing Glass Development Kit Preview, Android API 19, revision 11
    Installed Glass Development Kit Preview, Android API 19, revision 1181%)
  Downloading Google APIs, Android API 18, revision 4
  Installing Google APIs, Android API 18, revision 4
    Installed Google APIs, Android API 18, revision 499%)
  Downloading Google APIs, Android API 17, revision 4
  Installing Google APIs, Android API 17, revision 4
    Installed Google APIs, Android API 17, revision 499%)
  Downloading Google APIs, Android API 16, revision 4
  Installing Google APIs, Android API 16, revision 4
    Installed Google APIs, Android API 16, revision 499%)
  Downloading Google APIs, Android API 15, revision 3
  Installing Google APIs, Android API 15, revision 3
    Installed Google APIs, Android API 15, revision 399%)
  Downloading Google APIs, Android API 10, revision 2
  Installing Google APIs, Android API 10, revision 2
    Installed Google APIs, Android API 10, revision 299%)
  Downloading Google APIs, Android API 8, revision 2
  Installing Google APIs, Android API 8, revision 2
    Installed Google APIs, Android API 8, revision 299%)
  Downloading Google APIs ARM EABI v7a System Image, Google Inc. API 23, revision 7
  Installing Google APIs ARM EABI v7a System Image, Google Inc. API 23, revision 7
    Installed Google APIs ARM EABI v7a System Image, Google Inc. API 23, revision 799%)
  Downloading Google APIs Intel x86 Atom_64 System Image, Google Inc. API 23, revision 11
  Installing Google APIs Intel x86 Atom_64 System Image, Google Inc. API 23, revision 11
    Installed Google APIs Intel x86 Atom_64 System Image, Google Inc. API 23, revision 1199%)
  Downloading Google APIs Intel x86 Atom System Image, Google Inc. API 23, revision 11
  Installing Google APIs Intel x86 Atom System Image, Google Inc. API 23, revision 11
    Installed Google APIs Intel x86 Atom System Image, Google Inc. API 23, revision 1199%)
  Downloading Google APIs ARM EABI v7a System Image, Google Inc. API 22, revision 1
  Installing Google APIs ARM EABI v7a System Image, Google Inc. API 22, revision 1
    Installed Google APIs ARM EABI v7a System Image, Google Inc. API 22, revision 199%)
  Downloading Google APIs Intel x86 Atom_64 System Image, Google Inc. API 22, revision 3
  Installing Google APIs Intel x86 Atom_64 System Image, Google Inc. API 22, revision 3
    Installed Google APIs Intel x86 Atom_64 System Image, Google Inc. API 22, revision 399%)
  Downloading Google APIs Intel x86 Atom System Image, Google Inc. API 22, revision 2
  Installing Google APIs Intel x86 Atom System Image, Google Inc. API 22, revision 2
    Installed Google APIs Intel x86 Atom System Image, Google Inc. API 22, revision 299%)
  Downloading Google APIs ARM EABI v7a System Image, Google Inc. API 21, revision 10
  Installing Google APIs ARM EABI v7a System Image, Google Inc. API 21, revision 10
    Installed Google APIs ARM EABI v7a System Image, Google Inc. API 21, revision 1099%)
  Downloading Google APIs Intel x86 Atom_64 System Image, Google Inc. API 21, revision 10
  Installing Google APIs Intel x86 Atom_64 System Image, Google Inc. API 21, revision 10
    Installed Google APIs Intel x86 Atom_64 System Image, Google Inc. API 21, revision 1099%)
  Downloading Google APIs Intel x86 Atom System Image, Google Inc. API 21, revision 10
  Installing Google APIs Intel x86 Atom System Image, Google Inc. API 21, revision 10
    Installed Google APIs Intel x86 Atom System Image, Google Inc. API 21, revision 1099%)
    Updated ADB to support the USB devices declared in the SDK add-ons.
    Stopping ADB server succeeded.
    Starting ADB server succeeded.
  Done. 57 packages installed.

Nach einer gefühlten Ewigkeit sind dann die 57 Pakete installiert. Es lohnt sich diesen Befehl von Zeit zu Zeit zu wiederholen, da Google (Alpabet) immer mal wieder Updates zur Verfügung stellt.
Doch jetzt aber erst mal sehen, was wir nun installiert haben. Mit dem Kommando android –help bekommen wir einen ersten Überblick über das, was das Android SDK enthält.

android@openSUSE-421-64-minimal:~/android-sdk-linux> tools/android --help
       Usage:
       android [global options] action [action options]
       Global options:
  -s --silent     : Silent mode, shows errors only.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -h --help       : Help on a specific command.
Valid actions are composed of a verb and an optional direct object:
-    sdk              : Displays the SDK Manager window.
-    avd              : Displays the AVD Manager window.
-   list              : Lists existing targets or virtual devices.
-   list avd          : Lists existing Android Virtual Devices.
-   list target       : Lists existing targets.
-   list device       : Lists existing devices.
-   list sdk          : Lists remote SDK repository.
- create avd          : Creates a new Android Virtual Device.
-   move avd          : Moves or renames an Android Virtual Device.
- delete avd          : Deletes an Android Virtual Device.
- update avd          : Updates an Android Virtual Device to match the folders of a new SDK.
- create project      : Creates a new Android project.
- update project      : Updates an Android project (must already have an AndroidManifest.xml).
- create test-project : Creates a new Android project for a test package.
- update test-project : Updates the Android project for a test package (must already have an AndroidManifest.xml).
- create lib-project  : Creates a new Android library project.
- update lib-project  : Updates an Android library project (must already have an AndroidManifest.xml).
- create uitest-project: Creates a new UI test project.
- update adb          : Updates adb to support the USB devices declared in the SDK add-ons.
- update sdk          : Updates the SDK by suggesting new platforms to install if available.

Nun noch das ANDROID_HOME Verzeichnis setzen und schon ist die Installation des Android SDK abgeschossen.

android@openSUSE-421-64-minimal:~ # vi /etc/profile.d/androidsdk.sh
#
# android.sh
#
ANDROID_HOME=/opt/android-sdk-linux

Nach einer erneuten Anmeldung werden die Änderungen wirksam

android@openSUSE-421-64-minimal:~ # echo $ANDROID_HOME
/home/android/android-sdk-linux

Nun ist das Android SDK installiert und nutzbar. Da der Android Build Prozess aber sehr komplex ist und ich keine Lust habe, mich damit so intensiv zu befassen, installiere ich noch gradle. Damit wird das bilden einer Android APK Datei zum Kinderspiel. Weitere Infos zum Erzeugen einer Android APK Datei unter Linux findet man unter „Building and Running from the Command Line

Die Installation von gradle ist auch kein Hexenwerk und in ein paar Minuten erledigt.

1. Download Gradle
In meinem Fall ist das Version 2.10. Ich nehme die Binary Distribution, da ich die Sourcen und die Doku auf meinem Linux System nicht benötige.

wget https://services.gradle.org/distributions/gradle-2.10-bin.zip

2. Entpacken der Distribution
Ich installiere meine gradle Version unter /opt/gradle-2.10. Dort habe ich auch mein Android SDK und gradle passt da auch gut hin.

unzip gradle-2.10-bin.zip

3. Umgebungsvariablen setzen

In der Datei /etc/profile.d/gradle.sh trage ich noch das GRADLE_HOME Verzeichnis ein und füge den ‚bin‘ Ordner zu meiner PATH Variable hinzu.

gradle@openSUSE-421-64-minimal:/opt/gradle-2.10cat /etc/profile.d/gradle.sh
#
# gradle.sh
GRADLE_HOME=/opt/gradle-2.10
PATH=$PATH:/opt/gradle-2.10/bin

Nach einem erneuten Anmelden ist die GRADLE_HOME Variable gesetzt und /opt/gradle-2.10/bin im PATH enthalten. Ein einfacher Test kann das klären. Dazu kann man einfach eine Konsole öffnen und das Command „gradle“ eingeben. Auch wenn man sich nicht im /opt/gradle-2.10/bin sollte dann folgende Ausgabe zu sehen sein:

openSUSE-421-64-minimal:~ # gradle
:help
Welcome to Gradle 2.10.
To run a build, run gradle  ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task 
BUILD SUCCESSFUL
Total time: 0.911 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.10/userguide/gradle_daemon.html

Beim ersten Aufruf muss gradle noch eine ganze Menge aus dem Internet nachladen. Aber das passiert nur einmal und danach nur noch, wenn es nötig ist Module oder Updates zu installieren.
Das war auch schon alles. Gradle ist installiert und funktioniert.
Zum Test können wir nun noch mal ein Android Projekt bauen. Dazu kann man einfach ein beliebiges Android-Studio Projekt nehmen. Wenn man gerade kein eigenes Projekt im Android Studio hat, kann man auch ein github Repository klonen. Eine große Auswahl an guten Android Libs und Beispielen findet man z.B. unter https://android-arsenal.com/. Ich entscheide mich für ein Projekt, an dem ich gerade arbeite das den Namen „Tomato“ trägt.

a) Git Repository klonen
Zufällig habe ich ein Android gradle Projekt in Arbeit, das ich direkt mal zum Testen verwenden kann.

android@openSUSE-421-64-minimal:~/workspace> git clone git@mein-toller-git-server.de:Tomato.git
Cloning into 'Tomato'...
Enter passphrase for key '/home/android/.ssh/id_rsa':
remote: Counting objects: 922, done.
remote: Compressing objects: 100% (692/692), done.
remote: Total 922 (delta 284), reused 845 (delta 207)
Receiving objects: 100% (922/922), 11.06 MiB | 0 bytes/s, done.
Resolving deltas: 100% (284/284), done.
Checking connectivity... done.

b) Erst mal ein gradle clean machen

android@openSUSE-421-64-minimal:~/workspace/Tomato> gradle clean
:app:clean
BUILD SUCCESSFUL
Total time: 2.87 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.10/userguide/gradle_daemon.html

Netterweise informiert mich gradle darüber, dass ich noch schneller arbeiten kann, wenn ich den gradle daemon verwende. Das mache ich aber noch nicht, da ich den Build Prozess in Zukunft nur als cronjob laufen lassen werde und es da nicht auf eine Sekunde ankommt.
c) Gradle build laufen lassen (first time)

android@openSUSE-421-64-minimal:~/workspace/Tomato> gradle build
...
:app:lintVitalRelease
./Tomato/app/src/main/res/layout/test.xml:22: Error: Duplicate id @+id/onMenuButton, already defined earlier in this layout [DuplicateIds]
    android:id="@+id/onMenuButton"
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ./Tomato/app/src/main/res/layout/test.xml:9: @+id/onMenuButton originally defined here

   Explanation for issues of type "DuplicateIds":
   Within a layout, id's should be unique since otherwise findViewById() can
   return an unexpected view.
1 errors, 0 warnings
:app:lintVitalRelease FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:lintVitalRelease'.
> Lint found fatal errors while assembling a release target.
  To proceed, either fix the issues identified by lint, or modify your build script as follows:
  ...
  android {
      lintOptions {
          checkReleaseBuilds false
          // Or, if you prefer, you can continue to check for errors in release builds,
          // but continue the build even when errors are found:
          abortOnError false
      }
  }
  ...
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
BUILD FAILED
Total time: 6.166 secs
android@openSUSE-421-64-minimal:>

Upps, da habe ich wohl noch eine test.xml Layout Datei vergessen zu löschen. Zum Glück checkt lint noch mal meine Sourcen und kann mit der statischen Code-Analyse solche Probleme im Quelltext finden.

d) Die überflüssige test.xml löschen und gradle build erneut laufen lassen

android@openSUSE-421-64-minimal:~/workspace/Tomato> rm app/src/main/res/layout/test.xml
android@openSUSE-421-64-minimal:~/workspace/Tomato> gradle build
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:prepareDebugDependencies
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources
:app:processDebugManifest UP-TO-DATE
:app:processDebugResources
:app:generateDebugSources
:app:compileDebugJavaWithJavac
:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:transformClassesWithDexForDebug
:app:mergeDebugJniLibFolders UP-TO-DATE
:app:transformNative_libsWithMergeJniLibsForDebug UP-TO-DATE
:app:processDebugJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:app:validateDebugSigning
:app:packageDebug
:app:zipalignDebug
:app:assembleDebug
:app:preReleaseBuild UP-TO-DATE
:app:checkReleaseManifest
:app:prepareReleaseDependencies
:app:compileReleaseAidl UP-TO-DATE
:app:compileReleaseRenderscript UP-TO-DATE
:app:generateReleaseBuildConfig UP-TO-DATE
:app:generateReleaseAssets UP-TO-DATE
:app:mergeReleaseAssets UP-TO-DATE
:app:generateReleaseResValues UP-TO-DATE
:app:generateReleaseResources UP-TO-DATE
:app:mergeReleaseResources
:app:processReleaseManifest UP-TO-DATE
:app:processReleaseResources
:app:generateReleaseSources
:app:compileReleaseJavaWithJavac
:app:compileReleaseNdk UP-TO-DATE
:app:compileReleaseSources
:app:lintVitalRelease
:app:transformClassesWithDexForRelease
:app:mergeReleaseJniLibFolders
:app:transformNative_libsWithMergeJniLibsForRelease
:app:processReleaseJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForRelease
:app:packageRelease
:app:assembleRelease
:app:assemble
:app:compileLint
:app:lint
Wrote HTML report to file:///.../workspace/Tomato/app/build/outputs/lint-results.html
Wrote XML report to file:///.../workspace/Tomato/app/build/outputs/lint-results.xml
Lint found 0 errors and 341 warnings
:app:preDebugUnitTestBuild UP-TO-DATE
:app:prepareDebugUnitTestDependencies
:app:compileDebugUnitTestJavaWithJavac UP-TO-DATE
:app:processDebugUnitTestJavaRes UP-TO-DATE
:app:compileDebugUnitTestSources UP-TO-DATE
:app:mockableAndroidJar UP-TO-DATE
:app:assembleDebugUnitTest UP-TO-DATE
:app:testDebugUnitTest
:app:preReleaseUnitTestBuild UP-TO-DATE
:app:prepareReleaseUnitTestDependencies
:app:compileReleaseUnitTestJavaWithJavac UP-TO-DATE
:app:processReleaseUnitTestJavaRes UP-TO-DATE
:app:compileReleaseUnitTestSources UP-TO-DATE
:app:assembleReleaseUnitTest UP-TO-DATE
:app:testReleaseUnitTest
:app:test
:app:check
:app:build
BUILD SUCCESSFUL
Total time: 7.3 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.10/userguide/gradle_daemon.html
android@openSUSE-421-64-minimal:~/workspace/Tomato>

Build successfull. Das klingt doch gut. Allerdings hat lint noch 341 Warnungen ausgespuckt. Da muss ich wohl noch mal einen Blick drauf werfen. Toll ist auch, das gradle nicht jedes Mal alles neu machen muss. Viele der Tasks werden mit „UP-TO-DATE” gekennzeichnet, was so viel bedeutet wie – “Hier gibt es im Moment nix zu tun”.
Aber nun erst mal sehen, ob eine APK Datei erzeugt wurde.

android@openSUSE-421-64-minimal:~/workspace/Tomato> find . -name "*.apk" -print
./app/build/outputs/apk/app-release-unsigned.apk
./app/build/outputs/apk/app-debug.apk
./app/build/outputs/apk/app-debug-unaligned.apk

So wie es scheint sind sogar 3 apk Dateien erzeugt worden.
1. app-debug-unaligned.apk. Dies ist nur eine intermediate Datei, der man keine Beachtung schenken sollte.
2. app-debug.apk. Dabei handelt es sich um eine „Aligned Signed APK“. Die Datei ist RAM optimiert (zipalign) und kann auf einem Testgerät installiert werden.
3. app-release-unsigned.apk. Eine unsignierte APK Datei, die noch signiert werden muss.

Das Signieren einer APK Datei ist auch mit gradle möglich und unter http://developer.android.com/tools/publishing/app-signing.html genauer beschrieben. Ich gehe hier erst mal nicht näher darauf ein, da ich müde bin und erst mal schlafen gehe.

Gute Nacht

Meine Apps im Google Play-Strore Jetzt bei Google Play