红联Linux门户
Linux帮助

Android Linux开发准备

发布时间:2015-02-05 21:39:58来源:linux网站作者:menguio

一、环境搭建、配置,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应用程序,可以实现媒体播放