Android Scripting Environment 你也可以玩

在Android社群里,这几天讨论得最火热的主题不外乎是iPhone 3GS、Palm Pre和Magic、Dream的对比,美版Magic到底何时发布以及刚刚和大家见面的Android Scripting Environment了。 William手上没有iPhone 3GS和Palm Pre,美版的Magic虽然看起来不错(比较可靠的消息是他会有5百万像素摄像头,内存288MB,CPU是更省电、视频录制更强大的 MSM7200A,似乎比欧洲已经开卖的Vodafone定制版Magic好出不少),不过手机硬件本身已经超出我的研究范围了,还是花点时间来看看动手 玩一玩Android Scripting Environment吧。
ASE为Android系统带来了脚本语言的支持,通过它我们可以编辑和执行脚本,甚至和脚本解释器做出交互。脚本可以访问多数的Android API,有了这个大大简化了的接口,我们可以很方便的实现以下功能:
操作Intents
启动Activities
拨打电话
发送短信
扫描条形码
获取地理位置和传感器数据
使用text-to-speech(TTS)
参考官方文档了解更多
脚本可以在终端中来交互地执行,或者作为后台Service启动,也可以通过Locale来 启动。当前支持的脚本语言包括Python、Lua和BeanShell,Ruby和JavaScript的支持已经在计划之中。你可能会问,为什么使用 脚本而不是开发真正的Android应用呢?诚然,Android的开发环境非常易于使用,但是你必须在电脑前完成所有工作。而ASE则使您在任何您需要 的情况下,快速的在设备上使用高级脚本语言尝试您的想法。
下面我们就在模拟器中动手玩一玩ASE吧
1、因为ASE目前还没有被上传到Market,所以首先我们到Google Code上下载它的安装包。
2、在命令行执行adb install ~/download/AndroidScriptingEnvironment-0.7-alpha.apk (假设下载来的ASE安装文件放在~/download目录)命令安装ASE。
3、点击图标启动它,第一次启动的时候需要安装脚本解释器,大家会看到“Installing Python”, “Installing Lua”等提示,初始化完成以后,运行界面如下图所示:

4、按照Google介绍的ASE用法,这时我们可以单击脚本文件来执行它,或者长按列表中的脚本文件对它进行修改、删除、添加到桌面快捷方式等操作或者作为后台服务启动;另外也可以通过“Menu”菜单来新建脚本或者打开终端。
出现问题
在我尝试的过程中却发现单击列表中的脚本文件无法正常执行,一直显示黑屏。
于是我打开通过adb shell打开一个终端,并用logcat来观察ASE执行时的系统log,发现ASE启动时有报如下的错误:
……
V/InterpreterInstaller( 687): Installing bsh
V/InterpreterInstaller( 687): Extracting entry “res/raw/bsh.zip”.
E/InterpreterInstaller( 687): Reading entry res/raw/bsh.zip failed.
E/InterpreterInstaller( 687): Failed to extract entry.
E/InterpreterInstaller( 687): java.io.FileNotFoundException: /data/data/com.google.ase/bsh.zip
E/InterpreterInstaller( 687): at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.j
ava:231)
……
提示读取res/raw/bsh.zip文件失败,我看了apk包的res/raw目录,还真没有bsh.zip文件(后来就觉得这不是根本的问题)
接下来,当我尝试单击saytime.py运行它的时候,系统大约有1分钟左右没有任何反应,当我尝试Back键等操作的时候,就会出 现”Sorry! Activity ASE(in applicaton ASE) is not responding”的错误,同时从logcat中可以看到ANR(application not responding)的记录被写入了/data/anr/traces.txt。

Force close以后,ASE被重新加载。
寻求解决办法
刚遇到这个问题的时候,我还是真有点怀疑是Google没有好好的测试ASE,漏掉了bsh.zip文件,但是想想ASE现在已经是0.7Alpha,Google Code上都已经有了3个版本的下载,这样的问题没有理由存在,于是我开始在ASE项目的Issues里面来寻求解决办法。
果然,Issue39 和 Issue45都提到了和我一样的问题,矛头直指getSystemService(Context.SENSOR_SERVICE); Hangs in Android 1.5这 个Android Emulator中的bug。当用户调用getSystemService(Context.SENSOR_SERVICE)时,系统会黑屏,而如果用户 尝试对手机进行操作(比如按下“Menu”键),系统则将返回Application Not Responding错误。(这个问题事实上是1.5 SDK的已知问题,见Releasenotes中的Known Issues)
所以问题是看起来就是ASE中使用了会导致模拟器挂起的Sensor API,那么我们只要在ASE中禁用掉它理论上就可以使ASE能够在模拟器上正常运行,当然和Sensor相关的重力感应、加速感应和罗盘功能肯定是不能 工作的了(除了Ctrl+F12可以模拟重力感应相关的屏幕翻转,加速感应和罗盘还真是很难在emulator中来模拟)。
动手解决
这里,请确保正确安装和配置Android 1.5 SDK和ADT了,并且在PC上安装有Python的解释器(Windows或者Linux平台均可)。
从SVN checkout最新的ASE代码,导入到Eclipse中,随后把lib目录下的TTS库加入项目的build path,会发现有android.os.Exec相关的几个类无法找到,这时ASE Wiki的CompilingASE中提到的fix_android_sdk.py脚本就派上用场了。该脚本可以帮助我们从Android源代码中编译出android.os.Exec的class文件,并添加到SDK的jar文件中,以解决ASE的编译问题。
这里需要注意的是,Wiki中提到需Android的源代码,事实上我们只需要有其中的frameworks/base就可以了,如果手上没有完整的代码的话,从Android Git版本库中下载一个frameworks/base最新的snapshot就行,大约35MB左右。下载完了以后把解出来的整个base目录放在android_source/frameworks/目录,然后根据wiki中的方法执行fix_android_sdk.py脚本成功以后,ASE项目的编译就OK了。

最后,注释掉AndroidFacade.java中和getSystemService(Context.SENSOR_SERVICE)、mSensorManager相关的代码,编译完成以后ASE就可以在模拟器中正常运行了。

你可能感兴趣的:(android,python,脚本,lua,Palm)