So erstellen Sie Android-Apps ohne IDE über die Befehlszeile

Eine HelloWorld ohne Android Studio

Update: Ich habe einen neuen Kurs erstellt, in dem erläutert wird, wie Sie Android Studio und Gradle vermeiden und dennoch IntelliJ iDE verwenden können:

Hallo zusammen!

In diesem Tutorial zeige ich Ihnen, wie Sie eine APK (eine Android-App) aus Ihrem Java-Code mit einem Terminal (unter Linux) ohne IDE oder mit anderen Worten ohne Android Studio erstellen / kompilieren können. Am Ende zeige ich Ihnen auch ein Skript zur Automatisierung des Prozesses. In diesem Beispiel verwende ich Android API 19 (4.4 Kitkat), um eine einfache HelloWorld zu erstellen. Ich möchte sagen, dass ich dieses Tutorial ohne Android-Befehl machen werde, der veraltet ist.

1. Installieren Sie Java

Zunächst müssen Sie Java installieren. In meinem Fall installiere ich die Headless-Version, da ich keine Grafiken verwende (nur Befehlszeile):

sudo apt-get installiere openjdk-8-jdk-headless

2. Installieren Sie alle SDK-Tools

Dann laden Sie die letzten SDK-Tools von Android herunter, die Sie hier finden:

Oder einfach machen:

https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip

Ich empfehle, es in das / opt-Verzeichnis in einem anderen Verzeichnis zu entpacken, das wir "android-sdk" nennen werden:

mkdir -p / opt / android-sdk
Entpacken Sie sdk-tools-linux-3859397.zip -d / opt / android-sdk

Jetzt müssen wir Plattform-Tools (die ADB enthalten), eine Android-API und Build-Tools installieren.

Wenn Sie Debian verwenden, können Sie die Installation des Plattform-Tools-Pakets vermeiden und ADB nur folgendermaßen installieren:

sudo apt-get install adb

3. Codieren Sie die Anwendung

In diesem Beispiel möchte ich eine einfache HelloWorld kompilieren. Also müssen wir zuerst ein Projektverzeichnis erstellen:

mkdir HelloAndroid
cd HelloAndroid

Dann müssen wir den Dateibaum machen:

mkdir -p src / com / example / halloandroid
mkdir obj
mkdir bin
mkdir -p res / layout
mkdir res / values
mkdir res / drawable

Wenn Sie externe Bibliotheken (.jar-Dateien) verwenden, erstellen Sie auch einen Ordner für diese:

mkdir libs

Sie haben hier ein Beispiel:

Erstellen Sie die Datei src / com / example / helloandroid / MainActivity.java und fügen Sie diese ein:

Erstellen Sie die Datei strings.xml im Ordner res / values. Es enthält den gesamten Text, den Ihre Anwendung verwendet:

Die activity_main.xml ist eine Layoutdatei, die sich in res / layout befinden muss:

Sie müssen auch die Datei AndroidManifest.xml im Stammverzeichnis hinzufügen:

4. Erstellen Sie den Code

Nun empfehle ich, den Projektpfad in einer Variablen zu speichern:

Exportieren Sie PROJ = Pfad / nach / HelloAndroid

Zuerst müssen wir die für unseren Code notwendige R.java-Datei generieren:

cd /opt/android-sdk/build-tools/26.0.1/
./aapt package -f -m -J $ PROJ / src -M $ PROJ / AndroidManifest.xml -S $ PROJ / res -I /opt/android-sdk/platforms/android-19/android.jar
  • -m weist aapt an, Verzeichnisse unter dem von -J angegebenen Speicherort zu erstellen
  • -J gibt an, wohin die Ausgabe geht. Wenn Sie -J src sagen, wird eine Datei wie src / com / example / helloandroid / R.java erstellt
  • -S gibt an, wo sich das res-Verzeichnis mit den Drawables, Layouts usw. befindet.
  • -Ich sage aapt, wo die android.jar ist. Sie finden Ihre an einem Ort wie android-sdk / platform / android- /android.jar

Jetzt müssen wir die .java-Dateien kompilieren:

cd / path / to / AndroidHallo
javac -d obj -classpath src -bootclasspath /opt/android-sdk/platforms/android-19/android.jar src / com / example / helloandroid / *. java

Wenn Sie ein externes verwenden, fügen Sie es dem Klassenpfad hinzu:

javac -d obj -klassenpfad "src: libs /  .jar" -bootklassenpfad /opt/android-sdk/platforms/android-19/android.jar src / com / example / helloandroid / *. java

Die kompilierten .class-Dateien befinden sich im Ordner obj, aber Android kann sie nicht lesen. Wir müssen sie in eine Datei namens "classes.dex" übersetzen, die von der dalvik Android Runtime gelesen wird:

cd /opt/android-sdk/build-tools/26.0.1/
./dx --dex --output = $ PROJ / bin / classes.dex $ PROJ / obj

Wenn Sie jedoch externe Bibliotheken verwenden, gehen Sie wie folgt vor:

./dx --dex --output = $ PROJ / bin / classes.dex $ PROJ / *. jar $ PROJ / obj

Wenn Sie den Fehler UNEXPECTED TOP-LEVEL EXCEPTION haben, kann dies daran liegen, dass Sie alte Build-Tools verwenden und DX versucht, Java 1.7 anstatt 1.8 zu übersetzen. Um das Problem zu lösen, müssen Sie im vorherigen Befehl javac die Java-Version 1.7 angeben:

cd / path / to / AndroidHallo
javac -d obj -source 1.7 -target 1.7 -classpath src -bootclasspath /opt/android-sdk/platforms/android-19/android.jar src / com / example / helloandroid / *. java

Die Option -source gibt die Java-Version Ihrer Quelldateien an. Beachten Sie, dass wir frühere Versionen von Java verwenden können, auch wenn wir OpenJDK 8 (oder 1.8) verwenden.

Wir können jetzt alles in eine APK stellen:

./aapt-Paket -f -m -F $ PROJ / bin / hello.unaligned.apk -M $ PROJ / AndroidManifest.xml -S $ PROJ / res -I / opt / android-sdk / Plattformen / android-19 / android .Krug
cp $ PROJ / bin / classes.dex.
./aapt füge $ PROJ / bin / hello.unaligned.apk classes.dex hinzu

Beachten Sie: Bisher haben wir drei AAPT-Befehle verwendet, der erste und der zweite sind ähnlich, aber sie tun nicht dasselbe. Sie müssen die classes.dex-Datei wie oben im Stammverzeichnis des Projekts kopieren! Andernfalls legt AAPT diese Datei nicht an der richtigen Stelle im APK-Archiv ab (da ein APK einer ZIP-Datei gleicht).

Das generierte Paket kann von Android nicht installiert werden, da es nicht ausgerichtet und nicht signiert ist.

Wenn Sie möchten, können Sie den Inhalt des Pakets folgendermaßen überprüfen:

./aapt list $ PROJ / bin / hello.unaligned.apk

5. Unterzeichnen Sie das Paket

Dazu erstellen wir zunächst einen neuen Keystore mit dem Kommando keytool von Java:

keytool -genkeypair -validity 365 -keystore mykey.keystore -keyalg RSA -keysize 2048

Beantworten Sie einfach die Fragen und geben Sie ein Passwort ein.

Sie können eine APK wie folgt signieren:

./apksigner sign --ks mykey.keystore $ PROJ / bin / hello.apk

Beachten Sie, dass apksigner nur seit Build Tools 24.0.3 existiert.

6. Richten Sie das Paket aus

So einfach ist das:

./zipalign -f 4 $ PROJ / bin / hello.unaligned.apk $ PROJ / bin / hello.apk

Die Ausrichtung erhöht die Leistung der Anwendung und kann die Speichernutzung verringern.

7. Testen Sie die Anwendung

Um die Anwendung zu testen, schließen Sie Ihr Smartphone mit einem USB-Kabel an und verwenden Sie ADB:

adb installiere $ PROJ / bin / hello.apk
adb shell am start -n com.example.helloandroid / .MainActivity

Aber bevor Sie diesen Befehl ausführen, empfehle ich, diesen Befehl auszuführen:

adb logcat

Wenn während der Installation oder Ausführung ein Fehler auftritt, wird dieser mit diesem Befehl angezeigt.

Voila! Hier ist das Ergebnis:

8. Machen Sie ein Skript

Wenn Sie diese Schritte nicht jedes Mal ausführen möchten, wenn Sie Ihre App kompilieren möchten, erstellen Sie ein Skript. Hier ist meins:

Führen Sie dazu Folgendes aus:

cd / path / to / AndroidHallo
./build.sh Test

Anmerkungen

  • Sie können "test" entfernen, wenn Sie nur kompilieren möchten, ohne zu testen.
  • Dieses Skript kompiliert und führt die App nur auf dem Telefon aus. Ich kann aber auch ein Skript erstellen, um automatisch ein neues Projekt wie dieses zu generieren. Ich denke, ich habe eine gute Idee, aber ich muss wissen, ob Sie interessiert sind. Wenn dies der Fall ist, hinterlassen Sie bitte einen Kommentar oder senden Sie mir eine E-Mail.
  • Ich kann auch das Skript für externe Bibliotheken vervollständigen. Lassen Sie mich gleichfalls wissen, ob Sie dies möchten.

Wenn Sie Fragen haben, zögern Sie nicht, diese unten oder per E-Mail zu stellen ;-)! EDIT: Nun, ich bin tatsächlich sehr beschäftigt ...