一、      概要描述

在使用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脚本:

  1. #! /bin/bash
  2. #andy@2010.12.24
  3. #这个脚本用来实现系统模块的源代码静态调试,即在修改源代码以后,运行该脚本,即可以在emulator中更新该apk
  4. #通过在源代码中加log信息来调试程序。
  5. # 请将该脚本至于android工程根目录下
  6. #前提:1.将android源代码加入到Eclipse中,不是必须,为了方便编辑代码,此项需要。
  7. #     2.在命令行运行
  8. #   make #完整编译源代码
  9. #   . build/envsetup.sh
  10. #   lunch 1 #generate emulator
  11. #   emulator & # run in background
  12. # 参考相关的调试文档:"Android基于源代码调试系统应用源代码参考教程.doc"
  13. if [ $# -lt 1 ]; then
  14. echo "=================================================================="
  15. echo "警告:至少需要输入一个参数(模块名)."
  16. echo ""
  17. echo "用法:$0 module_name [package_name]"
  18. echo ""
  19. echo "module_name:packages/apps中的模块,例如:Calculator,Calendar"
  20. echo "package_name(可选):如果不输入,由程序自动查找/packages/apps/**mode_name**/src/com/android/类名。"
  21. echo "也可以用ddms跟踪到,例如:com.android.calculator2,需要输入calculator2或由程序自动查找到calculator2"
  22. echo ""
  23. echo "示例:$0 Calculator calculator2 或 $0 Calculator"
  24. echo "=================================================================="
  25. exit
  26. fi
  27. #search packages/apps to match your module
  28. check_result=false
  29. export check_result #global
  30. export android_root_folder=${PWD}
  31. export SYSTEM_MODULE_NAME=$1
  32. if [ $# -gt 1 ]; then
  33. export SYSTEM_MODULE_PACKAGE_NAME=$2
  34. export system_mod_name_by_hand=true
  35. else
  36. export SYSTEM_MODULE_PACKAGE_NAME=$1
  37. fi
  38. function check_module_name()
  39. {
  40. #echo "$0:$1"
  41. for v in ${android_root_folder}/packages/apps/*
  42. do
  43. local mod_name=${v##/*/}
  44. if [ "$mod_name" = "$1" ]
  45. then
  46. #echo "FOUND"
  47. check_result=true
  48. #echo "${android_root_folder}/packages/apps/$1/src/com/android/*"
  49. for x in ${android_root_folder}/packages/apps/$1/src/com/android/*
  50. do
  51. local package_name=${x##/*/}
  52. if [ -d "${android_root_folder}/packages/apps/$1/src/com/android/$package_name" ] ;
  53. then
  54. if [ $system_mod_name_by_hand ] ;
  55. then
  56. echo "Package:$SYSTEM_MODULE_PACKAGE_NAME"
  57. else
  58. export SYSTEM_MODULE_PACKAGE_NAME=$package_name
  59. echo "Package:$SYSTEM_MODULE_PACKAGE_NAME"
  60. fi
  61. fi
  62. done
  63. return 1
  64. else
  65. #echo "Not FOUND"
  66. check_result=false
  67. fi
  68. done
  69. check_result=false
  70. return 0
  71. }
  72. #检测输入是否有效
  73. check_module_name ${SYSTEM_MODULE_NAME}
  74. echo "检查输入模块有效性..."
  75. if [[ "$check_result" = "true" ]]
  76. then
  77. if [ -d "${android_root_folder}/packages/apps/$1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}" ] ;
  78. then
  79. echo "有效模块:${SYSTEM_MODULE_NAME} $1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}"
  80. else
  81. echo "无效的Package:$1/src/com/android/${SYSTEM_MODULE_PACKAGE_NAME}"
  82. exit
  83. fi
  84. else
  85. echo "无效模块:${SYSTEM_MODULE_NAME}"
  86. exit
  87. fi
  88. . build/envsetup.sh
  89. #编译Calculator的源代码,生成apk文件。 输出: ~/froyo/out/target/product/generic/system/app/Calculator.apk
  90. mmm packages/apps/${SYSTEM_MODULE_NAME}
  91. # 切换到adb 所在目录
  92. cd ${android_root_folder}/out/host/linux-x86/bin
  93. #获得对system目录的rw权限
  94. ./adb remount
  95. #删除系统的相应apk
  96. ./adb shell rm /system/app/${SYSTEM_MODULE_NAME}.apk
  97. #uninstall系统的模块,在ddms中可以看到具体的模块命名
  98. ./adb uninstall com.android.${SYSTEM_MODULE_PACKAGE_NAME}
  99. #安装我们重新编译好的源代码生成的apk
  100. ./adb install ${android_root_folder}/out/target/product/generic/system/app/${SYSTEM_MODULE_NAME}.apk
  101. #切换回根目录
  102. cd ${android_root_folder}
  103. echo "======================================================================================="
  104. echo "已经替换系统的${SYSTEM_MODULE_NAME}.apk,位于system/app,请在emulator中配合ddms跟踪调试源代码。"
  105. echo "========================================================================================"

Android:基于Eclipse编译调试系统级应用源代码的更多相关文章

  1. Android配置----Eclipse+BlueStacks调试Android应用

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...

  2. 使用eclipse编译调试c++

    1. 安装JDK 到官网下载最新的jdk版本,并安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...

  3. Android Studio下编译调试 ndk 的示例

    https://github.com/googlesamples/android-ndk https://github.com/googlesamples android studio 手动安装cma ...

  4. Android内核的编译和调试

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70500488 一.Android内核源码的选择 Android手机设备内核源码的调 ...

  5. 有关android源码编译的几个问题

    项目用到编译环境,与源码有些差异不能照搬,关键是连源码都没编译过,下面基本上是行网上照的各种自学成才的分享,病急乱投医了,都记在下面作为参照吧. 1.验证是否编译正确,在终端执行 emulator & ...

  6. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  7. Eclipse中调试Android技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...

  8. <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...

  9. cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机

    今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...

随机推荐

  1. 将Oracle数据库导出为txt格式

    将Oracle数据库导出为txt格式: 方法1: 对于Windows系统,可以采用以下方式: 选择控制面板-->管理工具-->数据源(ODBC),添加一个新的数据源(系统或用户DSN均可) ...

  2. BZOJ 1050 旅行comf

    题目如下: 题目描述 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权值Vi(Vi<30000).给你两个顶点S和T,求一条路径,使得路径上最大边 ...

  3. BZOJ 3916: [Baltic2014]friends( hash )

    字符串哈希..然后枚举每一位+各种判断就行了 ----------------------------------------------------------------------------- ...

  4. Lucence.net索引技术 一

    1.建立索引 为了对文档进行索引,Lucene 提供了五个基础的类,他们分别是 Document, Field, IndexWriter, Analyzer, Directory.下面我们分别介绍一下 ...

  5. 第一节 生命周期和Zend引擎

    一切的开始: SAPI接口 SAPI(Server Application Programming Interface)指的是PHP具体应用的编程接口, 就像PC一样,无论安装哪些操作系统,只要满足了 ...

  6. Java 网络编程(Elliotte Rusty Harold)

    最近看了本Java网络编程方面的书,系统化一下Java网络编程,主要内容如下: 1.网络基础篇 这里包括基础的网络概念/ 输入输出流BIO/ Internet地址/URI/URL/HTTP/URLCo ...

  7. 命令 修改WAMP中mysql默认空密码

    WAMP安装好后,mysql密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作. 首先,通过WAMP打开mysql控制台. 提示输入密码,因为现在是空, WAMP安装 ...

  8. LintCode-删除元素

    题目描述: 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 样例 给出一个数组 [0,4,4,0,0,2,4,4],和值 4 返回 ...

  9. Linux下使用ps命令来查看Oracle相关的进程

    Linux下可以使用ps命令来查看Oracle相关的进程 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [oracle@ www.linuxidc.com ...

  10. 射频识别技术漫谈(24)——ISO15693的防冲突与传输协议

    遵守ISO15693协议的电子标签都有一个8字节共64bit的全球唯一序列号(UID),这个UID一方面可以使全球范围内的标签互相区别,更重要的是可以在多标签同时读写时用于防冲突.8字节UID按权重从 ...