android源码编译与调试.docx

上传人:b****5 文档编号:5608355 上传时间:2022-12-29 格式:DOCX 页数:9 大小:133.27KB
下载 相关 举报
android源码编译与调试.docx_第1页
第1页 / 共9页
android源码编译与调试.docx_第2页
第2页 / 共9页
android源码编译与调试.docx_第3页
第3页 / 共9页
android源码编译与调试.docx_第4页
第4页 / 共9页
android源码编译与调试.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

android源码编译与调试.docx

《android源码编译与调试.docx》由会员分享,可在线阅读,更多相关《android源码编译与调试.docx(9页珍藏版)》请在冰豆网上搜索。

android源码编译与调试.docx

android源码编译与调试

Android源码编译与调试

整理:

JoeyYin

如有任何问题,请联系yzy9508@

系统环境

ubuntu-11.10-desktop-i386

on

VMwareWorkstation8.0.0build-471780

on

WindowsXP

源码编译

软件环境

基本按照

下载源码

下载3、4天的时间才最终完成。

编译

make–j4

出现错误,发现ubuntu-11.10默认安装的是gcc4.6,但编译android需要gcc4.4。

重新安装gcc4.4后执行make–j4,顺利完成编译。

执行

emulator

出现错误,发现是由于之前安装了androidsdk的缘故。

在~/.bashrc中将androidsdk的路径从PATH中移除,同时增加:

exportANDROID_PRODUCT_OUT=/home/joeyyin/android_4.0.3_r1/out/target/product/generic

exportANDROID_PRODUCT_OUT_BIN=/home/joeyyin/android_4.0.3_r1/out/host/linux-x86/bin

exportPATH=$ANDROID_PRODUCT_OUT:

$ANDROID_PRODUCT_OUT_BIN:

$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:

  AlarmProvider “

$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->installnewsoftware->add->选择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->preferences->java->Codestyle->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:

$PATH

        exportPATH=/home/joeyyin/android_4.0.3_r1/prebuilt/linux-x86/toolchain/arm-linux-androideabi-4.4.x/bin:

$PATH

        现在执行命令

         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)

/bin/sh

退出

Exit

共享文件夹设置

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1