2010-11-18 28 views
29

Tôi đã cài đặt Titanium từ appcelerator và xây dựng ứng dụng ví dụ "KitchenSink".Điều gì xảy ra với mã JavaScript sau khi ứng dụng được biên dịch bằng Titanium Mobile

Tất cả hoạt động tốt, tôi chỉ tự hỏi mã Javascript sẽ kết thúc ở đâu trong ứng dụng được tạo.

Tôi grep-ed dự án Xcode và cũng là ứng dụng kết quả như tôi đã tìm thấy trong Library/Application Support/iPhone Simulator/....KitchenSink.app, nhưng tôi không thể tìm thấy bất kỳ tên hàm nào từ các tệp .js, thậm chí không sử dụng văn bản chuỗi trong ứng dụng.

Thông tin gần nhất tôi tìm thấy là câu trả lời ở đây: How Does Appcelerator Titanium Mobile Work? nhưng tôi không hiểu rõ quy trình hoạt động như thế nào.

Mã javascript có được biên dịch thành mã nhị phân hay không?

Cập nhật:

Đây là những gì tôi có thể nhìn thấy trong một build/thư mục android của 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 

Tôi không nhìn vào app.apk trước đó, tất cả những gì có thể nhìn thấy được các tệp lớp này tương ứng với từng tệp javascript. Vì vậy, tôi giả định rằng trên Android javascript đang được biên soạn cho JVM. Tại sao những thứ này không thể tìm thấy trong app.apk?

+1

Tôi có thể sai ở đây nhưng khi tôi thử Appcelerator cho Android một vài tháng trở lại tôi đã có ấn tượng mã javascript không được biên dịch cả. Thay vào đó, nó được vận chuyển với tệp .apk cùng với một trình thông dịch javascript chạy mã javascript trong thời gian chạy. Tại sao chúng lại bao gồm mã javascript trong tập tin apk ngay từ đầu? –

Trả lời

46

Titanium không phải là trình bao bọc xung quanh chế độ xem web như đã nêu trước đó (mặc dù điều đó giải thích chính xác cách hoạt động của Phonegap). Câu trả lời của Jeff, được liên kết trong câu hỏi, là giải thích chính xác về cách thức hoạt động của Titanium, nhưng đây là phiên bản tốt nhất mà tôi đã nghe cho đến nay, từ Marshall Culpepper:

Đúng là Titanium Mobile đã sử dụng WebView (trong cả Android và iOS) trong các ngày trước 1.0 ngày. Tuy nhiên, điều này không còn đúng và chưa được phát hành 1.0 kể từ tháng 3 năm 2010.

Vì 1.0, chúng tôi đã gửi hai thời gian chạy Javascript riêng biệt với các ứng dụng của chúng tôi và chúng tôi đang chạy mã Javascript trực tiếp mà không cần một WebView. Toàn bộ ứng dụng của bạn từ đầu đến cuối giờ đã được JS kiểm soát và chúng tôi cung cấp một bộ API nguyên gốc toàn diện cho phép điều này. Mọi thứ từ các tiện ích giao diện người dùng (có, bao gồm cả WebView), các API cốt lõi như Mạng, Hệ thống tệp, Cơ sở dữ liệu, tất cả các cách cho những thứ cụ thể của HĐH như JS Hoạt động trong Android. Trên mặt trận thời gian chạy JS, chúng tôi đang chuyển một phiên bản chia tách của JavaScriptCore của WebKit trong iOS và ảnh chụp nhanh của Rhino 1.7 R3 CVS cho Android. Những gì chúng ta thực sự làm gì với nguồn javascript của bạn phụ thuộc vào nền tảng này, nhưng nói chung nó sẽ vỡ ra như thế này:

  • Nguồn được tĩnh phân tích để tìm tài liệu tham khảo để module Titanium
  • chuỗi Localization (strings.xml), App siêu dữ liệu (tiapp.xml) và mật độ hình ảnh cụ thể tất cả tạo ra các tương tự nền tảng cụ thể.
  • Trong iOS:
    • Một XCode dự án/cấu hình được tạo ra
    • JS Nguồn được base64'd và inlined như là một biến thành một file C tạo
    • xcodebuild được sử dụng để tạo ra các tập tin nhị phân thức
    • hồ sơ cấp phép, các phím ký tên vv được áp dụng
    • iTunes và một số loại keo khác được sử dụng để gửi IPA tới thiết bị iOS của bạn
  • Trong Android:
      dự án
    • Một Android/Eclipse được tạo
    • Trong chế độ "phát triển", nguồn JS được đóng gói như nội dung APK
    • In (sản xuất) chế độ "phân phối", khi bạn đã sẵn sàng để gửi ứng dụng, chúng tôi biên dịch JS sang Java bytecode bằng trình biên dịch Công cụ Cổ phần Rhino. Bạn cũng có thể bật tính năng này trong chế độ phát triển bằng cách đặt "ti.android.compilejs" thành "true" trong tiapp.xml, xem: http://developer.appcelerator.com/question/100201/enable-android-byte-code-compile
    • dex, aapt và các công cụ SDK Android khác được sử dụng để tạo và tạo APK cuối cùng
    • adb và keytool được sử dụng để đẩy apk ra các giả lập và/hoặc thiết bị

có rất nhiều chi tiết mà tôi có thể bổ nhào vào cụ thể về mỗi một trong các điểm, nhưng điểm tôi muốn lái xe về nhà là chúng tôi không còn sử dụng WebView làm công cụ Javascript nữa. Tuy nhiên, bạn có thể tuy nhiên vẫn nhúng WebView và chúng tôi cung cấp một số tích hợp đơn giản cho phép bạn gọi các API Titan từ một WebView được nhúng.

+0

Cho dù, Mã nguồn "HTML CSS & JS" của "Appcelerator Desktop App" có thể được nhìn thấy trong "Windows OS" không ?? – cupcake

+0

Nếu câu hỏi là "Có thể HTML/CSS/JS của ứng dụng Titan Desktop được xem trên Windows (hoặc bất kỳ hệ điều hành nào)" câu trả lời hiện có.Chúng tôi không cung cấp bất kỳ mã hóa tự động hoặc bao gồm nguồn trong nhị phân, nhưng chúng tôi có thể làm như vậy trong tương lai. Trong thời gian chờ đợi, chúng tôi khuyên mọi người nên kết hợp, rút ​​gọn và làm xáo trộn nguồn JavaScript của họ. –

+0

công việc tốt! cảm ơn vì đã đưa ra những chi tiết như vậy :) – Alex

4

Điều jhaynie đang nói trong câu hỏi được liên kết của bạn là Titanium diễn giải mã JS của bạn và chuyển đổi nó thành mã gì đó gần giống với Objective-C.

Trong một ứng dụng web, trình duyệt đọc và giải thích Javascript của bạn và chạy mã gốc có liên quan (có thể là C++) trong nội bộ. Ví dụ, trình duyệt có thể nói, "Kịch bản này đang thực thi getElementById(), vì vậy tôi sẽ chạy các phương thức C++ của riêng mình để thực hiện điều đó." Điều mà Titanium đang làm là tìm ra JS-> C++ (hoặc trong trường hợp này, JS-> Objective-C) sẽ là trước và biên dịch nó. Nó vẫn để lại một thông dịch viên mở khi cần thiết cho mã động của bạn, nhưng nó sẽ chuyển đổi và biên dịch những gì nó có thể.

Điều đó có nghĩa là bạn sẽ không tìm thấy bất kỳ nội dung nào trông giống với nội dung bạn đã viết ban đầu trong tập lệnh của mình. Mọi thứ phải được để lại cho một thông dịch viên vẫn được xử lý và chuyển đổi, và các ký hiệu của bạn sẽ thay đổi (ví dụ: cuộc gọi đến myTestFunction() có thể được chuyển đổi thành A() hoặc 10001101001101: P).


Các thường sử dụng Javascript để có nó giải thích thời gian thực bằng một chương trình đang chạy. Đó không phải là những gì đang xảy ra ở đây, và đó là lý do tại sao bạn không thể nhìn thấy bất kỳ dấu vết của kịch bản của bạn.

  • Javascript là tiền xử lý

    Titanium thực hiện việc giải thích kịch bản của bạn như bất kỳ chương trình nào khác sẽ làm gì (chẳng hạn như một trình duyệt web). Nó chỉ ra những gì phụ thuộc kịch bản của bạn có trên các API Titanium và đặt công cụ lên. Sau đó nó ánh xạ các biểu tượng của bạn trực tiếp vào (trong trường hợp của iPhone) Objective-C.

    Một chương trình thường đọc trong tập lệnh của bạn (chỉ đơn giản là một Chuỗi), diễn giải nó và chạy mã C để hoàn thành những gì kịch bản của bạn yêu cầu.Titanium thực hiện điều này trước khi bàn tay để tìm ra mã C nào sẽ được chạy và thực hiện chuyển đổi trước.

  • Mã được biên dịch nếu có thể

    Dựa trên việc giải thích của mã của bạn và phụ thuộc của nó trên API Titanium, Titanium hiểu ra những gì mã có thể được biên dịch trực tiếp, và những gì không được biên soạn theo thứ tự để cho phép họ có đầy đủ động lực của Javascript. Tôi không biết làm thế nào nó chọn những gì không và không được biên soạn, nhưng bạn có thể kiểm tra nguồn nếu bạn muốn biết rằng nhiều chi tiết.

    Mã mà vẫn phải được diễn giải (còn lại dưới dạng tập lệnh) vẫn được chuyển đổi thành các biểu tượng dẫn đến ánh xạ hiệu quả hơn vào mã gốc. Vì vậy, nó vẫn là một kịch bản giải thích, nhưng điều đó không có nghĩa là nó vẫn là Javascript. Điều này có nghĩa là các phần này của tập lệnh của bạn sẽ vẫn chạy nhanh hơn Javascript thông thường.

    Đối với iPhone, C đồng bộ được biên dịch với GCC để tạo một tệp nhị phân gốc.

  • Bạn có một ứng dụng Runnable *

    Bây giờ bạn có một ứng dụng mà bạn có thể chạy trên thiết bị di động của bạn. Mã compilable của bạn đã được biên dịch và chạy ở tốc độ chớp, trong khi phần còn lại được chuyển đổi và vẫn được giải thích một cách hiệu quả hơn chạy ở tốc độ gần như chớp. : P

  • Tôi hy vọng điều này có ý nghĩa bây giờ, bởi vì đó là tất cả những gì tôi có! : D

    +1

    Điều này vẫn còn rất khó hiểu. Biên dịch là một quá trình chuyển đổi mã nguồn được viết bằng ngôn ngữ lập trình thành mã đối tượng - mã thực thi. Làm thế nào một phần có thể được biên dịch và một phần khác thì không. Bởi những gì có nghĩa là biên dịch được thực hiện, nó tạo ra mục tiêu-c và biên dịch với gcc? Javascript được chuyển đổi thành một số cấu trúc mà sau đó được diễn giải trong một chương trình đang chạy? – Michal

    +0

    Tôi sẽ cố thêm một phiên bản đơn giản khác vào câu trả lời của tôi ở trên. Phần lớn nó sẽ dư thừa ... – Brendan

    +0

    Brendan, cảm ơn bạn đã giải thích hữu ích. Câu trả lời của bạn có thể đủ tốt cho những người có nền tảng về phát triển web, nhưng nó không cắt nó cho tôi đến từ phía bên kia của lập trình. Tôi không nhận thức được bất kỳ trình biên dịch javascript vì vậy tôi nghi ngờ bất cứ điều gì thực sự được biên dịch. Tôi đã kiểm tra những gì Titanium tạo ra cho Android và ở đó tôi thấy một tập tin jvm 'class' được tạo ra cho mỗi tập lệnh' js'. Vâng, java luôn luôn được giải thích, do đó, trên nền tảng đó là một cách tự nhiên để làm. Tôi nghĩ rằng họ sử dụng 'jsc' để biên dịch nó. Nhưng làm thế nào mà làm việc cho iPhone - Tôi không thấy bất cứ điều gì đang được tạo ra ở đó. – Michal

    Các vấn đề liên quan