History

1.Created by andy@2010.12.24

一、 概要描述

在使用Eclipse导入android工程源代码以后,我们可以使用ddms调试和跟踪源代码。

本文讲述动态调试源代码和静态调试源代码的两种方法,避免build system.img和重新启动emulator,加快调试速度。

其中静态调试的时间消耗仅在remake相关模块以及install相关的apk,因此效率很高。

动态调试的时间消耗除了静态调试的时间外,由于需要关闭Eclipse和重新启动ddms进入debug调试模式,时间稍长,相对于build system.img再通过重新启动emulator的时间(这两个时间相对很长)已经快很多。

以下文档说明以Calculator为例进行编译调试说明。

二、 前提条件

1)Android工程源代码已经通过Eclipse导入,请参考相关文档。

2)通过make指令完整编译android源代码,生成emulator必要的image文件

3)将 remakesystem 复制到android源代码的根目录下,见附件

三、 静态调试程序(类似与feature phone通过catcher log方式调试代码)

1)启动emulator和ddms

.build/envsetup.sh

lunch 1 #generate emulator

emulator & # run in background

ddms & # run in background

这时在ddms中可以定位到相应的proccess: com.android.calculator2

2)在Eclise中或其它编辑器中修改源代码或资源,可以加入必要的Log语句。

3)在命令行运行./remakesystem Calculator编译相应的模块并替换emulator中的程序。

具体机制请阅读 remakesystem源代码。如有无法找到相关命令的错误提示,请sudo chmod a+x remakesystem获取相应的权限。

4)在ddms中logcat中观察相关的trace 语句进行调试。

5)重复2-4进行调试。

四、 动态调试程序(通过ddms断点方式调试代码)

1)修改保存源代码,退出Eclipse,同时关闭ddms(注意整个过程不需要关闭emulator),在Terminal命令行端CTRL+C结束ddms进程。

2)同静态调试一样,在命令行运行./remakesystem Calculator编译相应的模块并替换emulator中的程序。

3)启动 ddms & (注意以后台运行方式&指令运行ddms方便继续操作),选择相应的进程,如:com.android.calculator2

4)启动Eclipse,选择android工程,设置必要的断点。然后在Run菜单下找到Debug configurations,选择Remote Java Application,选择android工程,设置Port为8700,点击Debug按钮进入debug模式(注意前提是在ddms中要选择相应的进程)

5)操作emulator中的系统应用,进入相应的断点,进行断点调试。如果修改了源代码,请重复以上步骤。

五、remakesystem脚本:

#! /bin/bash#andy@2010.12.24#这个脚本用来实现系统模块的源代码静态调试,即在修改源代码以后,运行该脚本,即可以在emulator中更新该apk#通过在源代码中加log信息来调试程序。# 请将该脚本至于android工程根目录下#前提:1.将android源代码加入到Eclipse中,不是必须,为了方便编辑代码,此项需要。#     2.在命令行运行#   make #完整编译源代码 #   . build/envsetup.sh#   lunch 1 #generate emulator#   emulator & # run in background# 参考相关的调试文档:"Android基于源代码调试系统应用源代码参考教程.doc"if [ $# -lt 1 ]; then  echo "=================================================================="  echo "警告:至少需要输入一个参数(模块名)."  echo ""  echo "用法:$0 module_name [package_name]"  echo ""  echo "module_name:packages/apps中的模块,例如:Calculator,Calendar"  echo "package_name(可选):如果不输入,由程序自动查找/packages/apps/**mode_name**/src/com/android/类名。"  echo "也可以用ddms跟踪到,例如:com.android.calculator2,需要输入calculator2或由程序自动查找到calculator2"  echo ""  echo "示例:$0 Calculator calculator2 或 $0 Calculator"  echo "=================================================================="  exit fi#search packages/apps to match your modulecheck_result=falseexport check_result #global export android_root_folder=${PWD}export SYSTEM_MODULE_NAME=$1if [ $# -gt 1 ]; then  export SYSTEM_MODULE_PACKAGE_NAME=$2  export system_mod_name_by_hand=trueelse  export SYSTEM_MODULE_PACKAGE_NAME=$1         fifunction check_module_name(){    #echo "$0:$1"    for v in ${android_root_folder}/packages/apps/*    do        local mod_name=${v##/*/}        if [ "$mod_name" = "$1" ]                    then                 #echo "FOUND"               check_result=true            #echo "${android_root_folder}/packages/apps/$1/src/com/android/*"            for x in ${android_root_folder}/packages/apps/$1/src/com/android/*            do                 local package_name=${x##/*/}                                if [ -d "${android_root_folder}/packages/apps/$1/src/com/android/$package_name" ] ;                then                   if [ $system_mod_name_by_hand ] ;                   then                      echo "Package:$SYSTEM_MODULE_PACKAGE_NAME"                   else                     export SYSTEM_MODULE_PACKAGE_NAME=$package_name                                 echo "Package:$SYSTEM_MODULE_PACKAGE_NAME"                   fi                fi            done                 return 1        else     #echo "Not FOUND"            check_result=false                            fi    done    check_result=false    return 0}#检测输入是否有效check_module_name ${SYSTEM_MODULE_NAME}echo "检查输入模块有效性..."if [[ "$check_result" = "true" ]]then if [ -d "${android_root_folder}/packages/apps/$1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}" ] ; then echo "有效模块:${SYSTEM_MODULE_NAME} $1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}" else echo "无效的Package:$1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}" exit fielse echo "无效模块:${SYSTEM_MODULE_NAME}" exitfi. build/envsetup.sh#编译Calculator的源代码,生成apk文件。 输出: ~/froyo/out/target/product/generic/system/app/Calculator.apkmmm packages/apps/${SYSTEM_MODULE_NAME} # 切换到adb 所在目录cd ${android_root_folder}/out/host/linux-x86/bin#获得对system目录的rw权限./adb remount #删除系统的相应apk./adb shell rm /system/app/${SYSTEM_MODULE_NAME}.apk#uninstall系统的模块,在ddms中可以看到具体的模块命名./adb uninstall com.android.${SYSTEM_MODULE_PACKAGE_NAME}#安装我们重新编译好的源代码生成的apk./adb install ${android_root_folder}/out/target/product/generic/system/app/${SYSTEM_MODULE_NAME}.apk#切换回根目录cd ${android_root_folder}echo "======================================================================================="echo "已经替换系统的${SYSTEM_MODULE_NAME}.apk,位于system/app,请在emulator中配合ddms跟踪调试源代码。"echo "========================================================================================"


更多相关文章

  1. 吊打面试官:Android中高级面试题 -- 终局之战
  2. Android(安卓)Afinal框架
  3. 深入分析Android中Dialog
  4. android 2.2 的新功能 ndk-gdb调试.
  5. 中文手写输入 (一)
  6. Android实现类似excel表格的方法整理
  7. 利用Android源代码编译一个自己写的Hello World模块
  8. Android(安卓)GSM驱动模块(rild)详细分析(三)response流程
  9. Android(安卓)Makefile and build system 分析

随机推荐

  1. Android(安卓)-- Looper.prepare()和Loop
  2. 详细介绍android rom移植知识普及
  3. Android(安卓)联网取数据
  4. Android(安卓)9-patch
  5. Android中的windowSoftInputMode属性详解
  6. Android(安卓)Socket 开发
  7. 从零开始Android
  8. android 的 Gallery 的简单使用
  9. Flutter和Android中的View区别
  10. 那些iOS和Android跨平台解决方案