Android如何完全调试framework层代码
1 之前写过一篇文章:《Android实现开机调试system_process》
2 google的eclipse插件ADT的已经能够很方便的调试Android的apk了,但是调试的时候应用程序已经进入Activity。
3 如果我们想了解一下Activity的启动过程,只有看代码+看log输出了吗?本文可以告诉你:NO!
4 相信大家比较感兴趣的都是代码,这里先把代码再放出来
ZygoteInit.java
- public static List<String> readCommandOutput(String command) {
- Runtime rt =Runtime.getRuntime();
- java.lang.Processproc;
- try {
- proc =rt.exec(command);
- if (proc.waitFor() != 0) {
- return null;
- }
- LinkedList<String>list = new LinkedList<String>();
- InputStreamReader ir = new InputStreamReader(proc.getInputStream());
- BufferedReader in = new BufferedReader(ir);
- String line = null;
- while ((line = in.readLine()) != null) {
- list.add(line);
- }
- return list;
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
- public static String getPackageName(){
- String strPid =Integer.toString(android.os.Process.myPid());
- String cmd = "ps";
- List<String>result = readCommandOutput(cmd);
- if(result == null){
- return "";
- }
- for(String info:result){
- if(info.contains(strPid)){
- int index = info.lastIndexOf(" ");
- if(index >=0){
- StringsubStr = info.substring(index+1);
- Log.i(TAG,subStr);
- return subStr;
- }
- }
- }
- return "";
- }
- public static boolean needDebug(String packageName){
- String debugProcess = android.os.SystemProperties.get("persist.sys.debug");
- Log.i(TAG,debugProcess);
- if(debugProcess.equals(packageName)){
- return true;
- }
- return false;
- }
- public static void main(Stringargv[]) {
- try {
- // Start profiling the zygote initialization.
- SamplingProfilerIntegration.start();
- registerZygoteSocket();
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
- SystemClock.uptimeMillis());
- preload();
- EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
- SystemClock.uptimeMillis());
- // Finish profiling the zygote initialization.
- SamplingProfilerIntegration.writeZygoteSnapshot();
- // Do an initial gc to cleanup after startup
- gc();
- // If requested, start system server directlyfrom Zygote
- if (argv.length != 2) {
- throw new RuntimeException(argv[0] + USAGE_STRING);
- }
- if (argv[1].equals("start-system-server")) {
- startSystemServer();
- } else if (!argv[1].equals("")) {
- throw new RuntimeException(argv[0] + USAGE_STRING);
- }
- Log.i(TAG, "Accepting command socket connections");
- if (ZYGOTE_FORK_MODE) {
- runForkMode();
- } else {
- runSelectLoopMode();
- }
- closeServerSocket();
- } catch (MethodAndArgsCaller caller) {
- String packageName = getPackageName();
- if(needDebug(packageName)){
- android.ddm.DdmHandleAppName.setAppName(packageName,UserHandle.myUserId());
- android.os.Debug.waitForDebugger();
- }
- caller.run();
- } catch (RuntimeException ex) {
- Log.e(TAG, "Zygote died with exception", ex);
- closeServerSocket();
- throw ex;
- }
- }
5 如果有兴趣,继续往下看!
6 readCommandOutput:用于执行命令并获取命令的输出
7 getPackageName()有于获取当前进程的包名
这里默认进程名称即为包名
获取ps的输出
然后通过pid找到本程序所在的输出行。
提取出本程序所在的输出行包名
8 needDebug()用于判断当前进程是否需要调试,原理是这样的:
使用者通过setprop persist.sys.debug 包名来设置包的名称
needDebug获取 persist.sys.debug
再与本进程的包名进行比较,以判断是否要调试
9 接下来的动作就和《Android实现开机调试system_process》一样了:
设置App在DDM中的名称:
android.ddm.DdmHandleAppName.setAppName(packageName,UserHandle.myUserId());
等待调试器来连接:
android.os.Debug.waitForDebugger();
10 接下来重新编译和烧录,mmm...,一个漫长的过程,但是结果将会证明一确都是值得的。
11 接下来,创建一个伪工程,修改Manifest中的package为需要调试的程序包名
12 再在工程中将需要调试的framework层代码引进来
13 接下来,adb shell连接到android,进行命令行
14 执行命令:
setprop persist.sys.debug 包名
15 在需要调试的代码上设置断点
16 接下来,启动应用程序,注意,是直接启动程序,而不是通过eclipse启动调试!
17 enjoy it!
18 (完)
Android如何完全调试framework层代码的更多相关文章
- Android开发如何定制framework层服务
刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...
- 【Android】Sensor框架Framework层解读
Sensor整体架构 整体架构说明 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数 ...
- 怎样从C++代码直接訪问android framework层的WifiService
说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiSe ...
- Android Framework层Power键关机流程(一,Power长按键操作处理)
一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...
- Android源码剖析之Framework层升级版(窗口、系统启动)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...
- Android源码剖析之Framework层基础版(窗口、linux、token、Binder)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...
- Android Framework中的Application Framework层介绍
Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...
- 〖Android〗OK6410a的Android HAL层代码编写笔记
一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...
- Android Studio 动态调试 apk 反编译出的 smali 代码
在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...
随机推荐
- CAT XQX ---- 增删改查架构说明 1
View 层 -- 以国家为例 1. 显示 数据库的 table 页面效果 对应代码: <table id="dg" title="国家信息" cla ...
- 多态.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- 类 .xml
pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...
- CRF模型
CRF的全称是Conditional Random Fields,由CMU教授John Lafferty 提出,原文标题:Conditional R andom Fields: Probabilist ...
- JSON 教程学习进度备忘
书签:跳过:另外跳过的内容有待跟进 __________________ 学习资源:W3School. _________________ 跳过的内容: 1. ______________ 知识点:1 ...
- Ubuntu14.04LTS安装记录(办公室联想台式机)
一.用UltraISO制作U盘启动器,被安装的电脑要设置成从U盘启动. 二.傻瓜式安装简体中文版 三.安装更新 sudo apt-get update sudo apt-get upgrade 四.安 ...
- 前端技能汇总 Frontend Knowledge Structure
Frontend Knowledge Structure 项目起源 还记得@jayli 的这幅前端知识结构图么. 图片的形式具有诸多的不便.缺失源图的我们,无法为此图贡献些什么,随着时间的迁移,或许有 ...
- nova service-list
nova-scheduler start/running, process 4820root@ruiy-controller-a:/var/log/nova# nova service-list+-- ...
- 第三百五十九天 how can I 坚持
在家待了一天,鼓捣了下linux,总算能连上网了,懂得还是少啊. 晚上去华北电力大学跑了会步,十圈,还挺有成就感呢,就是没带手环,哎. 以后学习一定要记笔记,上了这么多年学,都 没学会怎么记笔记,也是 ...
- <转载>内存管理内幕-动态分配的选择、折衷和实现 对malloc内存分配有个简单的描述,对内存管理有个大致的说明
这篇文章看后感觉不错,和我在glibc下的hurdmalloc.c文件里关于malloc的实现基本意思相同,同时,这篇文章还介绍了一些内存管理方面的知识,值得推荐. 原文链接地址为:http://ww ...