1 之前写过一篇文章:《Android实现开机调试system_process》

2 google的eclipse插件ADT的已经能够很方便的调试Android的apk了,但是调试的时候应用程序已经进入Activity。

3 如果我们想了解一下Activity的启动过程,只有看代码+看log输出了吗?本文可以告诉你:NO!

4 相信大家比较感兴趣的都是代码,这里先把代码再放出来

ZygoteInit.java

  1. public static List<String> readCommandOutput(String command)  {
  2. Runtime rt =Runtime.getRuntime();
  3. java.lang.Processproc;
  4. try {
  5. proc =rt.exec(command);
  6. if (proc.waitFor() != 0) {
  7. return null;
  8. }
  9. LinkedList<String>list = new LinkedList<String>();
  10. InputStreamReader ir = new InputStreamReader(proc.getInputStream());
  11. BufferedReader in = new BufferedReader(ir);
  12. String line = null;
  13. while ((line = in.readLine()) != null) {
  14. list.add(line);
  15. }
  16. return list;
  17. } catch (InterruptedException e) {
  18. e.printStackTrace();
  19. } catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. return null;
  23. }
  24. public static String getPackageName(){
  25. String strPid =Integer.toString(android.os.Process.myPid());
  26. String cmd = "ps";
  27. List<String>result = readCommandOutput(cmd);
  28. if(result == null){
  29. return "";
  30. }
  31. for(String info:result){
  32. if(info.contains(strPid)){
  33. int index = info.lastIndexOf(" ");
  34. if(index >=0){
  35. StringsubStr = info.substring(index+1);
  36. Log.i(TAG,subStr);
  37. return subStr;
  38. }
  39. }
  40. }
  41. return "";
  42. }
  43. public static boolean needDebug(String packageName){
  44. String debugProcess = android.os.SystemProperties.get("persist.sys.debug");
  45. Log.i(TAG,debugProcess);
  46. if(debugProcess.equals(packageName)){
  47. return true;
  48. }
  49. return false;
  50. }
  51. public static void main(Stringargv[]) {
  52. try {
  53. // Start profiling the zygote initialization.
  54. SamplingProfilerIntegration.start();
  55. registerZygoteSocket();
  56. EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
  57. SystemClock.uptimeMillis());
  58. preload();
  59. EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
  60. SystemClock.uptimeMillis());
  61. // Finish profiling the zygote initialization.
  62. SamplingProfilerIntegration.writeZygoteSnapshot();
  63. // Do an initial gc to cleanup after startup
  64. gc();
  65. // If requested, start system server directlyfrom Zygote
  66. if (argv.length != 2) {
  67. throw new RuntimeException(argv[0] + USAGE_STRING);
  68. }
  69. if (argv[1].equals("start-system-server")) {
  70. startSystemServer();
  71. } else if (!argv[1].equals("")) {
  72. throw new RuntimeException(argv[0] + USAGE_STRING);
  73. }
  74. Log.i(TAG, "Accepting command socket connections");
  75. if (ZYGOTE_FORK_MODE) {
  76. runForkMode();
  77. } else {
  78. runSelectLoopMode();
  79. }
  80. closeServerSocket();
  81. } catch (MethodAndArgsCaller caller) {
  82. String packageName = getPackageName();
  83. if(needDebug(packageName)){
  84. android.ddm.DdmHandleAppName.setAppName(packageName,UserHandle.myUserId());
  85. android.os.Debug.waitForDebugger();
  86. }
  87. caller.run();
  88. } catch (RuntimeException ex) {
  89. Log.e(TAG, "Zygote died with exception", ex);
  90. closeServerSocket();
  91. throw ex;
  92. }
  93. }

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层代码的更多相关文章

  1. Android开发如何定制framework层服务

    刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...

  2. 【Android】Sensor框架Framework层解读

    Sensor整体架构 整体架构说明 黄色部分表示硬件,它要挂在I2C总线上 红色部分表示驱动,驱动注册到Kernel的Input Subsystem上,然后通过Event Device把Sensor数 ...

  3. 怎样从C++代码直接訪问android framework层的WifiService

    说究竟,Java层的service就是就C++层的binder的封装.所以从原理上来讲通过C++代码直接訪问android framework层的service是全然可能的,这篇文章以訪问WifiSe ...

  4. Android Framework层Power键关机流程(一,Power长按键操作处理)

    一:Android处理Power按键长按操作 在Framework层中,Android4.x对Power键(KeyEvent.KEYCODE_POWER)的操作,我们从PhoneWindowManag ...

  5. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  6. Android源码剖析之Framework层基础版(窗口、linux、token、Binder)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 关于Framework,就是应用层底下的控制层,离应用层最近,总想找个机会,写写WindowMang ...

  7. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...

  8. 〖Android〗OK6410a的Android HAL层代码编写笔记

    一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...

  9. Android Studio 动态调试 apk 反编译出的 smali 代码

    在信安大赛的准备过程中,主要通过 Android Studio 动态调试 apk 反编译出来的 smali 代码的方式来对我们分析的执行流程进行验证.该技巧的主要流程在此记录.以下过程使用 Andro ...

随机推荐

  1. 提供给开发者 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  2. html页面加载和解析流程

    HTML页面加载和解析流程 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件: 浏览器开始载入html代码,发现<head>标签内有一 ...

  3. BITED-Windows8应用开发学习札记之一:Win8应用开发入门

    基于WinRT的Metro应用是我对Windows8的第一印象,简洁方块配以简单色调真的有沁人心脾的美感. 非常幸运,BITED在这个暑假的这个小学期里有幸学习到一门课程:软件工程基础实践,老师邀请了 ...

  4. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

  5. MemoryMappingFile泄漏分析过程

    最近项目突然收到了一个紧急的问题报告 - 用户在进行某些关键操作的时候整个软件突然就crash掉了.幸好产品继承了自动抓取dump的功能...   收到dump之后,通过windbg打开,查看相应的c ...

  6. 性能测试-ApacheBench

    基本简介 ApacheBench 是一个指令列程式,专门用来执行网站服务器的运行效能,特别是针对Apache 网站服务器.这原本是用来检测 Apache 网站服务器能够提供的效能,特别是可以看出Apa ...

  7. Windows Azure Platform 系列文章目录

    Windows Azure Platform (一) 云计算的出现 Windows Azure Platform (二) 云计算的分类和服务层次 Windows Azure Platform (三) ...

  8. 第二百三十六天 how can I 坚持

    太冷了,羽绒服没帽子,冻的耳朵疼. 她今天没有上班,原来是调休了. 其实应该是想到点啥,就应该写下,到晚上写就又忘了,什么都不记得了,这就是个需求吧. 睡觉.

  9. JVM系列一:JVM内存组成及分配

    java内存组成介绍:堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Java 虚拟机启动时 ...

  10. 删除qq历史签名

    我们在设置新的个性签名的时候之前的签名会被记录,我们可以用手机qq删除这些历史签名,告别过去,做崭新的自己. 到需要删除的历史签名, 从右至左滑动屏幕