Was passiert mit JavaScript-Code, nachdem die App mit Titanium Mobile kompiliert wurde?
Habe ich installiert, Titanium von appcelerator und baute die "KitchenSink" Beispiel-Anwendung.
Alles funktioniert gut, ich Frage mich nur, wo steht der javascript-code landet in einer integrierten app.
Ich grep-ed das Xcode Projekt und auch das Ergebnis der Anwendung, als ich es gefunden in Library/Application Support/iPhone Simulator/....KitchenSink.app
aber ich finde keine Funktion, die Namen von .js
Dateien, auch keine string-Texte innerhalb der Anwendung verwendet.
Nächste information, die ich gefunden ist hier eine Antwort : Wie Funktioniert Appcelerator Titanium Mobile Arbeit?aber ich verstehe nicht ganz klar, wie der Prozess funktioniert.
Ist der javascript-code kompiliert wird in einen Binär-code (welchen compiler benutzt wird?), oder ist es nur umgewandelt in einigen speziellen Daten-format interpretiert und in eine laufende Anwendung ?
Update:
Dies ist, was ich sehen kann bauen/android directory von KitchenSink:
michal:bin mac$ find . -name table_view_layout\*
./assets/Resources/examples/table_view_layout.js
./assets/Resources/examples/table_view_layout_2.js
./assets/Resources/examples/table_view_layout_3.js
./assets/Resources/examples/table_view_layout_4.js
./assets/Resources/examples/table_view_layout_5.js
./classes/org/appcelerator/generated/examples/table_view_layout.class
./classes/org/appcelerator/generated/examples/table_view_layout_2.class
./classes/org/appcelerator/generated/examples/table_view_layout_3.class
./classes/org/appcelerator/generated/examples/table_view_layout_4.class
./classes/org/appcelerator/generated/examples/table_view_layout_5.class
michal:bin mac$ unzip -t app.apk | grep table_view_layout
testing: assets/Resources/examples/table_view_layout.js OK
testing: assets/Resources/examples/table_view_layout_2.js OK
testing: assets/Resources/examples/table_view_layout_3.js OK
testing: assets/Resources/examples/table_view_layout_4.js OK
testing: assets/Resources/examples/table_view_layout_5.js OK
Ich schaue nicht in die app.apk vor, alles was ich sehen konnte waren diese class-Dateien für den entsprechenden javascript-Dateien. Daher bin ich davon ausgegangen, dass auf Android javascript kompiliert wird für die JVM. Warum kann das nicht finden im app.apk ?
InformationsquelleAutor der Frage Michal | 2010-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Titan ist kein wrapper um eine web-Ansicht, wie bereits erwähnt (obwohl, die genau erklärt, wie Phonegap funktioniert). Jeff ' s Antwort, verbunden mit der Frage, ist eine technisch korrekte Erklärung, wie Titan arbeiten, aber hier ist die beste version die ich gehört habe bisher, aus Marshall Culpepper:
Es ist wahr, dass Titanium Mobile WebView (Android und iOS) in den pre-1.0 Tage. Dies ist jedoch nicht mehr der Fall ist und noch nicht seit Version 1.0 (März 2010).
Seit 1.0, wir haben ausgeliefert, zwei separate Javascript-Laufzeitumgebungen mit unseren apps, und sind wir mit dem Javascript-code direkt ohne eine WebView. Ihre gesamte app von Anfang bis Ende gesteuert von JS, und wir bieten ein umfassendes set von Nativen APIs, die es ermöglichen, dieses. Alles von UI-widgets (ja, einschließlich der WebView), Core-APIs, wie Networking -, Dateisystem, Datenbank, den ganzen Weg, um OS-spezifische Dinge wie JS Aktivitäten in Android. Auf die JS-Laufzeitumgebung vor, wir sind ein Versand-Gabel-version von WebKit ' s JavaScriptCore in iOS und eine Momentaufnahme der Rhino 1.7 R3 CVS für Android. Was wir tatsächlich tun, mit javascript-Quelle ist abhängig von der Plattform, aber generell ist es zerbricht wie diese:
Gibt es viele weitere details, ich könnte Tauchen Sie ein in ein speziell auf jeden dieser Punkte, aber der Punkt, den ich wollte, nach Hause zu fahren, ist, dass wir nicht mehr mit dem WebView als unsere Javascript-engine. Sie kann aber noch einbetten, WebViews, und wir bieten einige einfache integration, die können Sie aufrufen Titan-APIs aus einer integrierten WebView.
InformationsquelleAutor der Antwort Kevin Whinnery
Was jhaynie sagt in deiner verlinkten Frage ist, dass Titan interpretiert Ihre JS-code und wandelt es in etwas, das fast identisch mit Objective-C.
In eine web-Anwendung, die browser liest und interpretiert Ihre Javascript-und läuft damit verbundenen native code (vielleicht C++) intern. Zum Beispiel, der browser könnte sagen, "Dieses Skript wird ausgeführt
getElementById()
also werde ich meine eigene C++ - Methoden, das zu schaffen." Was Titanium macht, ist, herauszufinden, was, JS->C++ (oder in diesem Fall, JS->Objective-C) wäre im Voraus, und kompilieren. Es lässt immer noch einen Dolmetscher zu öffnen, wo Bedarf für Ihre dynamischen code, aber es wird konvertieren und zu kompilieren, was es kann.Das bedeutet, dass Sie nicht finden, etwas, dass so ähnlich aussieht wie das, was Sie ursprünglich schrieb in Ihrem Skript. Alles, was verlassen werden muss, auf einen Dolmetscher ist es immer noch verarbeitet und umgewandelt, und Ihre Symbole zu verändern (z.B. einen Anruf zu
myTestFunction()
könnte umgewandelt werdenA()
oder10001101001101
:P).Den üblichen Verwendung von Javascript ist, um es interpretiert in Echtzeit die von einem Laufenden Programm. Das ist nicht das, was hier vorgeht, und das ist, warum Sie nicht sehen können, jede Spur von Ihrem Skript.
Titan führt die interpretation Ihres Skripts wie jedes andere Programm tun würde (z.B. web-browser). Es rechnet aus, welche Abhängigkeiten hat Ihr Skript auf die Titanium-API und legt das Zeug auf. Es ordnet dann Ihre Symbole, die direkt in die (in dem Fall das iPhone) Objective-C.
Ein Programm, in der Regel würde Sie Lesen, in Ihrem Skript (das ist einfach ein String), interpretiert Sie und führt C-code zu erreichen, was Ihr Skript gefragt. Titan tut dies, bevor die hand, um herauszufinden, was der C-code ausgeführt werden soll, und führt die Konvertierung im Voraus.
Auf der Grundlage der interpretation des Codes und seine Abhängigkeiten auf die Titanium-API, Titan zahlen, was in der code kann direkt kompiliert, und was muss nicht kompiliert werden, damit Sie die volle Dynamik von Javascript. Ich weiß nicht, wie es wählt, und nicht kompiliert bekommen, aber Sie könnte prüfen, die Quelle, wenn Sie wissen wollen, wie viel detail.
Code, der muss sich noch interpretted (Links im Skript) ist noch zu Symbolen, die im Ergebnis zu einer effizienteren Zuordnung zu native code. So ist es immer noch eine interpretierte Skript, aber das bedeutet nicht, es ist immer noch Javascript. Dies bedeutet, dass diese Teile des Skripts wird noch schneller laufen als die üblichen Javascript.
Für das iPhone, das kompilierbare C compiliert mit GCC zu erstellen, die eine native binary.
Jetzt haben Sie eine app, die Sie ausführen können, auf Ihr mobiles Gerät. Ihre kompilierbare code wurde kompiliert und läuft mit Lichtgeschwindigkeit, während der rest umgebaut wurde und immer noch interpretiert, in einer effizienteren Weise, die läuft in der Nähe der Lichtgeschwindigkeit. 😛
Ich hoffe das macht jetzt Sinn, denn es ist alles, was ich habe! 😀
InformationsquelleAutor der Antwort Brendan