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. 从今天开始写博客、托管代码到 Github

    最近看了一篇文章,译名<简历危险>,原名<Resumes are dangerous>. 作者为Alex Maccaw,他有一篇文章曾经在网上流传甚广——<Traveli ...

  2. 大端小端(Big- Endian和Little-Endian)[转]

    原文出处: 字节序(Endian),大端(Big-Endian),小端(Little-Endian)  http://www.cppblog.com/tx7do/archive/2009/01/06/ ...

  3. 腾讯2015校招一面、二面、HR面

    其实我目前的理想公司就是腾讯. 内推第三面跪了··· 现在校招. 已面完一面.二面.HR面··· 一面主要问我项目和Linux.网络··· 二面主要问我游戏服务器··· 然后是HR面··· 技术面我都 ...

  4. [转载]我读过最好的Epoll模型讲解

    转载来自:http://blog.csdn.net/mango_song/article/details/42643971 首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行 ...

  5. 牛课--C/C++

    引用是除指针外另一个可以产生多态效果的手段. //引用是除指针外另一个可以产生多态效果的手段. #include<iostream> using namespace std; class ...

  6. GridView導出Excel

    1.aspx頁面需要添加:EnableEventValidation="false" 實例:<%@ Page Language="C#" AutoEven ...

  7. Javascript模板及其中的数据逻辑分离思想(MVC)

    #Javascript模板及其中的数据逻辑分离思想 ##需求描述 项目数据库的题目表描述了70-120道题目,并且是会变化的,要根据数据库中的数据描述,比如,选择还是填空题,是不是重点题,题目总分是多 ...

  8. ipc.Client: Retrying connect to server: h1/192.168.1.61:9000. Already tried 0 time(s);解决方法

    1.检查namenode服务器的是否运行正常,我的问题是没有开启hadoop集群出现的. 2.检查namenode服务器的防火墙是否开放的响应端口,一般内网建议关闭.

  9. 20151227感知机(perceptron)

    1 感知机 1.1 感知机定义 感知机是一个二分类的线性分类模型,其生成一个分离超平面将实例的特征向量,输出为+1,-1.导入基于误分类的损失函数,利用梯度下降法对损失函数极小化,从而求得此超平面,该 ...

  10. tomcat的 JNDI 配置

    tomcat的conf/server.xml 配置 尽量用简单版 <Context path="/cas" docBase="D:\YC\zqV7\cas\WebR ...