• 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 "========================================================================================"  
  • 相关阅读:
    Chrome Extension 扩展程序 小白入门
    gulp 打包报错:ReferenceError: internalBinding is not defined
    error in static/js/xxx.js from UglifyJs Unpected token: punc() [static/js/xxx.js]
    ES6-
    浏览器的渲染原理(转载)
    nodeType、nodeName和nodeValue
    浏览器 HTTP 协议缓存机制详解
    JS函数的上下文环境
    ready和onload的区别
    自定义事件
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4501310.html
Copyright © 2020-2023  润新知