AndroidV2.2 PC编译环境搭建
该章节主要描述如何在PC环境下搭建Android的开发环境,Android提供两种开发环境: 1) 基于eclipse的IDE插件开发环境; 2) 基于无IDE的命令行开发环境。 该章节主要介绍无IDE的命令行开发环境。
2 编译Android所需要的依赖包
编译Android的PC环境需要依赖以下包(为了方便大家基于Linux环境下载依赖包,建议使用ubuntu 9.10), 在命令行终端敲入以下命令: $sudo apt-get install git-core gnupg sun-java5-jdk flex / bison gperf libsdl-dev libesd0-dev / libwxgtk2.6-dev build-essential zip / curl libncurses5-dev zlib1g-dev 这儿有以下几个关键点: 1) JDK开发环境,JDK的开发环境必须是sun-java5-jdk的deb包,不支持sun-java6-jdk编译环境, 由于在9.10国内源只有sun-java6-jdk的deb包,所以需要到官方源去下载; 2) 由于ubuntu安装的时候,安装了OpenOffice,该软件依赖的是open-jdk-6的deb包,需要进行卸载; 3) Git版本必须在1.5.4以上。
3 下载Android的源代码
1, 下载源代码之前,请预留10G空间进行编译,并且下载repo命令协助下载: 1) 在当前目录下建立一个bin文件夹,用来存放本地专属命令: $ cd $ mkdir bin 2) 将本地bin文件夹纳入系统命令路径: $ export PATH=$PATH:~/bin 3) 通过curl下载android服务器上repo文件: $ curl http://android.git.kernel.org/repo >~/bin/repo $ chmod a+x ~/bin/repo 2, 开始下载代码: 1) 在当前目录下建立一个目录用来存放源代码: $ mkdir Android 2) 进行代码下载,如果要进行主分支下载则敲以下命令: $ repo init -u git://android.git.kernel.org/platform/manifest.git 当然我们目前建议下载Android V2.2版本,使用froyo分支: $ repo init -u git://android.git.kernel.org/platform/manifest.git -b froyo 3) 进行代码同步: $ repo sync 3, 代码需要下载两三个钟头,大家可以休息休息休息一会。
4 代码编译
代码下载完毕之后,进入Android目录进行编译: $ make 我们不仅仅编译源代码,还需要形成SDK,所以完成上述命令之后要设置环境变量, 然后编译SDK: $ chmod a+x build/envsetup.sh $ . ./build/envsetup.sh $ make sdk
5 环境设置和初步运行
编译完成之后,初步设置环境,就能实现模拟器预览效果: $ export ANDROID_PRODUCT_OUT=~Android/out/target/product/generic $ export PATH=$PATH:~/Android/out/host/linux-x86/bin $ ./emulator 此时,大家都能看到运行的Android 2.2的PC效果,但是此刻才是万里长征的第一步, 路漫漫其修远兮,吾将上下而求索。
6 搭建无IDE开发环境
这时候大家奇怪了,为什么还没开始搭建无IDE开发环境呢?上面不是已经将模拟器跑起来了吗? 这儿有两个误区: 1) 模拟器跑起来了,证明模拟器生成没太大问题; 2) 无IDE开发环境的搭建是为了一直Android的Java应用,和模拟器没有太大关系, 最多的一丝关系是内置应用的JAVA包生成没太大问题。
以下开始介绍概念: 1) AVD,全称android virtual device,应用程序模拟安装是安装在AVD设备上,所以当 我们进行android的Java应用程序安装的时候,需要安装在AVD设备上;
理解上述概念和理念之后,我们开始设备的创建: 1) android的PC模拟安装包在~/Android/out/host/linux-x86目录下,我们在make sdk之后 模拟安装包形成不完全,需要手动拷贝一些目录到linux-x86目录下,不知道Google为什么不直接 把生成的SDK放到该目录下,可能Google认为大家都很聪明,能理解Google的意图: $ ~/Android/out/host/linux-x86 $ mkdir framework/x86 $ cp sdk/android-sdk_eng.dengkexi_linux-x86/platforms ./ -rf $ cp sdk/android-sdk_eng.dengkexi_linux-x86/tools ./ -rf $ cp sdk/android-sdk_eng.dengkexi_linux-x86/add-ons ./ -rf 以上android-sdk_eng.dengkexi_linux-x86目录会根据repo的时候输入开发者名字不同而不同。 以上拷贝完成之后,基本的无IDE开发环境基本搭建。 2) 创建AVD设备,在Android V1.5版本以前有专门的命令创建AVD设备,现在全部集成在android命令中: 我们首先查看当前目标机器信息: $ android list接着我们开始创建AVD设备: $ android create avd -n dengkexi -t 1 设备名为dengkexi, target为list列表中的1,创建完之后,我们输入以下"android list"命令 如下图所示:
3) 设备创建之后的验证,如果AVD设备创建完成之后,则敲入以下命令: $emulator @dengkexi 将AVD的模拟器运行起来之后的效果如下图:
![]()
7 创建应用
在SDK完成之后,AVD创建之后,我们该创建一个应用: $ android create project -t 1 -k com.dengkexi.chipsbank -a DemoApi -p ./tmp -t 表示设备目标序号; -k 表示packet包的名字,该命名方式按照Java包的命名方式; -a 表示Activity的类名; -p 表示存放路径。 在创建完项目之后,进行项目的编译: $ ant ant工具简单介绍一下:该工具是用来形成Java的编译工具,类似我们使用的configure, automake等。 紧接着开始编译应用: $ ant debug 该命令生成debug版本的应用,如果应用基本发布的话,使用ant release命令。 这个时候晴天霹雳,雷雨震天,编译应用报错: -resource-src: [echo] Generating R.java / Manifest.java from the resources... [null] W/ResourceType( 8602): Unable to get buffer of resource asset file [null] /home/dengkexi/Android/test/tmp/res/layout/main.xml:2: error: No resource identifier found for attribute 'orientation' in package 'android' 无法生成R.java资源文件,从报错分析上是资源问题。 以下就是艰难痛苦解决资源问题: 1) 首先我们分析一下platforms目录下android-2.2下的android.jar资源文件resources.arsc为1.4M, 而preutil/sdk/8/android.jar的资源文件为1.5M,所以及有可能我们没有摸透默认生成的资源文件有所裁剪; 2) 知道了问题点,剩下的问题是如何解决这个问题,首先通过点击preutil/sdk/8/android.jar,将resources.arsc 解压到platfroms/android-2.2/目录下,然后输入以下命令: $ jar -uf android.jar resources.arsc 这样就完成了资源文件的替换。 这个时候,再次回到应用目录下,输入"ant debug"命令,这个时候则会编译成功。
8 安装和删除应用
在编译成功应用之后,剩下就是进行应用程序的安装和卸载了,这个时候就需要使用adb命令: $ cd bin $ adb install DemoApi-debug.apk 完成之后,应用就安装到设备上了,如截图:删除应用命令为: $ adb uninstall com.dengkexi.chipsbank
9 打印输出获取
Android的应用开发需要获取相关打印信息,Android的打印信息与Java标准的输入输出类不一样, Java使用标准System.out.printf(),但是Android使用android.util.Log类, 该类提供了若干静态方法 Log.v(String tag, String msg); Log.d(String tag, String msg); Log.i(String tag, String msg); Log.w(String tag, String msg); Log.e(String tag, String msg); 分别对应 Verbose, Debug, Info, Warning,Error. tag是一个标识,可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件。 打印信息加上了,如何开启打印呢?这个时候,adb再次出现(神器阿),使用以下命令查看打印: $adb logcat DemoApi
10 Android文件系统操作
进入Android文件系统的命令: $adb shell $adb pull files ./ (将Android内部文件拷贝至当前目录) 拷贝文件入Android文件系统的命令: $adb push local-files /bin/ (将本地文件拷贝到Android文件系统的bin目录下) 退出Android文件系统: $exit
11 Android模块化编译
在Android目录下执行以下命令: $. ./build/envsetup.sh 敲击help命令之后,会看见几个关键的帮助选项: $help - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. 比如编译packages/apps/Contacts/目录,即可敲击: $mmm packages/apps/Contacts/ 这时候眼泪哐啷,悸动的心情立刻汹涌澎湃,编译出二进制啦~~。 希望总是伴随着绝望,虽然二进制出来了,但是img文件没有更新阿,传说上帝总是仁慈的,另外一个命令横空出世了,历史称之为snod! $make snod make snod: ignoring dependencies Target system fs image: out/target/product/generic/system.img 诞生啦,system.img生成啦,这一刻所有镜像生成啦,大功告成!
如果我们修改的是ramdisk.img里边的内容,那暂时只能泪流满面了,只能老实敲击make生成。