Android Scripting Environment(ASE)是Google针对Android操作系统发布的一个小工具。ASE将脚本语言带入Android,允许用户编辑和执行脚本,直接在Android设备上运行交互式解释器。脚本将能大幅度简化任务界面,目前支持Python, Perl, JRuby, Lua, BeanShell, JavaScript, Tcl, shell,以后将会增加更多的语言的支持。
从此可以直接通过脚本(解释语言)方便快捷的调用Android系统中大部分的API,其可以完全满足对那些想把手机功能发挥到极致的“生物”。根据官方发布的消息,其可以通过非常简便的接口快速实现以下功能:
Handle Intents
启动Activities
发送通话请求
发送文字信息
扫描条形码
获取地理信息和返回设备传感器状态信息
使用语音输出文字信息
ASE提供的API可以参考官方文档(http://code.google.com/p/android-scripting/wiki/ApiReference)
ASE其实就是Client端和Server端用JSON去通信. Server端是Android的那一套了,Java 通过JNI调用C/C++.
Server原理:
首先,建立 AndroidProxy Service,它会负责Run JsonRpcServer.这个Server非常重要,它负责监听以及和Script PC Client 端通信.那么这里有两个很重要的Thread, 第一是Thread 用于Listen Socket, 当Accept socket的时候,就会创建另一个线程去Connect to the Client.JsonPpcServer还有两个重要的函数,分别是StartPublic 和Start Local. StartPublic()建立Remote 通信,远程通信主要是负责监听PC端的脚本;StartLocal()建立Local通信,本地通信的作用主要是用来:监听Android上解释执行的脚本.也就是说:无论本地还是远端的脚本都是通过JsonRpcServer来统一调用Android JAVA API的
AndroidProxyService含有AndroidProxy类.这个类的主要作用就是负责调用AndroidFacade类中,封装好了的,提供给Script调用的函数.
也就是说干活的代码这这里(当然,底层才是真正的工作的代码,但是我们在这里这么理解他).
AndroidProxy类中,还包含有notification和notification manager之类的东西.notification就是我们在运行ASE时start service时,模拟器或者手机顶端的提示信息.这里包含了一个很重要的信息:IP和Port号.其中Port号就是Run Scripts Externally 中的Remote的端口号.代码如下:adb forward tcp:
local port超过1024就可以了, remote port就是notification中的port号.
当然,还有一步也是一定要做的:export AP_PORT local_port
我们来看一下, ASE中Android.py的源代码,
PORT = os.environ.get('AP_PORT')
class Android(object):
def __init__(self, addr=None):
if addr is None:
addr = 'localhost', PORT
self.conn = socket.create_connection(addr)
self.client = self.conn.makefile()
self.id = 0
可以看到第一句话就是从:系统中拿到AP_PORT环境变量,为以后建立socket打下基础.
好像,讲的离题了点.继续,JsonRpcServer.
在这个类中,有很重要的一个方法:
private JSONObject dispatch(int id, String methodName, JSONArray params) throws JSONException {
JSONObject result;
try {
Method m = mReceiver.getClass().getMethod(methodName, new Class[] { JSONArray.class });
if (m.isAnnotationPresent(Rpc.class)) {
result = (JSONObject) m.invoke(mReceiver, new Object[] { params });
} else {
throw new Exception();
}
...
这里就是会Call AndroidFacade中函数的地方了.
所以,理论上,我们只要扩展AndroidFacade中的函数,然后,在AndroidProxy中调用AndroidFacade就Okay了.
下载adnroidSDK
下载ASE的源代码,下载地址是:http://code.google.com/p/android-scripting/source/checkout
3. 在Eclipse里面导入源文件中所有的工程
4. 在工程Common的src/com.googlecode.android_scripting.facade包在添加要扩展的API,java文件的内容如下:
public class YOURAPIFacade extends RpcReceiver {
private final TriggerRepository mTriggerRepository;
public YOURAPIFacade(FacadeManager manager) {
super(manager);
mTriggerRepository = manager.getTriggerRepository();
}
@Rpc(description = "your descrpt")
public void yourenvent(
@RpcParameter(name = "script", description = "The path to a script to execute when the ringer mode changes.") yourParameterType script …) {
…
}
@Override
public void shutdown() {
}
}
5. 修改ScriptingLayer工程下src/ com.googlecode.android_scripting.facade包下的FacadeConfiguration.java文件,把刚才添加的java文件名加到这个java文件中:sFacadeClassList.add(YOURFacade.class);
6. 编译ScriptingLayerForAndroid工程,安装APK到目标机器上。
作为一个程序员有多种方法可以建立自已的工作并生成APK。
一) 使用eclipseIDE来建立工程:
1. 下载脚本的模板工程,并把工程导入到eclipse中。
2. 重命名模板工程名和包名:com.dummy.fooforandroid -> your_package_name ,如果你修改了包名,那么要在AndroidManifest.xml里面同步package="your_package_name"
3. 在res/raw包里编写你的脚本文件,并修改src/ com.dummy.fooforandroid包中的script.java这个类,修改为public final static int ID = R.raw.YOURscript;
4.在AndroidManifest.xml里面申明你在脚本中用到的所有权限。
5.编译,打包。
(二) 使用ant来生成APK,祥见http://code.google.com/p/android-scripting/wiki/SharingScripts
用户要运行使用脚本编写的程序,需要安装:1、脚本解释器(这里使用LUA解释器,下载地址是http://code.google.com/p/android-scripting/downloads/list);2、中间键APK;3、程序员编写的应用程序的APK。装完这三个APK后,直接点击应用程序的图标就可以运行软件。