На момент запуска Java была единственным официально поддерживаемым языком программирования для создания распространяемого пакета APK. Android Native Development Kit (Android NDK), который позволит разработчикам создавать программные компоненты Android с C и C++. Помимо поддержки собственного кода, Google также расширение Android для поддержки популярных языков динамических сценариев и Google запустил Среду сценариев Android (ASE), но теперь она имеет открытый исходный код и известна как Уровень сценариев для Android (SL4A предоставляет языки сценариев для Android, позволяя редактировать и выполнять сценарии и интерактивные интерпретаторы непосредственно на устройстве Android.) И позволяет сторонним разработчикам создавать простые приложения для Android с perl, JRuby, Python, LUA и BeanShell.SL4A позволяет быстро создавать прототипы приложений для Android на самом устройстве с использованием языков сценариев высокого уровня. Эти скрипты имеют доступ ко многим API, доступным для полноценных приложений Android, но с значительно упрощенным интерфейсом, и вы можете встроить свой скрипт в отдельный APK.

Вы спросите, а зачем писать скрипты вместо реальных Android-приложений? По общему признанию, среда разработки Android значительно упрощает жизнь, но вы привязаны к компьютеру для выполнения своей работы. ASE позволяет вам разрабатывать на самом устройстве с использованием языков сценариев высокого уровня, чтобы быстро опробовать вашу идею в той ситуации, когда она вам нужна. Взгляните на следующий пример сценария Lua, чтобы убедиться в этом:

Если положить телефон экраном вниз, звонок будет отключен. Повторный поворот лицевой стороной вверх включит звонок.

require "android"
android.startSensing()
android.sleep(1)  --Give the sensors a moment to come online.
silent = false
while true do
  s = android.readSensors()
  facedown = s.result and s.result.zforce and s.result.zforce > 9
  if facedown and not silent then
    android.vibrate()  --A short vibration to indicate we're in silent mode.
    android.setRingerSilent(true)
    silent = true
  elseif not facedown and silent then
    android.setRingerSilent(false)
    silent = false
  end
  android.sleep(1)
end

Вот еще один полезный сценарий, на этот раз на Python.

«Произносите сообщения чата вслух по мере их поступления»

import android, xmpp

_SERVER = 'talk.google.com', 5223

class SayChat(object):
  def __init__(self):
    self.droid = android.Android()
    username = self.droid.getInput('Username')['result']
    password = self.droid.getInput('Password')['result']
    jid = xmpp.protocol.JID(username)
    self.client = xmpp.Client(jid.getDomain(), debug=[])
    self.client.connect(server=_SERVER)
    self.client.RegisterHandler('message', self.message_cb)
    if not self.client:
      print 'Connection failed!'
      return
    auth = self.client.auth(jid.getNode(), password, 'botty')
    if not auth:
      print 'Authentication failed!'
      return
    self.client.sendInitPresence()

  def message_cb(self, session, message):
    jid = xmpp.protocol.JID(message.getFrom())
    username = jid.getNode()
    text = message.getBody()
    self.droid.speak('%s says %s' % (username, text))

  def run(self):
    try:
      while True:
        self.client.Process(1)
    except KeyboardInterrupt:
      pass

saychat = SayChat()
saychat.run()

Эти скрипты демонстрируют несколько доступных API, доступных как для Lua, так и для Python. Он предназначен для работы в качестве службы и отключает звонок, когда телефон кладется экраном вниз. Для некоторых языков сценариев, таких как BeanShell, можно получить прямой доступ к Java API Android. Для упрощения в ASE есть класс AndroidFacade. Для других языков, таких как Python и Lua, API предоставляется через вызовы JSON RPC прокси. Естественно, это означает, что только та часть API, которая была обернута AndroidFacade и AndroidProxy, доступна для кросс-скомпилированных интерпретаторов, таких как Python и Lua. К счастью, и AndroidFacade, и AndroidProxy легко расширить.