JavaIDEdroid ist eine integrierte Softwareentwicklungsumgebung (IDE), welche auf Android Geräten läuft und es ermöglicht, native Android Anwendungen zu erstellen, ohne den Android SDK auf Windows oder Linux verwenden zu müssen.

JavaIDEdroid

Was ist JavaIDEdroid?
Einstieg
PRO Funktionen
Projekte verwalten
BeanShell Skripts
Tools Reiter
Module und JavaRunner
Verwendung aus anderen Anwendungen
Debugging
Rechtliches

1. Einleitung

JavaIDEdroid (im Folgenden die "APP" genannt) ist eine integrierte Softwareentwicklungsumgebung (IDE), welche auf Android Geräten läuft und es ermöglicht, native Android Anwendungen zu erstellen, ohne den Android SDK auf Windows oder Linux verwenden zu müssen. Der IDE ist auf Android 2.3 oder höher lauffähig.

Es gibt eine kostenlose Version und eine PRO Version der APP. Die PRO Version hat viele Funktionen, die in der kostenlosen Version fehlen.

Autor: Tanapro GmbH (Tom Arn), www.tanapro.ch
Projekt Webseite
und Support:
https://github.com/t-arn/java-ide-droid

Zurzeit sind folgende Tools in die APP integriert:

Die APP kann mit Modulen erweitert werden. Die Module werden dynamisch geladen, wobei vor jedem Modulstart die Integrität des Moduls geprüft wird. Im Download Bereich auf der Projekt Webseite finden Sie einige bereits erstellte Module wie z.B. Ant oder das jar Tool.

Die APP kann mit BeanShell Skripts kontrolliert und benutzerspezifisch angepasst werden. Die APP unterstützt den 'geschützten Skriptmodus', welcher die Integrität der Skripts prüft, bevor sie ausgeführt werden.

top

2. Einstieg

Um mit der APP arbeiten zu können, gehen Sie wie folgt vor:

  1. APP installieren
  2. Definieren Sie "Entwicklungs-Stammverzeichnis" in den Einstellungen
  3. Definieren Sie "Modul Salz" in den Einstellungen, um die Modul-Hash Werte für Sie einmalig zu machen
  4. Definieren Sie "Skript Salz" in den Einstellungen, wenn Sie den 'Geschützten Skript Modus' aktivieren wollen
  5. Wenn nötig, ändern Sie die regex für Fehlermeldungen in den Einstellungen. Die Standard regex sind
    (?.*\.xml):(?\d*)
    .* (?.*\.java):(?\d*)
    .* (?.*\.java).* (?\d*)
    Sourced file: (?.*\.bsh) :.*at Line: (?\d*)
    In file: (?.*\.bsh).* at line (?\d*).*
    Die benannten Gruppen filename und linenumber werden verwendet, um mit dem internen Editor die Datei zu öffnen und zur Stelle mit dem Fehler oder Warnung zu navigieren.
  6. Erstellen Sie Ihr erstes Projekt (siehe hier)

Um Dateien zu editieren können Sie den eingebauten Texteditor verwenden oder einen beliebigen anderen Editor, den Sie runterladen und installieren.

Die APP kommt mit android-api8.jar welches automatisch auf Ihre Speicherkarte extrahiert wird. Sie benötigen möglicherweise ebenfalls die android.jar aus dem Android SDK für höhere API Levels. Für einige API Levels finden Sie die android.jar auch im Download Bereich der JavaIDEdroid Projekt Webseite

Wenn Sie die gesamte Funktionalität der APP nutzen möchten, müssen Sie den PRO Schlüssel erwerben.

top

2.1. PRO Funktionen

Der PRO Schlüssel schaltet folgende zusätzliche Funktionen frei:

  • Unlimitierte Projektunterstützung (die kostenlose Version unterstützt nur sehr kleine Projekte)
  • DexMerger Tool: Ermöglicht das Zusammenführen von 2 .dex Dateien. So müssen .jar Libraries nicht immer wieder neu gedext werden.
  • Merge Funktionalität in dx
  • Incremental Option in dx
  • Skript Methode JID.fnDexJarArchiveIncrementally
  • APK Signierung mit eigenem Zertifikat
  • Unlimitierter JavaRunner (die kostenlose Version unterstützt nur sehr kleine Module)
  • Inkrementelles Erstellen der JavaRunner Module

Zum Aktivieren der PRO Funktionen kaufen Sie den JavaIDEdroidPRO 2.x Schlüssel in Google Play und installieren Sie ihn auf Ihr Gerät. Falls Sie bereits die alte JavaIDEdroidPRO 1.x besitzen, brauchen Sie den 2.x PRO Schlüssel nicht. Holen Sie sich stattdessen das neuste Update.

top

3. Projekt Verwaltung

In der PRO Version können Sie beliebige Software Projekte (z.b. auch nicht-Android Projekte) definieren und verwalten. Die kostenlose Version unterstützt nur sehr kleine Projekte. Das Projekt Menü weist folgende Einträge auf:

  • Neues Projekt erstellen
  • Projekt öffnen
  • Projekt aus Verlauf öffnen
  • Projekt bearbeiten
  • Projekt kompilieren
  • Build erstellen
  • Projekt APK installieren
  • Projekt schliessen

top

3.1 Neues Projekt erstellen

Sie können zu einem Projekt folgende Informationen erfassen:

  • Projekt Name: Sie können einen beliebigen Namen wählen, aber es macht Sinn, das Projekt (und auch die Projektdefinitionsdatei) gleich zu benennen wie Ihr package, z.B. HelloWorld
  • Projekt-Stammverzeichnis: Dies ist das Verzeichnis, in dem Sie alle Projekt Dateien speichern. Die Projektdefinitionsdatei (*.jip) wird immer hier gespeichert.
  • Haupt-Activity Java Datei: Der Pfad (relativ zum Projekt-Stammverzeichnis) zur Java Datei, welche die Haupt-Activity enthält. Wenn diese Java Datei kompiliert wird, werden automatisch alle anderen Java Sourcen mitkompiliert.
  • Projekt APK: Die APK Datei, welche erstellt und installiert werden soll. Wenn kein Wert definiert ist, wird JID.stPrjRootDir+"bin/test/"+JID.stName+"/"+JID.stName+".apk" verwendet.
  • Pfad zu projekt-spezifischem android.jar: Pfad (relativ zum Entwicklungs-Stammverzeichnis) zum projekt-spezifischen android.jar. Wenn hier kein Wert definiert wird, verwendet die APP das android.jar aus den globalen Einstellungen.
  • Library Verzeichnis: Der Pfad (relativ zum Projekt-Stammverzeichnis) zum Library Verzeichnis, z.B. libs/
    Lassen Sie dieses Feld leer, wenn Ihr Projekt keine externen Libraries (.jar oder .so Dateien) verwendet.
  • Dex Library directory: Der Pfad (relativ zum Projekt-Stammverzeichnis) zum Dex Library Verzeichnis, z.B. bin/test/dexlibs/
    Lassen Sie dieses Feld leer, wenn Sie keine Dex Libraries (.jar.dex.zip) verwenden. Siehe auch hier.
  • Assets Verzeichnis: Der Pfad (relativ zum Projekt-Stammverzeichnis) zum Assets Verzeichnis, z.B. assets/
    Lassen Sie dieses Feld leer, wenn Ihr Projekt keine Assets verwendet.
  • Regex für Fehlermeldungen:Hier können mehrere regex Ausdrücke definiert werden, welche diejenigen in den Einstellunge ersetzen.
  • Verzeichnisse ausblenden: Um die 'Verzeichnis Liste' im Projekt-Dateimanager (siehe unten) kurz zu halten, können Sie eine Liste von Verzeichnissen definieren, welche Sie ausblenden möchten. Jedes Verzeichnis muss auf einer separaten Zeile stehen. Sie können die Durchsuchen-Schaltfläche mehrere Male anwählen, um weitere Verzeichnisse hinzuzufügen.
  • Zeitprotokoll schreiben: Wenn diese Option aktiv ist, schreibt die APP ein Zeitprotokoll für das Projekt.

Nachdem Sie das Projekt-Stammverzeichnis definiert haben, können Sie die Schaltfläche 'Projekt Dateien erstellen aus Vorlage' anwählen, und die APP erstellt aus der gewählten Vorlagedatei ein Projekt-Skelett für Sie. Die Vorlage HelloWorld wird automatisch aus dem App-Paket extrahiert, wenn sie auf der Speicherkarte nicht gefunden wird. Sie können den Inhalt der Vorlagedatei auf ihre Bedürfnisse anpassen und/oder eigene Vorlagen ergänzen.
Um nicht unbeabsichtigt bestehende Daten zu überschreiben, darf das Projekt-Stammverzeichnis noch NICHT existieren, wenn Sie die Schaltfläche anwählen. Wenn Sie also die Durchsuchen-Schaltfläche verwenden, müssen Sie das letzte Verzeichnis von Hand eingeben.

Wenn Sie die 'Speichern' Schaltfläche anwählen, werden die projekt-spezifischen Informationen im Projekt-Stammverzeichnis in die Projekt Definitionsdatei (.jip Datei) gespeichert. Der Pfad des Projekt-Stammverzeichnisses wird nicht in der .jip Datei gespeichert. Wenn Sie eine .jip Datei öffnen, wird das Projekt-Stammverzeichnis aufgrund des Speicherorts der .jip Datei gesetzt. Auf diese Weise bleibt Ihr Projektbaum portabel. Wichtig hierbei ist, dass Sie die .jip Datei niemals manuell aus dem Projekt-Stammverzeichnis hinaus verschieben, sonst setzt die APP dann ein falsches Projekt-Stammverzeichnis für dieses Projekt!

top

3.2 Projekt öffnen

Sie können ein Projekt öffnen, indem Sie Ihren Entwicklungsbaum durchsuchen und eine .jip Datei auswählen. Schneller geht es, wenn Sie ein Projekt aus dem Verlauf (siehe unten) anwählen, um ein kürzlich geöffnetes Projekt zu öffnen. Nach dem Öffnen des Projektes wird im 'Projekt' Reiter der Projekt-Dateimanager angezeigt.

top

3.2.1 Projekt-Dateimanager

Mit dem Projekt-Dateimanager können Sie alle Dateien des Projektes anzeigen und bearbeiten. Wenn Sie eine Datei lange drücken wird ein Kontextmenü mit folgenden Einträgen angezeigt:

  • Datei öffnen: Öffnet die Datei über den ACTION_VIEW Intent. Wenn mehrere Apps diesen Intent unterstützen, können Sie aus einer Liste auswählen.
  • Datei bearbeiten (intern): Bearbeitet die Datei mit dem internen Editor.
  • Datei bearbeiten (extern): Bearbeitet die Datei über den ACTION_EDIT Intent. Wenn mehrere Apps diesen Intent unterstützen, können Sie aus einer Liste auswählen. Stellen Sie sicher, dass Ihr Editor (nicht in der APP enthalten) die Dateien im ANSI (iso-8859-1 / latin-1 / win1252) Format speichert, sonst werden Sie Kompilierungsfehler erhalten!
  • Skript/Modul starten: Dieser Eintrag ist nur für .bsh Dateien und Module aktiv und startet das angewählte BeanShell Skript/Modul. Bei Skripts wechselt die APP in den 'BeanShell' Reiter, um das Ergebnis der Skript-Ausführung anzuzeigen. Module werden im 'Tools' Reiter ausgeführt.
  • Sende Datei an Skript: Die Datei kann an ein beliebiges Skript übergeben werden.
  • Datei umbenennen: Ändert den Namen der Datei
  • Datei löschen: Löscht die Datei nach einer Bestätigung

Die Schaltfläche 'Verzeichnis Liste' erlaubt einen schnellen Wechsel innerhalb der Projekt Unterverzeichnisse. Wenn Sie ein Verzeichnis lange drücken wird ein Kontextmenü mit folgenden Einträgen angezeigt:

  • Neue Datei: Erstellt eine neue Datei im ausgewählten Verzeichnis
  • Neues Verzeichnis: Erstellt ein neues Unterverzeichnis
  • Verzeichnis umbenennen: Ändert den Namen des ausgewählten Verzeichnisses
  • Verzeichnis löschen: Löscht das ausgewählte Verzeichnis nach einer Bestätigung

Neue Dateien werden aufgrund der Dateivorlagen erstellt: Wird im Projekt-Stammverzeichnis oder im Arbeitsverzeichnis (unter file-templates) eine Datei NewFileTemplate gefunden, welche die gleiche Extension (zum Beispiel .java) hat wie die neue Datei, dann wird die neue Datei auf Basis dieser Vorlage erstellt. Ansonsten wird eine leere Datei erstellt.

top

3.3 Projekt Verlauf

Sie können ein kürzlich verwendetes Projekt öffnen, indem Sie es im 'Verlauf' anwählen. Der Verlauf wird jedes Mal aktualisiert, wenn Sie ein Projekt speichern oder öffnen. Der Verlauf ist anhand der letzten Verwendung sortiert, wobei das zuletzt verwendete Projekt im Verlauf zuoberst ist.

top

3.4 Projekt kompilieren und erstellen

Wenn Sie im Projektmenü die Einträge für das Kompilieren oder Erstellen des Build anwählen, wird das Standard BeanShell Skript /sdcard/.JavaIDEdroid/versionCode/compile.bsh oder /sdcard/.JavaIDEdroid/versionCode/build.bsh gestartet. Diese Skripts funktionieren für fast alle möglichen Projekte, weil sie auf die projekt-spezifischen Informationen des aktuell geöffneten Projektes zugreifen können. Sie können die Standard-Skripts auf Ihre Bedürfnisse anpassen. Wenn Sie die kostenlose Version verwenden und Ihr Projekt zu gross wird, müssen Sie die Skripts so anpassen, dass sie ohne Zugriff auf die projekt-spezifischen Informationen laufen.

Wenn Sie ein Projekt haben, welches nicht mit den Standard-Skripts kompiliert/erstellt werden kann, können Sie die Standard-Skripts in das Projekt-Stammverzeichis kopieren und dort für das Projekt anpassen. Wenn Sie die Menüeinträge für Kompilieren oder Erstellen anwählen, wird die APP dann die projekt-spezifischen Skripts anstelle der Standard-Skripts verwenden.

Wenn Ihre APP externe Java Libraries (*.jar) enthält, die zu gross sind und beim Dexen eine out-of-memory-exception verursachen, dann können Sie die 'Max dex Grösse' in den Einstellungen auf einen kleineren Wert setzen (nur PRO Version). Die .jar Dateien werden dann inkrementell gedext. Alternativ dazu können Sie die Libraries auf Ihrem PC dexen und dann in das dexlibs Verzeichnis Ihres Projektes auf Ihrem Android Gerät kopieren (nur PRO Version). Verwenden Sie auf Ihrem PC folgenden Befehl, um beispielsweise ecj.jar zu dexen:
dx.bat --dex --output=dexlibs\ecj.jar.dex.zip libs\ecj.jar
Beachten Sie, dass Sie das dexlib Verzeichnis in Ihrem Projekt definieren (JID.stDexlibsDir) und dass Ihre dex Libraries die Extension .jar.dex.zip haben, sonst kann das Standard Skript zum Erstellen die dex Libraries nicht korrekt zusammenfügen. Wenn das Skript ecj.jar.dex.zip findet und diese Datei neuer ist als ecj.jar, dann wird es nicht versuchen sie zu dexen, wodurch die out-of-memory-exception vermieden werden kann.

top

3.5 Projekt APK installieren

Wenn Sie die Menüoption 'Projekt APK installieren' auswählen, wird die APK Datei dem Paketmanager zur Installation übergeben und auf Ihr Gerät installiert.

top

3.6 Zeitprotokoll

Das Zeitprotokoll ermöglicht es Ihnen, die für die Entwicklung eines Projekts benötigte Zeit ermitteln können. Das Zeitprotokoll wird im Projekt-Stammverzeichnis in die Datei TimeLog.csv gespeichert.

Ist das Zeitprotokoll aktiv, wird im Projekt Reiter die aktuell gearbeitete Zeit angezeigt. Die Zeit wird nicht laufend aktualisiert, sondern nur bei Reiterwechsel und onResume der MainActivity. Die Zeitprotokollierung startet beim Öffnen des Projektes und endet, wenn Sie das Projekt schliessen oder die APP beenden. Wird die APP durch Android beendet, endet die Protokollierung nicht. Zeitintervalle von weniger als 1 Minute werden nicht gespeichert.

top

4. BeanShell

Mit dem integrierten BeanShell Interpreter können Sie BeanShell Skripts ausführen, um den Prozess der Anwendungserstellung zu automatisieren und anzupassen. Die Skripts können stdin, stdout und stderr für die Dateneingabe und Datenausgabe verwenden. Für die Eingabe von Daten via stdin gibt es einen entsprechenden Menüeintrag im Kontextmenü des BeanShell Reiters (dies gilt übrigens auch für den Tools Reiter).

4.1 Skripts erstellen

BeanShell Skripts haben über die vordefinierte Variable JID Zugriff auf die in die APP eingebaute Funktionalität. Die vordefinierte Variable JID referenziert JID.class, welche über folgende Variablen und Methoden verfügt:

  • JID.iMaxDexSize: max dex Grösse (-1 = unlimitiert)
  • JID.iScriptResultCode: Skripts können hiermit ihren Rückgabewert zurückgeben
  • JID.aScriptArguments: Array von Strings, das dem Script übergeben wurde
  • JID.stAndroidJarPath: Projekt-spezisches android.jar (relativ zu stDevRootDir)
  • JID.stAPK: Die Projekt APK Datei
  • JID.stAssetsDir: Verzeichnis mit den Projekt Assets (relativ zu stPrjRootDir)
  • JID.stBshVar1: Benutzerdefinierte Variable 1
  • JID.stBshVar2: Benutzerdefinierte Variable 2
  • JID.stBshVar3: Benutzerdefinierte Variable 3
  • JID.stBshVar4: Benutzerdefinierte Variable 4
  • JID.stBshVar5: Benutzerdefinierte Variable 5
  • JID.stDevAndroidJarPath: Der volle Pfad und Dateiname zum Standard android.jar
  • JID.stDevRootDir: Das Entwicklungs-Stammverzeichnis
  • JID.stDexlibsDir: Verzeichnis mit den ge-dex-ten Libraries (relativ zu stPrjRootDir)
  • JID.stLibsDir: Verzeichnis mit den Projekt Libraries (relativ zu stPrjRootDir)
  • JID.stMainJava: Java Datei der Haupt-Activity
  • JID.stName: Name des Projekts und der Projekt Definitionsdatei (.jip)
  • JID.stPrjRootDir: Projekt Stammverzeichnis
  • JID.stPw1, JID.stPw2: Temporäre Passwörter welche in Skripts verwendet werden können
  • int JID.fnAapt (String arguments)
  • int JID.fnAapt (String[] arguments)
  • int JID.fnAddToClasspath (String dexArchive) // nur PRO
  • int JID.fnAddToLocallyLoadedClasses (String className) // z.B. "java.util.jar.JarOutputStream" oder "java.util.jar.*"
  • int JID.fnApkBuilder (String arguments)
  • int JID.fnApkBuilder (String[] arguments)
  • void JID.fnClear () // löscht die BeanShell Ausgabe
  • int JID.fnClearClasspath ()
  • int JID.fnClearLocallyLoadedClasses()
  • int JID.fnCompile (String arguments)
  • int JID.fnCompile (String[] arguments)
  • int JID.fnDexJarArchiveIncrementally (String arguments)
  • int JID.fnDexJarArchiveIncrementally (String[] arguments)
  • int JID.fnDexMerger (String arguments)
  • int JID.fnDexMerger (String[] arguments)
  • int JID.fnDx (String arguments)
  • int JID.fnDx (String[] arguments)
  • String JID.fnGetPackageName()
  • int JID.fnGetVersionCode () // gibt den Versionscode zurück
  • String JID.fnGetVersionName () // gibt den Versionsnamen und PRO Infos zurück
  • void JID.fnInputDialog (String prompt) // zeigt Eingabedialog für Eingabe via stdin
  • boolean JID.fnIsCancelled() // gibt true zurück, wenn der Benutzer den Prozess abgebrochen hat
  • boolean JID.isProjectClosed() // gibt true zurück, wenn kein Projekt offen ist
  • void JID.fnPublishProgress (String msg) // schreibt Text auf die Konsole
  • void JID.fnPublishStatus() (String msg) // aktualisiert die Status Anzeige
  • int JID.fnRunJava (String arguments)
  • int JID.fnRunJava (String[] arguments)
  • int JID.fnSignApk (String arguments)
  • int JID.fnSignApk (String[] arguments)
  • void fnStartActivity (Intent intent)
  • Intent fnStartActivityForResult (Intent intent) // startet Activity und wartet, bis sie beendet ist. Der zurückerhaltene Intent enthält immer das extra bundle mit jid.resultCode: 0=OK. 1=keine Daten zurückerhalten, 2=Fehler. Bei Fehlern enthält das extra bundle jid.errorMessage mit dem Fehlerstring.
  • void JID.fnToast (String msg, int milliseconds) // zeigt eine Toast Meldung an
  • String[] JID.fnTokenize (String commandline) // zerlegt die Befehlszeilen Argumente

Bedeutung des Rückgabewerts JID.iScriptResultCode:

   0:   OK
   1:   Warnung
   >1:  Fehler
   99:  undefinierter Rückgabewert /   Exception
   

Beispiel um ecj zu starten:
int rc = JID.fnCompile("--version");

top

4.2 Skripts ausführen

BeanShell Skripts müssen irgendwo auf der Speicherkarte gespeichert werden. Der Pfad zum Skript kann im Eingabefeld eingegeben oder über die Schaltfläche ausgewählt werden (oder im 'Projekt Dateimanager' angewählt werden). Optional können Skript Argumente ergänzt werden. Die Schaltfläche ">" startet das angegebene BeanShell Skript.

Das Ergebnis der Skriptausführung wird in der ScrollView angezeigt, welche im Kontextmenü folgende Funktionen bietet:

  • Anfang: An den Anfang scrollen
  • Ende: An das Ende scrollen
  • Gehe zu Fehler: Öffnet die Datei in der Fehlermeldungszeile bei den 3 roten Pfeilen mit dem internen Editor und scrollt zur Zeile, wo sich der Fehler befindet.
  • In Zwischenablage kopieren: Gesamte Ausgabe in die Zwischenablage kopieren
  • Eingabe via stdin: Dateneingabe (nur aktiv wenn Skript läuft)

top

4.3 Geschützter Skript Modus

Der 'Geschützte Skript Modus' wird aktiviert, indem Sie Ihr 'Skript Salz' in den Einstellungen definieren. In diesem Modus startet die APP nur noch Skripts, die von Ihnen freigegeben worden sind. Die Freigabe erfolgt durch Speichern des Skripts im internen Editor. Hierbei wird ein Hash-Wert ergänzt, der dann bei jedem Start des Skripts geprüft wird. Bevor Sie ein Skript freigeben sollten Sie prüfen, dass das Skript keinen unerwünschten Code ausführt!

Der 'Geschützte Skript Modus' stellt sicher, dass kein bösartiges Programm Ihre Skripts verändern kann, ohne dass Sie es bemerken. Wenn Sie Ihr Skript Salz ändern, werden Sie all Ihre Skripts wieder bestätigen müssen. Die APP erkennt, wenn ein Skript Hash unter Verwendung Ihres vorhergenden Skript Salzes erstellt wurde und gibt eine entsprechende Meldung aus. Sie müssen das Skript dann nicht auf ungewollte Veränderungen prüfen, bevor Sie es im internen Editor speichern.

top

5. Signieren mit eigenen Zertifikaten

Mit der PRO Version können Sie Ihre Anwendungen mit einem Zertifikat aus Ihrem Truststore signieren. Die APP unterstützt neben dem Standard Java Truststore (JKS) auch das BouncyCastle Truststore (BKS) Format.

Das Stardardskript erwartet die Signierungsparameter in folgenden Variablen:

  • Truststore Dateipfad: JID.stBshVar1
  • Truststore Passwort: JID.stPw1
  • Zertifikat Alias: JID.stBshVar2
  • Zertifikat Passwort: JID.stPw2

Die Passwort Activity erreichen Sie über das Hauptmenü. Die Passwörter werden aus Sicherheitsgründen nicht persistent gespeichert. Sie bleiben nur solange erhalten, bis Sie die APP über das Hauptmenü beenden oder bis Sie die Passwort Activity wieder aufrufen.

Wenn das Standard Skript kein Truststore Passwort findet, signiert es mit dem eingebauten Testkey. Ansonsten versucht es mit dem definierten Zertifikat zu signieren. Ist das Truststore Passwort falsch, erzeugt ZipSigner eine LoadKeystoreException. Ist das Zertifikat Passwort falsch, wird eine UnrecoverableKeyException erzeugt. In beiden Fällen bricht das Skript mit einem Fehlercode ab.

top

6. Tools

Dieser Reiter gibt einen direkten Zugriff auf die eingebauten Tools, ohne dass ein BeanShell Skript benötigt wird. Alle Argumente müssen im Eingabefeld eingegeben werden. Dieser Reiter dient dazu, Module zu erstellen. Er kann auch verwendet werden, um die jeweilige Hilfe der Tools auszugeben oder Sachen auszuprobieren.

top

7. Module und JavaRunner

JavaRunner ermöglicht es, beliebige binäre Java Konsole-Applikationen (.jar Dateien) auf Ihrem Android Gerät auszuführen. Eine Modifikation des Source Codes ist hierzu nicht notwendig! Die APP erstellt automatisch ein Modul (binäre Android Datei mit der Extension .jar.dex.zip) und übernimmt die Umleitung von stdin, stdout und stderr. Um Daten via stdin einzugeben, wählen Sie im Kontextmenü den Punkt 'Eingabe via stdin'. Die APP verhindert auch die Ausführung von System.exit(), weil dies nicht nur JavaRunner, sondern auch die APP selber beenden würde. Das Modul ist mit einem Hash (Prüfsumme) gesichert, welcher bei jeder Ausführung geprüft wird, um sicherzustellen, dass die Datei nicht manipuliert wurde. Nach der Ausführung von Modulen werden diese automatisch wieder aus dem Arbeitsspeicher entfernt und JID.fnClearClasspath ausgeführt.

Um ein Modul zu erstellen übergeben Sie einfach den vollen Pfad zur .jar Datei an JavaRunner im Tools Reiter. Das Modul wird erstellt und die Klasse, welche in MANIFEST.MF definiert ist, wird gestartet. Wenn die .jar Datei zu gross ist und Sie während des dexen eine out-of-memory-exception erhalten, dann reduzieren Sie die 'Max. dex Grösse' in den Einstellungen (nur PRO). Ein Wert von 300 KB sollte in den meisten Fällen funktionieren. Wenn Sie ein grosses Modul auf Ihrem PC dexen wollen, dann setzen Sie 'Max. dex Grösse' auf -1 und lassen die APP eine out-of-memory-exception werfen. Die APP belässt in diesem Fall die zu dexenden Dateien in einem temp Verzeichnis, z.B. /sdcard/.JavaIDEdroid/temp1369744458294. Sie können nun das temp Verzeichnis auf Ihren PC kopieren und die .jar.dex.zip Datei mit folgendem Befehl erstellen:
dx --dex --core-library --output=yourapp.jar.dex.zip /.JavaIDEdroid/temp1369744458294
Wenn Sie dieses Modul das erste Mal mit JavaRunner starten, dann wird the APP nach einer Rückfrage den fehlenden Hash im Modul ergänzen.

JavaRunner kann auch in einem BeanShell Skript verwendet werden über die Funktion JID.fnRunJava
Wenn Sie mehr als 1 Modul laden wollen, können Sie diese mit JID.fnAddToClasspath laden, bevor Sie das Hauptmodul mit JID.fnRunJava laden und starten. Auf diese Art können Sie Ant Custom Tasks laden, bevor Sie Ant selbst laden und starten. Konsultieren Sie das Wiki auf der Projekt Webseite, um mehr über die Verwendung von Ant auf Android zu erfahren.

Limitationen

  • Die Java Konsole-Applikation verwendet möglicherweise Klassen, die in Android nicht vorhanden sind. Fehlt eine benötigte Klasse, wird es einen Fehler bei der Ausführung geben. Sie können die fehlenden Klassen in einem eigenen Modul verfügbar machen. Aber dies ist nicht in jedem Fall erfolgreich.
  • Das Modul ist auf die gleichen Rechte limitiert, welche auch die APP hat.

7.1 Modulsicherheit

Module sind mit einem Hash Wert geschützt, welcher jedes Mal beim Laden des Moduls geprüft wird. Das 'Modul Salz', welches in den Einstellungen definiert werden kann, bewirkt dass der Hash für Sie einmalig wird. Die Hash Prüfung stellt sicher, dass die Klassen des Moduls nicht unautorisiert verändert wurden. Wenn der Hash Wert nicht stimmt, wird das Modul nicht geladen.

Wenn Sie das Modul Salz geändert haben, passen die Hash Werte nicht mehr, aber die APP prüft auch, ob die Hash Werte unter Verwendung des vorhergehenden Modul Salz passen. Wenn das der Fall ist, erlaubt es die APP, die Hash Werte unter Verwendung Ihres aktuellen (neuen) Modul Salz zu aktualisieren. Starten Sie also all Ihre Module einmal, nachdem Sie Ihr Modul Salz geändert haben! Wenn Sie das Modul Salz zweimal hintereinander ändern, ohne dazwischen die Hash Werte zu aktualisieren, werden Sie die Aktualisierung manuell durchführen müssen. Das Gleiche gilt für Module, welche mit JavaIDEdroid 2.5.0 oder älter erstellt wurden.

Um Modul Hash Werte manuell zu aktualisieren, müssen Sie den JavaIDEdroid Eintrag in der META-INF/MANIFEST.MF Datei innerhalb des Moduls entfernen. Beim nächsten Modulstart können Sie dann einen neuen Hash Wert erstellen lassen. Sie sollten den Hash Wert nur manuell aktualisieren, wenn Sie dem Modul auch wirklich trauen! Wenn Sie nicht sicher sind, ist es sicherer, das Modul neu zu erstellen.

top

8. Verwendung aus anderen Anwendungen

Die APP unterstützt die Intent Aktion "android.intent.action.VIEW" für Dateien mit den Extensionen .bsh , .jip und .json. Wenn Sie in Ihrem Android Dateimanager (z.B. ASTRO) .bsh Dateien anklicken, wird die APP gestartet und das Eingabefeld mit dem Pfad der Skript Datei vorbelegt. Wenn Sie .jip Dateien anklicken, wird die APP mit dem entsprechenden Projekt geöffnet. Bei .json Dateien liest die APP einen JSON String aus der Datei, erstellt daraus ein JSONObject und übernimmt die darin enthaltenen Datenelemente.

Der JSON String hat folgenden Inhalt:

{
  "ScriptPath": "/sdcard/Dev/HelloWorld/build.bsh",
  "ScriptArguments": ["arg 1", "arg 2"],
  "ProjectFilePath": "/sdcard/Dev/HelloWorld/HelloWorld.jip,
  "ScriptAutoRun": true,
  "ScriptAutoExit": true,
  "WantResultText": true
}
  • ScriptPath: Dies ist der Pfad des auszuführenden Skripts
  • ScriptArguments: Dies sind die (String) Argumente, die dem Skript übergeben werden
  • ProjectFilePath: Der Pfad zur Projekt Definitionsdatei, welche automatisch geöffnet wird
  • ScriptAutoRun: Wenn Sie dieses auf true setzen, wird das Skript beim Starten der APP sofort ausgeführt
  • ScriptAutoExit: Wenn Sie dieses auf true setzen, wird die APP nach dem Durchlaufen des Skripts automatisch wieder beendet.
  • WantResultText: Wenn Sie dieses auf true setzen, erhalten Sie die Skript Ausgabe des BeanShell Reiters zurück

Die APP unterstützt auch die Intent Aktion "android.intent.action.SEND" und kann aus anderen Anwendungen mittels folgendem Code gestartet werden:

ComponentName cn = new ComponentName("ch.tanapro.JavaIDEdroid", "ch.tanapro.JavaIDEdroid.MainActivity");
data = "data:application/json,{\"ScriptPath\": \"/sdcard/Dev/HelloWorld/build.bsh\", \"ScriptArguments\": [\"arg 1\", \"arg 2\"], \"ProjectFilePath\": \"/sdcard/Dev/HelloWorld/HelloWorld.jip\", \"ScriptAutoRun\": true, \"ScriptAutoExit\": true, \"WantResultText\": true}"; 
Intent intent = new Intent("android.intent.action.SEND");
intent.setComponent(cn);
intent.setData(Uri.parse(data));
startActivityForResult(intent,123);

In der data URI wird der JSON String übergeben mit der Formatangabe data:application/json,

Sie können die von der APP zurückgegebenen Daten in der onActivityResult Methode mit folgendem Code einlesen:

Bundle extras = intent.getExtras();
if (extras != null) 
{
  int iScriptResultCode=extras.getInt("android.intent.extra.ScriptResultCode",-1);
  String stResultText=extras.getString("android.intent.extra.ResultText");
}

ScriptResultCode wird immer zurückgegeben und enthält den Wert von JID.iScriptResultCode. Wenn das Skript diese Variable setzt, wird ihr Wert beim automatischen oder benutzer-initiierten Beenden der APP an die aufrufende App zurückgegeben.

Sie können die Skript Ausgabe des BeanShell Reiters auch aus der Protokolldatei /sdcard/.JavaIDEdroid/LogOutput.txt lesen. Dies geht natürlich nur dann, wenn Sie die Einstellung 'Protokolliere Ausgabe in Datei' aktiviert haben.

Die APP unterstützt die Intent Aktion "android.intent.action.CREATE_SHORTCUT" welche verwendet wird, um eine Verknüpfung zu JavaIDEdroid auf dem Android Startbildschirm zu erzeugen.

top

9. Debugging

Um Probleme der APP zu analysieren, können Sie in den Optionen den Log Level einstellen. Wenn ein höherer Wert als NONE (nichts) eingestellt ist, schreibt die APP diverse Informationen in die logcat. Am meisten Informationen werden mit dem Wert VERBOSE (geschwätzig) geschrieben.

Um die Logs anzusehen, können Sie die Logcat Activity aus dem Hauptmenü starten. Sie zeigt die Logs der APP und des Systems. Wenn die APP startet und wenn die Logcat Activity sich schliesst, wird ein Marker im Log gesetzt. Beim Start der Logcat Activity scrollt sie automatisch runter zum letzten Marker, so dass Sie einfach die Logeinträge überspringen können, welche Sie schon gesehen haben.

top

10. Rechtliches

Vielen Dank, dass Sie sich für diese SOFTWARE entschieden haben! Sie dürfen die SOFTWARE nur nutzen, wenn Sie mit den nachfolgenden Bestimmungen einverstanden sind:

URHEBERRECHT
Diese SOFTWARE wurde durch Tanapro GmbH (Tom Arn), www.tanapro.ch, (im folgenden AUTOR genannt) entwickelt. Alle Rechte vorbehalten.

KEINE GEWÄHRLEISTUNG
Die SOFTWARE wird im Ist-Zustand ausgeliefert. Der AUTOR lehnt jede Haftung ab, ob ausdrücklich oder gesetzlich, einschliesslich der Garantien der Handelbarkeit und der Eignung für einen bestimmten Zweck. Der AUTOR übernimmt keine Garantie dafür, dass die Software ausfallsicher oder fehlerfrei ist. Der Benutzer muss bei der Verwendung der SOFTWARE sämtliches Risiko übernehmen.

KEINE SCHADENHAFTUNG
Der AUTOR übernimmt keine Haftung für Schäden oder Folgeschäden, direkt oder indirekt, die aufgrund der Verwendung (oder der Unmöglichkeit der Verwendung) der SOFTWARE entstehen könnten, auch wenn der AUTOR über die Möglichkeit solcher Schäden in Kenntnis gesetzt worden ist.

top