zoukankan      html  css  js  c++  java
  • 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 "========================================================================================"  
  • 相关阅读:
    FJNU 1151 Fat Brother And Geometry(胖哥与几何)
    FJNU 1157 Fat Brother’s ruozhi magic(胖哥的弱智术)
    FJNU 1159 Fat Brother’s new way(胖哥的新姿势)
    HDU 3549 Flow Problem(最大流)
    HDU 1005 Number Sequence(数列)
    Tickets(基础DP)
    免费馅饼(基础DP)
    Super Jumping! Jumping! Jumping!(基础DP)
    Ignatius and the Princess IV(基础DP)
    Keywords Search(AC自动机)
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4501310.html
Copyright © 2011-2022 走看看