android源码编译与调试Word格式.docx
《android源码编译与调试Word格式.docx》由会员分享,可在线阅读,更多相关《android源码编译与调试Word格式.docx(9页珍藏版)》请在冰豆网上搜索。
$PATH
编译生成的emulator等其他bin工具在/home/joeyyin/android_4.0.3_r1/out/host/linux-x86/bin目录。
System.img,userdata.img,ramdis.img在/home/joeyyin/android_4.0.3_r1/out/target/product/generic
其中
Ramdisk.img是emulator的文件系统。
System.img包括主要的包、库等文件。
Userdata.img包括了一些用户数据,emulator负责加载3个映像文件后,会把system.img,userdata.img分别加载到ramdisk文件系统的system和userdata目录下。
再执行emulator,模拟器顺利启动。
cd~/android_4.0.3_r1/out/target/product/generic
emulator-systemsystem.img-datauserdata.img-ramdiskramdisk.img
编译模块
android中的一个应用程序可以单独编译,编译后要重新生成system.img
在源码目录下执行
$.build/envsetup.sh(.后面有空格)
就多出一些命令:
-croot:
Changesdirectorytothetopofthetree.
-m:
Makesfromthetopofthetree.
-mm:
Buildsallofthemodulesinthecurrentdirectory.
-mmm:
Buildsallofthemodulesinthesupplieddirectories.
-cgrep:
GrepsonalllocalC/C++files.
-jgrep:
GrepsonalllocalJavafiles.
-resgrep:
Grepsonalllocalres/*.xmlfiles.
-godir:
Gotothedirectorycontainingafile.
可以加—help查看用法
我们可以使用mmm来编译指定目录的模块,如编译联系人:
$mmmpackages/apps/Browsers/
编完之后生成两个文件:
out/target/product/generic/data/app/Browser.apk
out/target/product/generic/system/app/Browser.apk
可以使用
$makesnod
重新生成system.img,再运行模拟器
编译SDK
$makesdk
悲剧的出现以下错误:
解决:
查找alarmprovider模块,没有发现
搜索build目录下含alarmprovider的项目
去掉这两个文件中的PRODUCT_PACKAGES中alarmprovider。
网上也有关于这个问题的解答:
“IndeedthereisnoamodulewithnameAlarmProviderinthesourcetreenow.
Tofixit,removeAlarmProviderfromtheproductdefinitioninthe
followingfiles:
./build/target/product/large_emu_hw.mk:
25:
AlarmProvider
./build/target/product/generic_no_telephony.mk:
24:
“
$makesdk
又先后出现和以上类似的针对’Sync’,‘Updater’,‘SyncProvider’,…
看了网上的信息,也可以使用makePRODUCT-sdk-sdk进行编译
将generic_no_telephony.mk,large_emu_hw.mk恢复
$makePRODUCT-sdk-sdk
半小时候顺利完成编译。
makeSDK和makePRODUCT-sdk-sdk有何异同?
?
编译后生成的SDK存放在out/host/linux-x86/sdk/,此目录下有android-sdk_eng.joeyyin_linux-x86.zip和android-sdk_eng.joeyyin_linux-x86目录。
android-sdk_eng.joeyyin_linux-x86就是SDK目录
实际上,当用mmm命令编译模块时,一样会把SDK的输出文件清除,因此,最好把android-sdk_eng.joeyyin_linux-x86移出来
此后的应用开发,就在该SDK上进行,所以把在~/.bashrc中增加sdktools/platform_tools到PATH中:
exportANDROID_SDK_HOME=/home/joeyyin/android_4.0.3_r1/out/host/linux-x86/sdk/android-sdk_eng.joeyyin_linux-x86
exportPATH=$ANDROID_SDK_HOME/tools:
$ANDROID_SDK_HOME/platform_tools:
$PATH
创建AndroidVirtualDevice
编译出来的SDK是没有AVD(AndroidVirtualDevice)的,我们可以通过android工具查看:
$androidlist
创建AVD:
$androidcreateavd-t1-nmyavd
可以android–help来查看上面命令选项的用法。
创建中有一些选项,默认就行了
再执行androidlist,可以看到AVD存放的位置
以后每次运行emulator都要加-avdmyavd或@myavd选项:
$emulator-avdmyavd
源码编译分析
首先需要理解makefile的编写规则
推荐一篇介绍文章
Makefile->
build/core/main.mk
Eclipse+adt
Eclipse安装
下载eclipsefromhttp:
//www.eclipse.org/downloads/?
osType=linux
这个版本在后面编译安装adt时会有错误,建议下载下面的版本:
$tarzxvfeclipse-jee-indigo-SR2-linux-gtk.tar.gz
$tarzxvfeclipse-SDK-3.7.2-linux-gtk.tar.gz
$sudomveclipse/opt
$cd/opt
$sudochown-Rroot:
rooteclipse
$sudochmod-R+reclipse
$sudotouch/usr/bin/eclipse
$sudochmod755/usr/bin/eclipse
$sudovim/usr/bin/eclipse
文件内容如下:
#!
/bin/sh
#exportMOZILLA_FIVE_HOME="
/usr/lib/mozilla/"
exportECLIPSE_HOME="
/opt/eclipse"
$ECLIPSE_HOME/eclipse$*
$sudovim/usr/share/applications/eclipse.desktop
文件内容如下:
[DesktopEntry]
Encoding=UTF-8
Name=Eclipse
Comment=EclipseIDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
Type=Application
Categories=GNOME;
Application;
Development;
StartupNotify=true
Starteclipsefirsttime:
$/opt/eclipse/eclipse-clean&
编译安装adt
$cd~/android_4.0.3_r1/out/host/linux-x86
$mkdiradt
$cd~/android_4.0.3_r1/sdk/eclipse/scripts
$exportECLIPSE_HOME=/opt/eclipse
$./build_server.sh~/android_4.0.3_r1/out/host/linux-x86/adt
处理失败,出现很多类似以下依赖错误,据说要下载安装JavaEE版eclipse。
Missingrequiredplug-incom.android.ide.eclipse.adt_0.0.0.
直接启动eclipse->
help->
installnewsoftware->
add->
https:
//dl-
天煞的,这个地址居然无法连接【难道又被天朝封了?
】
下载javaee版本eclipse安装后,重新编译adt成功。
运行eclipse
$eclipse
help->
选择archive,刚刚编译生成adtzip包
安装完成后重启eclipse,配置sdk信息
悲剧的是这个编译会删除之前编译的sdk,所以这一步最好在makesdk之前做。
创建应用
Helloandroid:
导入android源码到eclipse
1、将源码目录\development\ide\eclipse中的.classpath复制到源码根目录下。
$cd~/android_4.0.3_r1
$cp/home/joeyyin/android_4.0.3_r1/development/ide/eclipse/.classpath.
$chmodu+w.classpath
2、更改eclipse缓存设置
在eclipse安装根目录下修改eclipse.ini
-Xms128m
-Xmx512m
-XX:
MaxPermSize=256m
3、将源码目录\development\ide\eclipse中的android-formatting.xml和android.importorder导入eclipse
android-formatting.xml用来配置eclipse编辑器的代码风格;
android.importorder用来配置eclipse的import的顺序和结构。
window->
preferences->
java->
Codestyle->
Formatter中导入android-formatting.xml
window->
OrganizeImports中导入android.importorder。
4、导入源码
新建JavaProject[非androidproject],指定一个name[android_4.0.3_r1],接着将usedefaultlocation勾掉,指定到你源码的目录下[/home/joeyyin/android_4.0.3_r1],finish。
出现两个missrequiredlibrary的错误。
反正不在eclipse中编译,不管这个错误了。
Workspace中的其他project可设置android.jarattach到之前导入的android源码工程(android_4.0.3_r1)
Properties->
javabuildpath->
libraries->
设置android.jar的sourceattachment到workspace->
android_4.0.3._r1
[在windows下类似操作]
在eclipse中调试android系统应用/服务:
按以下说明,使用browser测试过,可以断点跟踪调试。
使用GDB调试nativecode
调试webkit
1.进入android系统源码根目录,然后执行
sourcebuild/envsetup.sh
2.启动模拟器,并打开浏览器
Emulator–avdmyavd
3.在终端中执行
adbforwardtcp:
5039tcp:
5039
4.打开另一个终端,执行
adbshellps
找到
com.android.browser进程号
5.执行
adbshellgdbserver:
5039--attachpid
pid为
com.android.browser进行号
正常反馈:
Attached;
pid=****
Listeningonport5039
6.
回到第一个终端,导出环境变量,adb,
arm-eabi-gdb等的路径,在执行gdbclient报错时,可将相应的命令的路径导出
exportPATH=/home/joeyyin/android_4.0.3_r1/out/host/linux-x86/sdk/android-sdk_eng.joeyyin_linux-x86/platform-tools:
exportPATH=/home/joeyyin/android_4.0.3_r1/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:
现在执行命令
gdbclient
成功的话就会加载一系列的符号表。
试了一下设置断点,成功地在代码中中断了下来。
下面要做的就
是熟悉GDB调试命令了。
7.在gdb中设置断点
b
FrameLoaderClientAndroid.cpp:
888
c----continue
8.
在模拟中用浏览器打开任一网页,就会进入断点了。
另有一简化方法:
源码结构
补充
Cts–兼容测试工具
Device-?
?
Docs-?
Libcore-?
附录
Linux环境变量设置
shell
/etc/passwd
查看当前系统中可用的shell
cat/etc/shells
查看当前使用的shell
echo$SHELL
检查用户(joeyyin)的默认shell
cat/etc/passwd|grepjoeyyin
切换shell(到/bin/sh)
退出
Exit
共享文件夹设置