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脚本:
- #! /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 module
- check_result=false
- export check_result #global
- export android_root_folder=${PWD}
- export SYSTEM_MODULE_NAME=$1
- if [ $# -gt 1 ]; then
- export SYSTEM_MODULE_PACKAGE_NAME=$2
- export system_mod_name_by_hand=true
- else
- export SYSTEM_MODULE_PACKAGE_NAME=$1
- fi
- function 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
- fi
- else
- echo "无效模块:${SYSTEM_MODULE_NAME}"
- exit
- fi
- . build/envsetup.sh
- #编译Calculator的源代码,生成apk文件。 输出: ~/froyo/out/target/product/generic/system/app/Calculator.apk
- mmm 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 "========================================================================================"
Android:基于Eclipse编译调试系统级应用源代码的更多相关文章
- Android配置----Eclipse+BlueStacks调试Android应用
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3 ...
- 使用eclipse编译调试c++
1. 安装JDK 到官网下载最新的jdk版本,并安装 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18 ...
- Android Studio下编译调试 ndk 的示例
https://github.com/googlesamples/android-ndk https://github.com/googlesamples android studio 手动安装cma ...
- Android内核的编译和调试
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70500488 一.Android内核源码的选择 Android手机设备内核源码的调 ...
- 有关android源码编译的几个问题
项目用到编译环境,与源码有些差异不能照搬,关键是连源码都没编译过,下面基本上是行网上照的各种自学成才的分享,病急乱投医了,都记在下面作为参照吧. 1.验证是否编译正确,在终端执行 emulator & ...
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
- Eclipse中调试Android技巧
Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...
- <转>使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
准备 今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2 ...
- cocos2d-x学习之旅(五):1.5 使用eclipse编译cocos2d-x示例项目,创建cocos2d-x android项目并部署到真机
今天将cocos2d-x的示例项目tests编译到android真机运行,以及如何创建cocos2d-x的android项目. 打开cocos2d-x的tests项目,路径为:D:\cocos2d-x ...
随机推荐
- HtmlAgilityPack --解析Html源码
最近项目需要从网络上抓取一下数据解析Html源码,奈何正则表达式难写,于是网上搜索找到了“ HtmlAgilityPack”类库,敏捷开发,果然效率非同寻常. 在此做笔记,写下心得,顺便给自己总结一下 ...
- centos7 ops
默认使用firewall防火墙,不在使用iptables 特点:可以动态加载新设置的规则,而不用重启服务 scp操作: scp localfile user@host:remotedir mysql. ...
- shopnc b2b2c如何开启伪静态??
shopnc b2b2c开启伪静态的方法 一. windows环境下 1.先下载isapi rewrite插件,安装,然后我们把根目录下面的htaccess.txt那么修改成.htaccess即可. ...
- c风格字符串函数
十一.C 风格字符串 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat( ...
- C——货物管理系统
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> ...
- 图中两点间路径为l的数目
用矩阵G表示图的邻接阵. G2中的元素就是两点间路径为2的路径数,同理G3就是两点间路径为3的路径数目. 并且此结论同样适用于有向图. 甚至,此结论适用于有权图,只是算出来的不再是路径数,而是各条路径 ...
- 使用 Windows Media Center 远程控制
http://windows.microsoft.com/en-us/windows/getting-started-windows-media-center#getting-started-wind ...
- Java算法——O(n)查询数列中出现超过半数的元素
主要思想: 相邻元素两两比较,如果相同存入新数组,不同二者都删除.如果 某数出现次数超高n/2,则最后剩下的1元素为所求. public static int findMostElem(final A ...
- kinect for windows - 手势识别之一,C++实现
用C++来实现手势识别是比较困难的,所以在这个例子,我们只实现了握拳和松手的手势识别,其他没有实现. 先上个效果图: 在这个程序里,我们打开了kinect的RGB流,深度流,骨骼数据流和手势识别流.其 ...
- HDU 1851 A Simple Game
典型的尼姆博弈,在n对石子中,告诉你每堆的数目和每次从该堆最多可以取的数目,求最终谁将其取完. 题解:SG(i)=mi%(li+1),求异或值即可. #include <cstdio> i ...