NativeProcess: Programme ausführen mit AIR 2

Mit Adobe AIR 2 kann man erstmals native Prozesse starten und mit diesen interagieren. Was bedeutet dies? Ganz einfach: AIR 2 kann die bisherige Security-Sandbox verlassen und andere Programme starten.

Dieser Artikel gibt eine Einführung in das Thema. Als einfaches Beispiel habe ich mir etwas einfallen lassen: Es wird gezeigt, wie man mithilfe von AIR 2 den Flex-Compiler (mxmlc) startet und ihn eine MXML-Datei kompilieren lässt :)

air-native-process-finished

Native Installer

Einen Nachteil hat das neue Feature: Nutzt man native Prozesse, kann die AIR-Anwendung nicht mehr mit der mittlerweile gewohnten Installationsmethode (z.B. Button/Badge auf der Website) beim Nutzer aufgespielt werden.

The NativeProcess class and its capabilities are only available to AIR applications installed with a native installer (desktop extended profile applications).

Das Programm ist also nicht mehr plattformunabhängig und benötigt einen betriebssystem-spezifischen Installer. Mithilfe des ADT-Tools aus dem AIR SDK werden letztendlich ein DMG-Installer (Mac) bzw. ein EXE-Installer (Windows) erzeugt und ausgeliefert.

NativeProcess.isSupported

Um zu überprüfen, ob NativeProcess unterstützt wird, gibt es die statische Eigenschaft NativeProcess.isSupported. Dies kann in Form eines Beispielprogramms z.B. so aussehen:
air-native-process-supported

Der Quellcode dazu lautet:

[xml]




[/xml]

Wichtige Klassen: NativeProcess, NativeProcessStartupInfo

Das Kernstück ist die Klasse flash.desktop.NativeProcess. Mit ihr kann man ein Programm auf dem Host-System starten. Danach lassen sich Standard Input (stdin), Standard Output (stdout) und die Fehler (stderr) überwachen.

Die Klasse flash.desktop.NativeProcessStartupInfo sammelt die Informationen, die für das Starten des Programmes notwendig sind (z.B. Name und Speicherort des auszuführenden Datei, Argumente, etc.).

[xml]
var file:File = new File („/Applications/FlexSDK/flex_sdk_4.0.0.12222/bin/mxmlc“);
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.executable = file;
process = new NativeProcess();
process.start(nativeProcessStartupInfo);
[/xml]

Beim Dateinamen des auszuführenden Programms müsste man in der Praxis ggf. eine Fallunterscheidung der Betriebssysteme machen (z.B. Capabilities.os.toLowerCase().indexOf(„win“) größer -1 ?), um unterschiedliche Programmversion auszuführen.

Events

An einem Objekt vom Typ NativeProcess lassen sich auch einige neue Events registrieren. So gelangt man über ProgressEvent.STANDARD_OUTPUT_DATA an den Standard Output. Wenn das native Programm beendet wird, wird das Event flash.events.NativeProcessExitEvent abgefeuert.

[xml]
process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData);
process.addEventListener(NativeProcessExitEvent.EXIT, onStandardOutputClose);
[/xml]

Argumente

In vielen Fällen möchte man den Programm auch Parameter/Argumente mitgeben (z.B. ... -name Florian). Dazu erstellt man einfach ein Vector und fügt die einzelnen Argumente nacheinander hinzu.

[xml]
var args:Vector. = new Vector.;
args.push(„-name“);
args.push(„Florian“);
nativeProcessStartupInfo.arguments = args;
[/xml]

Descriptor File

Das Descriptor File für die AIR 2 Beta hat sich etwas geändert. Wichtig ist es, den Namespace anzupassen (http://ns.adobe.com/air/application/2.0beta). Außerdem muss man zur Nutzung von nativen Prozessen die Zeile mit „supportedProfiles” neu hinzufügen.

Eine funktionierendes Descriptor-File sieht dann z.B. so aus:
[xml]


de.florianplag.air2betademo
Air2Demo
v1

Main.swf

extendedDesktop

[/xml]

Quellcode

Der Quellcode des Eingangs genannten „Mini-Flex-Compiler“-Beispiels lautet am Stück:
[xml]



= new Vector.; args.push(„/Users/flo/Documents/workspace/Test2/src/Dummy.mxml“); nativeProcessStartupInfo.arguments = args; process = new NativeProcess(); process.start(nativeProcessStartupInfo); process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onOutputData); process.addEventListener(NativeProcessExitEvent.EXIT, onStandardOutputClose); } private function onOutputData(event:ProgressEvent):void { process.standardOutput.readBytes(processBuffer, processBuffer.length); } private function onStandardOutputClose(e:Event):void { myTxt.text += new String(this.processBuffer); } ]]>



[/xml]

Link: NativeProcess (ActionScript Hilfe)
Link: Interacting with a native process

[ad]

23 Gedanken zu „NativeProcess: Programme ausführen mit AIR 2“

  1. PS: Falls jemand das Setup des AIR2-Beta-SDKs nicht hinbekommt, einfach kurz hier melden. Dann kann ich aushelfen oder gar einen kurzen Artikel dazuschreiben.

  2. Hi flo,

    hab das Beispiel mal ausgetestet, jedoch mit Aptana Studio auf HTML/JavaScript basis. Im Debug Modus läuft der NativeProcess support. Kann das Projekt aber nicht kompilieren (Fehler: Descriptor must support the profile desktop, mobileDevice, or extendedMobileDevice). Wenn man statt <supportedProfiles>extendedDesktop</supportedProfiles> folgendes <supportedProfiles>desktop</supportedProfiles> verwendet, kann ich kompilieren aber der NativeProcess support ist nichtmehr gegeben.

    Im vorraus schonmal vielen Dank!

  3. Hi Eric,
    mit debuggen meinst du, es mit ADL auszuführen, oder?

    Das Erstellen des finalen Installers von Hand funktioniert so (am Mac):
    adt -package -storetype pkcs12 -keystore MyCert.p12 -target native NativeProcessTest.dmg Main-app.xml Main.swf

    (die native Anwendung, also den mxmlc-Compiler, habe ich jetzt nicht in das Paket einfügen lassen…)

    Evtl. gibt Aptana die entsprechenden Parameter nicht richtig mit? Das -target native müsste ja neu sind.

  4. Hi flo,

    ja es liegt daran, dass Aptana den -target native nicht anhängt und das obwohl Aptana nen Beta2.0 AIR Plugin released hat. Mit dem normalen adt funktioniert es.

    Grüße

    Eric

  5. Hallo,

    hier hat sich wohl ein fehler eingeschlichen…

    <supportedProfiles>extendedDesktop</supportedProfiles>

    Ändern in

    <supportedProfiles>desktop</supportedProfiles>
    Sonst gibts Fehler beim compilieren der APP.

    Gruß chrisz

  6. Hallo,

    ich benutze den Flex Builder mit dem SDK 3.4.
    Verwende ich extendedDesktop habe ich 'NativeProcess.isSupported'. Trage ich nur desktop ein, fehlt mir der Native Prozess, und ich kann keine externen *.exe ausführen.
    Leider kann ich mit extendedDesktop kein releasebuild erstellen.
    Jetzt weiß ich nicht, wie ich meine App exportieren kann. Ich habe geselesen, mit adt 2.xxx funktioniert das. Nur wie binde ich das ein, bzw. Update das ?
    Währe für eine Hilfe sehr dankbar.

    Meine adt version -> adt -version -> 1.5.2.8870

  7. Du kannst es direkt von Hand machen. Dazu gehst du in der Eingabeaufforderung in den Ordner, wo deine Projektfiles liegen. Dann eingeben:

    absoluter_pfad_zu_adt/adt.exe -package -storetype pkcs12 -keystore MyCert.p12 -target native NativeProcessTest.dmg Main-app.xml Main.swf

  8. Die swf und die xml liegen alle im gleichen Verzeichnis.

    Wie oben beschrieben kannst du nur eine .exe (Win) bzw. eine .dmg (Mac) erstellen, die solche Apps nur als nativer Installer funktionieren. Eine bestehende App, die als .air angeboten wird, kannst du vermutlich nicht aktualisieren.

  9. Hallo,

    ich bins nochmal… :)
    Versteh ich das richtig, dass die exe, die später ausgeführt werden soll, schon per adt übergeben werden muss ??

    Ich habe in meiner Air App, eine Browse Funktion, indem der Benuter eine *.exe auswählen kann, die dann als nativerprocess gestartet werden soll.

    Daher verstehe ich bei Deinem adt Befehl oben nicht, warum ich NativeProcessTest.dmg, bwz. NativeProcessTest.exe angeben muss. Ich erhalte immer -> no such File NativeProcessTest.exe.

    Zudem kommt, wenn ich eine exe verwende : error 301:: Application descriptor missing/cannot be opened.

    Ich krieg noch ne Krise…

  10. >Versteh ich das richtig, dass die exe, die später >ausgeführt werden soll, schon per adt übergeben >werden muss ??
    Die .exe/.dmg (in meinem Bsp. NativeProcessTest.dmg) ist der Name des Installers, der generiert wird!

    Damit deine .exe, die später ausgeführt werden soll, auch in den Installer gepackt wird, musst du sie noch hinten ans Ende hängen. Dort werden alle Files der Reihe nach aufgeführt, die berücksichtigt werden sollen.

  11. Hallo,

    ok, dann ich meine Denkweise doch richtig ;) Allerdings erhalte ich wie schon geschrieben -> no such File output.exe.

    Ich denke es liegt an der alten adt version.

    So sieht mein kompletter Aufruf aus :
    adt -package -storetype pkcs12 -keystore ../../certificate.p12 -target native output.exe DAC-app.xml DAC.swf

  12. Ahaa,

    das werde ich morgen einmal testen. Vielen dank für die hilfreichen antworten. Klasse Blog.

    Kann man das neue SDR auch im Flash/flex builder integrieren, dass man nicht jedes mal über die komandozeile gehen muss.

    Vielen dank nochmal…

    Lg chrisz

  13. Prinzipiell kannst du das auch in den Flash Builder integrieren. Ob das zurzeit korrekt funktioniert, weiß ich allerdings nicht (das AIR 2 SDK kam ja nach der Flash Builder Beta 2 raus)

  14. Hallo,

    Puhh, zweiter Teil ;) Wo finde ich den die atd ?

    Im Air2 SDK liegt eine adt.bat, und eine adt.jar. Die bat kann ich unter Windows7 nicht aufrufen…

    Schwere Geburt… ;)

  15. Hallo,

    so, hat sich erledigt. Nun funktionierts.

    Ich konnte sogar meine bestende Air App mit dem Installer Updaten. Sehr gut.

    Aufgerufen mit java -jar adt.jar ……..

    Vielen dank…

  16. Es tut mir leid, aber meine Deutschsprachen ist nicht so gut — ich bin amerikaner.

    Kannt man ein *.deb oder einanderes Linux Installer mit Air 2.0 machen, oder nur *.dmg oder *.exe?

    Danke sehr.

  17. Hallo,

    hast du es schon geschafft, den native Process Support mit der am 02.02.2010 erschienenden Air2Beta2 zu verwenden ?

    Ich erhalte nur noch einen

    VerifyError: Error #1014: Class flash.desktop::NativeProcess could not be found.

    fehler. Habe es auch schon mit dem Flex SDK 3.5 probiert. Keine Chance. Ist der NativeProcess Support etwa wieder obsolet ?

    Gruß cHrIsZ

  18. Tolle Einführung!
    Ich dachte, dass wir mit eigene Adobe Application Air GUI Designer wie Glade 3.x + C/C++ mit gcc, make und so weiter..

    Warum sollen wir nicht eigene Designer und ScriptEditor als Air :) We Beispiel Extjs Designer unter AIr 2.0.

    Danke werden wir sicher zusammenarbeiten :)

    Gruss Jens

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert