【Androidin 开发者原创系列】kryptonum

Android SDK提供了一个基于Qemu的模拟器来模拟Android系统的智能手机,得益于Qemu的跨平台特性,不论是Linux、Mac OS还是Windows的用户都可以通过模拟器大大提高开发效率。不过归根结底,Qemu还是在类Unix平台上发展起来的项目,所以在Windows平台上的编译还是值得一看。Google在git上描述如何编译Android Eclipse插件ADT的时候顺带提到了如何构建Windows版的Android SDK,国内也有朋友写了构建Windows版的Android SDK(此为转帖,原作者blog已无法访问)的文章,但是对于如何单独构建Windows版的Android模拟器目前并没有任何官方的文档提及,William只是在网络上找到一些零碎的讨论,今天就结合自己的实践整理出来和大家共享。


在Windows下编译Android模拟器的两种方法

Android给出的构建Windows版SDK的make_windows_sdk.sh脚本中,包含有make -j 4 emulator,即编译模拟器的命令,所以看起来模拟器能在Cygwin环境下构建出来的。另外,由于Android模拟器是基于Qemu,Android只是在其基础上添加了新的虚拟设备,定义了自己的skin机制等,所以只要是标准Qemu能够正常编译的环境,Android模拟器也就没有问题。The QEMU forum有一篇很详尽的关于在Windows环境编译Qemu的文章,Step-by-step QEMU compilation under Windows ,是在MinGW/MSYS下完成的,因而在MinGW/MSYS环境下构建看来也可行。

既然使用make_windows_sdk.sh依赖的Cygwin看起来更像是官方制作SDK发布的环境,那么它应当是几乎100% working,下面还是先来尝试一下非官方的做法吧。

MinGW/MSYS环境的准备

MinGW和MSYS的环境不算复杂,官方网站也有详细的帮助文档,下面就说说我的安装过程。

需要下载的安装包包括:
1、MinGW-5.1.4.exe, 这是MinGW的自动安装工具(Automated MinGW Installer)
2、MSYS-1.0.11.exe
3、msysDTK-1.0.1,MSYS Developer Tool Kit,包括autoconf、automake、libtool、cvs等工具
4、pthreads-w32-2-8-0-release.exe,emulator所需要的pthread库。

zlib、libpng、SDL以及它依赖的directx-devel库就不需要下载了,zlib和libpng已经包含在Android Emulator源码包中,SDL我们也可以用Android Prebuilt中提供的binary,稍后会给出链接。

安装MinGW时,除非有特别的需要,我们安装常用的gcc core、g++编译器就行。如果网络条件实在不好,可以打开mingw.ini找出文件名,然后通过下载工具到MinGW网站下载。另外值得一提的是,MinGW为了更好的管理软件包的发布,使用了current、previous和candidate来区分不同版本软件包的组合,这里我选择的是current,gcc版本为3.4.5。安装路径随意,这里假设是c:mingw。

安装MSYS时会询问是否有安装MinGW,选择Y的话会要求输入MinGW的安装路径,输入之后很快就可以完成MSYS安装。这里我们假设MSYS的安装路径是c:msys。接下来安装好msysDTK-1.0.1,我们就可以通过桌面上的快捷方式来进入MSYS了。这里我们要通过“ls /mingw”命令确认一下MinGW是否被正确挂载到MSYS的/mingw目录,如果可以看到bin、doc、include等目录就说明挂载成功,否则请检查MSYS安装目录中etc下的fstab文件,格式请参考fstab.sample。挂载成功以后,试试“gcc -v”,能够正常返回gcc version 3.4.5等字样,我们就可以进入到下一步了。

取得Android Emulator源代码和Prebuilt中的SDL库

请参考我之前的文章Git和Repo扫盲——如何取得Android源代码来取得Android Emulator源代码和Prebuilt中的SDL库,或者你也可以简单的从GitWeb下载Emulator和Prebuilt的snapshot版本。

下载完成以后,把Emulator解压缩到c:msyshome< 当前登陆的用户名 >目录下,Prebuilt我们只需要其中Windows目录下的sdl目录就可以了,同样放到c:msyshome< 当前登陆的用户名 >目录。

这里有必要提一下Android Emulator的build system,在Google发布的源码包android-emulator-1.0_r2.tar.bz2中,我们可以很方便的使用build-emulator.sh脚本来编译(中间可能会遇到些问题),在这个脚本中我们可以看到,构建Emulator的脚本是 android-rebuild.sh,而它则会调用同一目录下的android-configure.sh来完成configure。回到 Cupcake中的External/qemu目录,我们可以看到android-rebuild.sh和android-configure.sh这两个脚本同样存在(一开始我确实是以为只有以源码包形式发布的Emulator中才包含了这几个脚本),所以我们可以在编译整个Android Cupcake代码树时编译Emulator,同样也利用这个平行的build system来单独的构建Emulator。从这个角度来说,单独的构建Emulator,无论是Cygwin还是MinGW/MSYS,方法就不会有什么差别了。

编译Android Emulator的过程

做好前面的几步之后,打开MSYS,进入到Emulator(qemu)目录,执行./android-rebuild.sh –sdl-config=/home/< 当前登陆的用户名 >/sdl/bin/sdl-config 命令即可,它会自动调用android-configure.sh脚本进行configure,随后开始编译,–sdl-config则指定了sdl库的路径。

这里我们可能遇到的问题是缺少libpthread,如果遇到的话解开pthreads-w32-2-8-0-release.exe,把Pre- built.2中的libpthreadGC2.a改名为libpthread.a复制到c:mingwlib目录,pthread.h复制到c: mingwinclude目录即可解决。

除此之外,编译Cupcake中的Android Emulator相当的顺利,之前编译android-emulator-1.0_r2.tar.bz2时遇到过的“unsupported cpu”, “bad ELF header”等错误都没有遇到。

测试生成的Android Emulator

测试生成的emulator.exe能否正常工作,最简单的办法就是把它复制到当前安装好的Android SDK的tools目录下,连-kernel,-ramdisk,-system这些参数都省的加了。新建一个avd,比如“test_avd”,然后在控制台运行“emualtor.exe @test_avd” 即可,如果有什么不正常,加上-debug-all和-show-kernel参数可以有助debug。

好了,有图有真相!标题栏中的“Build with MSYS/MINGW”是我自己加的。