ما يحدث لرمز JavaScript بعد تجميع التطبيق باستخدام Titanium Mobile

StackOverflow https://stackoverflow.com/questions/4217551

سؤال

لقد قمت بتثبيت Titanium من AppCelerator وقمت بتطبيق مثال "Kitchensink".

كل شيء يعمل بشكل جيد ، أنا فقط أتساءل أين ينتهي رمز JavaScript في تطبيق مدمج.

أنا أتعامل مع مشروع Xcode وأيضًا تطبيق النتيجة كما وجدته في Library/Application Support/iPhone Simulator/....KitchenSink.app, ، لكن لا يمكنني العثور على أي أسماء وظائف من .js الملفات ، ولا حتى نصوص السلسلة المستخدمة داخل التطبيق.

أقرب المعلومات التي وجدتها هي إجابة هنا: كيف يعمل Appcelerator Titanium Mobile Mobile؟ لكنني لا أفهم بوضوح كيف تعمل العملية.

هل يتم تجميع رمز JavaScript في رمز ثنائي (ما هو برنامج التحويل البرمجي المستخدم بعد ذلك؟) ، أم أنه يتحول فقط في بعض تنسيق البيانات الخاص ويتم تفسيره في تطبيق التشغيل؟

تحديث:

هذا ما يمكنني رؤيته في دليل بناء/Android لـ 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

لم أنظر إلى app.apk من قبل ، كل ما يمكن أن أراه هو ملفات الفصل هذه المقابلة لكل ملف من ملفات JavaScript. لذلك افترضت أنه على Android JavaScript يتم تجميعها لـ JVM. لماذا لا يمكن العثور عليها في app.apk؟

هل كانت مفيدة؟

المحلول

التيتانيوم ليس غلافًا حول عرض الويب كما هو مذكور من قبل (على الرغم من أن ذلك يشرح بدقة كيفية عمل PhoneGap). إجابة جيف ، المرتبطة في السؤال ، هي شرح صحيح تقنيًا لكيفية عمل التيتانيوم ، ولكن إليك أفضل إصدار سمعته حتى الآن ، من مارشال كولبيبر:

صحيح أن Titanium Mobile استخدم WebView (في كل من Android و IOS) في ما قبل 1.0 أيام. ومع ذلك ، لم يعد هذا صحيحًا ولم يكن منذ إصدار 1.0 هو مارس 2010.

منذ 1.0 ، قمنا بشحن اثنين من أوقات تشغيل JavaScript منفصلة مع تطبيقاتنا ، ونحن ندير رمز JavaScript مباشرة بدون ويب. يتم الآن التحكم في تطبيقك بالكامل من البداية إلى النهاية ، ونحن نقدم مجموعة شاملة من واجهات برمجة التطبيقات الأصلية التي تمكن ذلك. كل شيء من واجهة المستخدم واجهة المستخدم (نعم ، بما في ذلك WebView) ، واجهات برمجة التطبيقات الأساسية مثل الشبكات ، ونظام الملفات ، وقاعدة البيانات ، وصولاً إلى أشياء خاصة بنظام التشغيل مثل أنشطة JS في Android. على جبهة وقت التشغيل JS ، نقوم بشحن نسخة متشاهرة من JavaScriptCore من WebKit في iOS وقطعة من Chino 1.7 R3 CVS لنظام Android. ما نفعله بالفعل مع مصدر JavaScript الخاص بك يعتمد على النظام الأساسي ، ولكن بشكل عام ينفجر مثل هذا:

  • يتم تحليل المصدر بشكل ثابت لإيجاد إشارات إلى وحدات التيتانيوم
  • سلاسل التوطين (STRINGS.XML) ، بيانات تعريف التطبيق (TIAPP.XML) ، والصور المحددة الكثافة جميعها تولد نظيرات محددة منصة.
  • في iOS:
    • يتم إنشاء مشروع / تكوين Xcode
    • مصدر JS هو BASE64'D وينقل كمتغير في ملف C الذي تم إنشاؤه
    • يتم استخدام Xcodebuild لإنشاء الثنائيات النهائية
    • يتم تطبيق ملفات تعريف توفير مفاتيح التوقيع وما إلى ذلك
    • يتم استخدام iTunes وبعض الغراء الآخر لإرسال IPA إلى جهاز iOS الخاص بك
  • في Android:
    • تم إنشاء مشروع Android / Eclipse
    • في وضع "التطوير" ، يتم تعبئة مصدر JS كأصول APK
    • في وضع "التوزيع" (الإنتاج) ، عندما تكون مستعدًا لشحن التطبيق ، نقوم بتجميع JS إلى Java Bytecode باستخدام برنامج التحويل البرمجي Rhino JSC. يمكنك أيضًا تمكين هذا أثناء وضع التطوير عن طريق تعيين "ti.android.compilejs" إلى "true" في tiapp.xml ، راجع: http://developer.appcelerator.com/question/100201/enable-droid-byte-code-compile
    • يتم استخدام أدوات DEX و AAPT وغيرها من أدوات Android SDK لإنشاء وإنشاء APK النهائي
    • يتم استخدام ADB و Keytool لدفع APK إلى الخارج إلى المحاكي و/أو الجهاز

هناك العديد من التفاصيل التي يمكنني الغوص فيها على وجه التحديد على كل نقطة من هذه النقاط ، لكن النقطة التي أردت أن أقودها إلى المنزل هي أننا لم نعد نستخدم WebView كمحرك JavaScript الخاص بنا. أنت تستطيع ومع ذلك ، لا تزال تضمين مشاهدات الويب ، ونحن نقدم بعض التكامل البسيط الذي يتيح لك استدعاء واجهات برمجة تطبيقات التيتانيوم من عرض ويب مضمن.

نصائح أخرى

ما يقوله Jhaynie في سؤالك المرتبط هو أن التيتانيوم يفسر رمز JS الخاص بك ويحوله إلى شيء مماثل تقريبًا للهدف C.

في تطبيق ويب ، يقرأ المتصفح ويفسر JavaScript ويقوم بتشغيل الكود الأصلي المرتبط (ربما C ++) داخليًا. على سبيل المثال ، قد يقول المتصفح ، "هذا البرنامج النصي ينفذ getElementById(), ، لذلك سأقوم بتشغيل أساليب C ++ الخاصة بي لإنجاز ذلك. "ما يفعله التيتانيوم هو معرفة ما هو JS-> C ++ (أو في هذه الحالة ، JS-> Objective-C) قبل ذلك ، وتجميع ذلك. لا يزال يترك مترجمًا مفتوحًا عند الضرورة للرمز الديناميكي الخاص بك ، لكنه سيقوم بتحويل وتجميع ما يمكنه.

هذا يعني أنك لن تجد أي شيء يشبه ما كتبته في الأصل في البرنامج النصي الخاص بك. لا يزال يتم معالجة أي شيء يجب تركه إلى مترجم مترجم ، وسيتغير رموزك (مثل مكالمة myTestFunction() قد يتم تحويله إلى A(), ، أو 10001101001101 : P).


ال معتاد استخدام JavaScript هو تفسيره في الوقت الفعلي من خلال برنامج تشغيل. هذا ليس ما يحدث هنا ، ولهذا السبب لا يمكنك رؤية أي أثر للنص الخاص بك.

  • JavaScript تم معالجته مسبقًا

    يقوم Titanium بتفسير البرنامج النصي الخاص بك كما يفعل أي برنامج آخر (مثل متصفح الويب). إنه يكتشف التبعيات التي يمتلكها البرنامج النصي الخاص بك على واجهة برمجة تطبيقات التيتانيوم ويضع هذه الأشياء. ثم يقوم بتخطيط رموزك مباشرة في (في حالة iPhone) Objective-C.

    عادةً ما يقرأ البرنامج في البرنامج النصي (وهو مجرد سلسلة) ، ويفسره ، ويقوم بتشغيل رمز C لإنجاز ما طلبه البرنامج النصي. تقوم التيتانيوم بذلك قبل معرفة ما يجب تشغيل رمز C ، ويقوم بالتحويل مقدمًا.

  • يتم تجميع الكود حيثما أمكن ذلك

    استنادًا إلى تفسير الكود الخاص بك وتبعياته على واجهة برمجة تطبيقات التيتانيوم ، فإن التيتانيوم تكتشف الرمز الذي يمكن تجميعه مباشرة ، وما يجب تجميعه للسماح بديناميات JavaScript الكاملة. لا أعرف كيف يختار ما يفعل ولا يتم تجميعه ، ولكن يمكنك التحقق من المصدر إذا كنت تريد معرفة الكثير من التفاصيل.

    لا يزال يتم تحويل الكود الذي يجب تفسيره (تركه كنص) إلى رموز تؤدي إلى رسم خرائط أكثر كفاءة إلى الكود الأصلي. لذلك لا يزال البرنامج النصي المفسر ، لكن هذا لا يعني أنه لا يزال JavaScript. هذا يعني أن هذه الأجزاء من البرنامج النصي ستظل أسرع من JavaScript المعتاد.

    بالنسبة إلى iPhone ، يتم تجميع C المترجم C مع GCC لإنشاء ثنائي أصلي.

  • لديك تطبيق قابل للتشغيل*

    الآن لديك تطبيق يمكنك تشغيله على جهازك المحمول. تم تجميع الكود القابل للتجميع الخاص بك ويعمل بسرعة البرق ، بينما يتم تحويل الباقي ولا يزال يتم تفسيره بطريقة أكثر كفاءة تعمل بسرعة البرق القريبة. : ص

  • آمل أن يكون هذا منطقيًا الآن ، لأنه كل ما لدي! :د

    مرخصة بموجب: CC-BY-SA مع الإسناد
    لا تنتمي إلى StackOverflow
    scroll top