Android:基于Eclipse编译调试系统级应用源代码

一、      概要描述

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

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