一、环境搭建、配置,Virtualbox安装,ctags安装,常用命令的使用,log函数使用: Android2.3源码已经获取 1、选择合适java虚拟机 列出当前java-vm所有版本,任何路径下输入命令,该命令无法联想: # eselect java-vm list 如果显示如下: Available Java Virtual Machines: [1] icedtea6-bin system-vm [2] sun-jdk-1.6 -----说明当前系统使用的java-vm版本是1.6 如果当前版本不是你所要的,可以通过以下命令设定系统当前要使用的java-vm版本,有1.5指到1.5,没有则指到1.6 # eselect java-vm set system 2 注释:数字2代表list命令显示的序号[2]//修改过 2、修改main.mk中的java版本 原因:jdk版本需要与android java版本一致,当前从公司服务器上下载的jdk版本为1.6,用命令emerge -s jdk可以查看到virtual/jdk下当前安装的版本,而android java版本默认为1.5,需要修改android java版本为1.6,修改方法: 在文件build/core/main.mk 1》# Check for the correct version of java java_version := $(shell java -version 2>&1 | head -n 1 | grep '[ "]1/.5[/. "$$]') 修改: 将数字5改成6 2》# Check for the correct version of javac javac_version := $(shell javac -version 2>&1 | head -n 1 | grep '[ "]1/.5[/. "$$]') 修改成:将数字5改成6 3、设置Android的环境变量 1》export ANDROID_JAVA_HOME=$JAVA_HOME(该修改只对本次生效,电脑重启后需要重新设置,否则编译报错 2》如果希望环境变量在电脑重启后仍然生效,需要将该环境变量设置直接添加到/etc/profile中,命令vi /etc/profile进入该文件,直接将export ANDROID_JAVA_HOME=$JAVA_HOME命令复制 原因:系统启动阶段startx会执行该文件 注:前提条件是先配置好JAVA环境变量(在etc/profile中增加如下内容) export JAVA_HOME=/opt/sun-jdk-1.6.0.20 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin 4、完全编译整个工程 进入Android2.3源码工程根目录mydroid下输入 make localhost mydroid # make 出现以下信息: PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=2.2.1 TARGET_PRODUCT=generic TARGET_BUILD_VARIANT=eng TARGET_SIMULATOR= TARGET_BUILD_TYPE=release TARGET_BUILD_APPS= TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID=MASTER 编译成功会出现Install: out/target/product/generic/system/app/Mms.apk,这是相对路径 编译后生成的文件放在目录/work/mydroid/out/target/product下,编译成功后的目录默认为generic,运行在模拟器上,在generic目录下中生成的重要文件夹system、root、data,其对应的还有三个镜像文件system.img、ramdisk.img、userdata.img(这三个文件时Android模拟器运行关键文件,放在android-sdk-linux/plateforms/android-8/下面)。 清空编译命令 #make clean 清空后product下的generic整个目录将被清除 5、模块编译 如果仅仅修改了某个模块内部,不需要全部编译整个工程。每个模块目录下存放一个 1》Android.mk文件 一个Android.mk file用来向系统描述源代码的。具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块,你也可以在几个模块中使用同一个源代码文件,编译系统为你处理许多细节问题。例如,不需要在你的Android.mk中列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着在升级NDK后,你应该得到新的toolchain/platform支持,而且不需要改变你的Android.mk文件。 LOCAL_PATH:= $(call my-dir) 定义好LOCAL_PATH变量。它用于在开发树中查找源文件。宏函数由编译系统提供,用于返回当前路径(即包含Android,mk file文件的目录)。 include $(CLEAR_VARS) CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等等),除了LOCAL_PATH。这是必须的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。 LOCAL_MODULE_TAGS Android 通过LOCAL_MODULE_TAGS来决定哪些本地模块会被编译进系统,如果用户不指定LOCAL_MODULE_TAGS,默认值是user。此外用户可以通过buildspec.mk来指定需要编译进系统的模块。用户也可以通过-mm来编译指定模块,或者通过make clean-module_name来删除指定模块。为了在Android.mk文件标识每个组件,必须定义LOCAL_MODULE变量。这个名字必须要唯一的并且不能包含空格。 LOCAL_SRC_FILES := $(call all-java-files-under, src) 模块包含的源文件LOCAL_SRC_FILES,如果是java源码的话,app的所有源码,可以调用all-java-files-under得到。指明源代码的文件夹。 LOCAL_PACKAGE_NAME := 指明包名 LOCAL_SDK_VERSION := current指明android-sdk版本 LOCAL_MODULE 模块名 LOCAL_C_INCLUDES 模块包含的头文件 include最后一行表示生成的模块类型:静态库(LOCAL_STATIC_LIBRARIES)、动态库(BUILD_SHARED_LIBRARY) 2》模块编译有两种方式: 2.1》首先执行该命令的前提条件是必须在工程目录(/work/mydroid)下输入 . ./build/envsetup.sh (开始的两点之间有一个空格,要不不能执行),然后进入该模块路径下输入 mm命令,这种方式只会生成新的模块链接库,system.img不会重新生成,因此还需要制作文件系统。 2.2》在工程根目录下执行make LOCAL_MODULE,make指定的模块,这种方式会重新生成新的system.img。 6、使用adb adb的全称为(Android Debug Bridge)是一种debug工具。通过tools下的命令可以直接访问虚拟器。首先需要下载android-sdk-linux包,可与mydroid工程文件放在同一级目录下/work/android-sdk-linux;然后进入到tools目录输入命令:android-sdk-linux/tools。 以下命令均不能联想,可用-help查看命令具体的帮助信息 1》帮助 ./android -help 2》列出target命令 ./android list target 3》查看可用的avd命令 ./android list avd 4》创建新的avd ./android create avd -t 11(id号) -n AndroidAVD2.2(自命名) -t参数表示target版本id, -n参数表示新创建的avd名。该命令会提示输入相关参数,可输入默认值或需要的参数 5》创建新的sdcard ./mksdcard –l mysdcard(自命名) 1024M(大小) /work/mysdcard.img(存放位置) 7、启动模拟器 1》 ./emulator -avd AndroidAVD2.2 &(这里 & 表示后台运行) 2》 加载应用程序apk ./adb install XXX.apk 3》 带SDCard启动模拟器 ./emulator -avd AndroidAVD2.2 –sdcard /work/mysdcard.img &(这里 & 表示后台运行) 8、模拟器与本地文件的互相传输 仍然是在tools目录下android-sdk-linux/tools 1》进入模拟器shell ./adb shell 2》退出模拟器shell exit 3》在tools下新建文件 touch xxx.txt 其他方式 vi xxx.txt,进入文件编辑状态 :wq保存后退出 4》本地文件即tools下的文件如xxx.txt复制到模拟器,一般情况下该文件只能放在模拟器的data目录下 ./adb push xxx.txt /data 如果需要将本地文件写到模拟器中的其他目录,如system目录,该目录用来存放动态链接库,通常情况下该目录不允许写,需要获取文件系统权限 ./adb remount 5》将模拟器data下的文件复制到本地的当前目录 ./adb pull /data/xxx.txt ./ 最后的./代表当前的tools目录 6》常用命令(tools目录下输入./adb -help可以查看所有adb相关命令) ./adb install 安装应用程序 ./adb uninstall <软件名> 卸载应用程序 ./adb uninstall -k <软件名> 卸载应用但是保存配置和缓存文件 ./adb pull < remote> <local> 把文件从模拟机上复制到pc机上 ./adb push < local> <模拟器> 把文件从pc机上复制到模拟机上 ./adb remount 获取模拟器文件系统权限 ./adb shell 进入模拟器shell exit 退出模拟器shell ./adb logcat 打开log开关 ./adb devices 列出已经启动的模拟器 9、安装virtualbox 目的:在virtualbox下安装windowsxp,因为有些软件只有windows版本,在Windows下编辑文档不易乱码。 1》首先需要VirtualBox-3.1.8-61349-Linux_x86.run(下载或直接从别人机器上拷贝)文件,并保存到/usr/portage/distfiles目录下,修改/etc/make.conf文件中的ACCEPT_KEYWORDS=“”,然后执行下面命令:./VirtualBox-3.1.8-61349-Linux_x86.run安装virtualbox,安装成功,会在Application->System tools中出现Sun xVM VirtualBox。 2》运行VirtualBox命令(注意大小写),第一次启动需要创建一个xp的镜像,在创建过程中,选择Use existing hard disk选项,使用已有的xp镜像文件WinXp.vdi(从其他机器上拷贝)来创建新镜像。 注:在WinXp中安装需要的软件,如果拷贝的镜像已经安装了相关的软件,就不需要再安装。 3》在winxp下访问gentoo文件 打开Sun VirtualBox->settings->shared folders 添加你要访问路径,如/work 启动winxp系统。进入系统后,建立文件夹映射关系:我的电脑->工具->映射网络驱动器->浏览,可以看到VirtualBox Shared Folders中已经共享的文件,选择路径,就建立了相关映射 二、常用命令 1、Linux系统命令,通过tab键联想 系统快捷键 Ctrl+Shift+T 新建terminal tab Ctrl+Shift+W 关闭Tab Ctrl+Shift+N 新建terminal Ctrl+Shift+Q 关闭terminal Ctrl+Page up/down tab间切换 Alt+Tab 窗口间切换 eix 查找可用软件,[I]表示文件已经安装 emerge 安装软件 scp 网络拷贝命令 ifconfig 查看ip地址 cd 进入目录 cd .. 返回上一级目录 cd ~ 返回root目录 ls 查看当前目录下的文件信息,可带相关参数 ps 查看详细信息 pwd 查看当前的绝对路径 rm 删除文件及目录 touch 改变文件的时间记录,如果文件不存在,则创建该文件 which 查找文件(不熟) grep 查找符合条件的字符串,可在文件或者目录下查找 grep XXX * -r 递归搜索当前目录,查找字符串XXX(正则表达式) grep命令非常有用,grep -rn(递归查找并显示行号) XXX(要查找的字符串) *(或./表示当前目录查找,可以指定其他目录,如root/*) find 目录名 -name 文件名 查找文件 ./ 表示当前路径 shift +Insert键 粘贴,linux常用命令 2 、VI编辑器常用命令 指令模式与输入模式通过esc键切换,在输入模式中画面左下方会出现“INSERT”的字样。 1》指令模式 /XXX 向下查找字符串 n 显示下一个 ?XXX 向上查找字符串 :set nu 显示行号 :set nonu 不显示行号 :number(具体的行数) 跳转到具体的行 :set mouse = a 显示鼠标 :set mouse = 不显示鼠标 x, X 在一行字当中,x 为向后删除一个字元 (相当于 [del] 按键), X 为向前删除一个字元(相当于 [backspace] 按键) dd 删除光标所在的那一整行 ndd n为数字。删除光标所在的向下 n行 yy 复制光标所在的那一行 nyy n为数字。复制光标所在的向下 n行 p, P 为将已复制的内容粘贴在光标下一行上,P 则为粘贴在光标的上一行 u 还原前一个动作 [Ctrl]+r 重做上一个动作 [Ctrl]+O [Shift]+# . 小数点,意思是重复前一个动作 2》指令模式进入输入模式 * i, I → 插入:在目前的光标所在处插入输入的文字,已存在的文字会向后退; 其中, i 为『从目前光标所在处插入』, I 为『在目前所在行的第一个非空白字元处开始插入』 * a, A → a 为『从目前光标所在的下一个字元处开始插入』, A 为『从光标所在行的最后一个字元处开始插入』 * o, O → o 为『在目前光标所在的下一行处插入新的一行』, O 为『在目前光标所在处的上一行插入新的一行』 * r, R → r 为『取代光标所在的那一个字元』, R 为『一直取代光标所在的文字,直到按下 ESC 为止』 * Esc → 退出指令模式,回到输入模式中 3》末行指令模式 :q 退出vi :q! 强制退出vi :wq 保存后退出 :w 保存文件 :x 退出 4》 远程登录命令 方式一:直接执行命令 rdesktop 10.1.1.5 -g 100% -u USERNAME -p PASSWD -d ARCHERMIND 方式二:创建一个脚本文件如mstsc.sh,放在home下,将该命令保存在mstsc.sh文件中,执行. /home/mstsc.sh即可 拷贝文件或者文件夹 scp filename target_path 例:scp X.txt 192.168.13.54:/work scp -r 目录名 target_path smb命令 三、Android Log提供添加以上调试信息对应的方法 1》在Android中可以使用Log类,Log类在android.util 包中。Log 类提供了若干静态方法 : Log.v(String tag, String msg); //VERBOSE Log.d(String tag, String msg); //DEBUG Log.i(String tag, String msg); //INFO Log.w(String tag, String msg); //WARNING Log.e(String tag, String msg); //ERROR 分别对应 Verbose,Debug,Info,Warning,Error。Tag为调试信息标签名称,msg为添加的调试信息。tag是一个标识, 可以是任意字符串,通常可以使用类名+方法名, 主要是用来在查看日志时提供一个筛选条件。 2》logcat使用方法如下所示: logcat [options] [filterspecs] logcat的选项包括: -s 设置过滤器,例如指定 '*:s' -f <filename> 输出到文件,默认情况是标准输出。 -r [<kbytes>] Rotate log every kbytes. (16 if unspecified). Requires -f -n <count> Sets max number of rotated logs to <count>, default 4 -v <format> 设置log的打印格式, <format> 是下面的一种: brief process tag thread raw time threadtime long -c 清除所有log并退出 -d 得到所有log并退出 (不阻塞) -g 得到环形缓冲区的大小并退出 -b <buffer> 请求不同的环形缓冲区 ('main' (默认), 'radio', 'events') -B 输出log到二进制中。 过滤器的格式是一个这样的串: <tag>[:priority] 其中 <tag> 表示log的component, tag (或者使用 * 表示所有) , priority 如下所示: V Verbose D Debug I Info W Warn E Error F Fatal S Silent 以上log的级别依次升高,DEBUG信息应当只存在于开发中,INFO, WARN,ERROR这三种log将出现在发布版本中。、 四、搭建Android2.3源码调试环境 1》建立模拟器、SDCard . ./android create avd -t 11 -n AndroidAVD2.2 ./mksdcard –l mysdcard 1024M /work/mysdcard.img 2》带SDCard启动模拟器 ./emulator -avd AndroidAVD2.2 –sdcard /work/mysdcard.img & 3》进入DDMS ./ddms & 注:查看File--Preferences/Debugger的Starting values for local post(如8600) 4》打开Eclipse,导入Android2.3源码 新建Java Project项目,选择(Create project from exiting source)将Android2.3存放的源码导入。右击Android2.3项目,选择“Debug As—Debug Configurations—Remote Java Application”新建,注意Port选择同第3》步的一致(如8600) 5》Push媒体文件到SDCard ./adb push /work/test3gp.3gp(需要push的文件名)/mnt/sdcard 6》重启模拟器(同第2》步) 7》启动Gallery应用程序,可以实现媒体播放