Pergunta

Instalei o Titanium do appcelerator e criei o aplicativo de exemplo "KitchenSink".

Tudo funciona bem, só estou me perguntando onde o código javascript vai parar em um aplicativo criado.

Eu fiz um grep no projeto Xcode e também no aplicativo de resultados como o encontrei em Library/Application Support/iPhone Simulator/....KitchenSink.app, mas não consigo encontrar nenhum nome de função de .js arquivos, nem mesmo textos de string usados ​​no aplicativo.

As informações mais próximas que encontrei são uma resposta aqui: Como funciona o Appcelerator Titanium Mobile? mas não entendo claramente como funciona o processo.

O código javascript está sendo compilado em um código binário (qual compilador é usado então?) Ou é apenas transformado em algum formato de dados especial e interpretado em um aplicativo em execução?

Atualizar:

Isto é o que posso ver em um diretório build/Android do 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

Não olhei para app.apk antes, tudo que pude ver foram esses arquivos de classe correspondentes a cada um dos arquivos javascript.Portanto, presumi que no Android o javascript está sendo compilado para JVM.Por que eles não podem ser encontrados em app.apk?

Foi útil?

Solução

O Titanium não é um invólucro em torno de uma visualização da web, como afirmado anteriormente (embora isso explique com precisão como o Phonegap funciona).A resposta de Jeff, vinculada à pergunta, é uma explicação tecnicamente correta de como o Titanium funciona, mas aqui está a melhor versão que ouvi até agora, de Marshall Culpepper:

É verdade que o Titanium Mobile usava o WebView (no Android e no iOS) nos dias anteriores à versão 1.0.No entanto, isso não é mais verdade e não é mais desde nosso lançamento 1.0, em março de 2010.

Desde a versão 1.0, enviamos dois tempos de execução Javascript separados com nossos aplicativos e estamos executando o código Javascript diretamente sem um WebView.Todo o seu aplicativo, do início ao fim, agora é controlado por JS, e fornecemos um conjunto abrangente de APIs nativas que permitem isso.Tudo, desde widgets de UI (sim, incluindo WebView), APIs principais como rede, sistema de arquivos, banco de dados, até coisas específicas do sistema operacional, como atividades JS no Android.No que diz respeito ao tempo de execução JS, estamos enviando uma versão bifurcada do JavaScriptCore do WebKit no iOS e um instantâneo do Rhino 1.7 R3 CVS para Android.O que realmente fazemos com sua fonte javascript depende da plataforma, mas geralmente é dividido assim:

  • A fonte é analisada estaticamente para encontrar referências aos módulos Titanium
  • Strings de localização (strings.xml), metadados de aplicativos (tiapp.xml) e imagens específicas de densidade geram análogos específicos da plataforma.
  • No iOS:
    • Um projeto/configuração XCode é gerado
    • JS Source é base64 e embutido como uma variável em um arquivo C gerado
    • xcodebuild é usado para gerar os binários finais
    • perfis de provisionamento, chaves de assinatura, etc. são aplicados
    • iTunes e alguma outra cola são usados ​​para enviar o IPA para o seu dispositivo iOS
  • No Android:
    • Um projeto Android/Eclipse é gerado
    • No modo "Desenvolvimento", a fonte JS é empacotada como ativos APK
    • No modo "Distribuição" (produção), quando você estiver pronto para enviar o aplicativo, compilamos o bytecode JS para Java usando o compilador Rhino JSC.Você também pode ativar isso durante o modo de desenvolvimento definindo "ti.android.compilejs" como "true" em tiapp.xml, consulte: http://developer.appcelerator.com/question/100201/enable-android-byte-code-compile
    • dex, aapt e outras ferramentas Android SDK são usadas para construir e gerar o APK final
    • adb e keytool são usados ​​para enviar o APK para o emulador e/ou dispositivo

Há muitos outros detalhes nos quais eu poderia me aprofundar especificamente em cada um desses pontos, mas o que gostaria de enfatizar é que não usamos mais o WebView como nosso mecanismo Javascript.Você pode no entanto, ainda incorporamos WebViews e fornecemos algumas integrações simples que permitem chamar APIs Titanium a partir de um WebView incorporado.

Outras dicas

O que jhaynie está dizendo na sua pergunta vinculada é que o Titanium interpreta seu código JS e o converte em algo quase idêntico ao Objective-C.

Em uma aplicação web, o navegador lê e interpreta seu Javascript e executa o código nativo associado (talvez C++) internamente.Por exemplo, o navegador pode dizer: "Este script está executando getElementById(), então executarei meus próprios métodos C++ para conseguir isso." O que o Titanium está fazendo é descobrir antecipadamente o que JS->C++ (ou neste caso, JS->Objective-C) e compilar isso.Ele ainda deixa um interpretador aberto quando necessário para o seu código dinâmico, mas irá converter e compilar o que puder.

Isso significa que você não encontrará nada semelhante ao que escreveu originalmente em seu script.Qualquer coisa que deva ser deixada para um intérprete ainda será processada e convertida, e seus símbolos mudarão (por exemplo,uma chamada para myTestFunction() pode ser convertido para A(), ou 10001101001101 :P).


O habitual O uso de Javascript é interpretá-lo em tempo real por um programa em execução.Não é isso que está acontecendo aqui e é por isso que você não consegue ver nenhum vestígio do seu script.

  • Javascript é pré-processado

    O Titanium executa a interpretação do seu script como qualquer outro programa faria (como um navegador da web).Ele descobre quais dependências seu script tem da API Titanium e configura essas coisas.Em seguida, ele mapeia seus símbolos diretamente (no caso do iPhone) Objective-C.

    Um programa normalmente leria seu script (que é simplesmente uma String), o interpretaria e executaria o código C para realizar o que seu script solicitou.O Titanium faz isso antecipadamente para descobrir qual código C deve ser executado e faz a conversão antecipadamente.

  • O código é compilado sempre que possível

    Com base na interpretação do seu código e suas dependências da API Titanium, o Titanium descobre qual código pode ser compilado diretamente e o que não deve ser compilado para permitir a dinâmica completa do Javascript.Não sei como ele escolhe o que é compilado ou não, mas você pode verificar a fonte se quiser saber tantos detalhes.

    O código que ainda deve ser interpretado (deixado como script) ainda é convertido em símbolos que resultam em um mapeamento mais eficiente para o código nativo.Portanto, ainda é um script interpretado, mas isso não significa que ainda seja Javascript.Isso significa que essas partes do seu script ainda serão executadas mais rápido que o Javascript normal.

    Para iPhone, o C compilável é compilado com GCC para criar um binário nativo.

  • Você tem um aplicativo executável*

    Agora você tem um aplicativo que pode ser executado no seu dispositivo móvel.Seu código compilável foi compilado e executado na velocidade da luz, enquanto o resto é convertido e ainda interpretado de uma forma mais eficiente, que é executada quase na velocidade da luz.:P

  • Espero que isso faça sentido agora, porque é tudo que tenho!:D

    Licenciado em: CC-BY-SA com atribuição
    Não afiliado a StackOverflow
    scroll top