这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

2023-06-05 0 1,083

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

那时我要跟你撷取的是Framework的自学和增容的方式。

具体来说,Android是一类如前所述Linux的对外开放源代码应用软件栈,为广为的电子设备和机种而建立。右图是Android网络平台的主要就模块。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

从图中你能看见主要就有下列几部份共同组成:

LinuxMach

Android Runtime

原生植物C/C++库

Java API架构(前面我称作Framework架构层)

控制系统应用领域

他们在各应用领域消费市场看见的,多半是服务器端应用领域,也是加装在data地区的应用领域,它能装载,因此职权也受许多管制,比如说无法间接增设天数年份,须要初始化到控制系统应用领域增设里头再展开操作方式。

而他们在应用领域合作开发操作方式过程中采用的五大模块,即是在Framework架构层展开同时实现,应用领域透过同义词的准则,在AndroidMainfest.xml中展开实用性,接着承继相关联的派生类展开唯读。控制系统在开启操作方式过程中导出AndroidMainfest.xml,将应用领域的重要信息储存留下来,随即依照使用者的操作方式,或是控制系统的该台促发,开启相关联的应用领域。

所以,他们先来看一看Framework架构层都有什么样小东西。

Framework架构层是应用领域合作开发操作方式过程中,初始化的控制系统方式的外部同时实现,比如说他们采用的TextView、Button控件,都是在这里同时实现的。再举几个例子,他们初始化ActivityManager的getRunningAppProcesses方式查看当前运行的进程列表,还有他们采用NotificationManager的notify发送一个控制系统通知。

让他们来看一看Framework相关的代码路径。

代码源代码目录编译目录

控制系统的相关Widget

frameworks/base/core/java/android

frameworks/base/core/java/android/view

/system/framework/framework.jar

控制系统中的AMS/PMS

frameworks/base/services/core/java/com/android/server

/system/framework/services.jar

控制系统中内置的资源文件,比如说Button的背景图、属性值之类

frameworks/base/core/res

/system/framework/framework-res.apk

在控制系统合作开发中还会涉及到服务的相关联本地同时实现部份,比如说

frameworks/base/core/jni

frameworks/base/services/core/jni

视情况

如何快速地自学、梳理Framework知识体系呢?常见的自学方式有下面几种:

阅读书籍(方便梳理知识体系,但对于解决问题只能提供方向)。

间接阅读源代码(效率低,挑战难度大)。

打Log和打堆栈 (效率有所提升,但须要反复编译,添加Log和堆栈代码)。

间接联调,实时便捷(须要增容版本)。

具体来说能透过购买相关的书籍展开自学,其中主要就的知识体系有Linux操作方式控制系统,比如说进程、线程、进程间通信、虚拟内存,建立起自己的应用软件架构。在此基础上自学Android的开启操作方式过程、服务进程SystemServer的建立、各服务线程(AMS/PMS等)的建立操作方式过程,以及Launcher的开启操作方式过程。熟悉了那些之后,你还要了解ART虚拟机的主要就工作原理,以及init和Zygote的主要就工作原理。之后随着在工作和实践操作方式过程中你会发现,Framework主要是围绕应用领域开启、显示、该台消息、按键传递、添加服务等开展,那些代码的同时实现主要就采用的是Java和C++这两种语言。

透过书籍或是网络资料自学一段天数后,你会发现很多问题都没有现成的解决方案,而此时就须要他们深入源代码中展开挖掘和自学。但是除了阅读官方文档外,别忘了增容Framework也是一把利刃,能让你游刃有余快速定位和分析源代码。

下面他们来看一看增容Framework的Java部份,关于C++的部份,须要采用GDB展开增容,你能在课下实践一下,增容的操作方式过程能参考《深入Android源代码系列(一)》。

他们这里采用Android Studio展开增容,在增容前他们要先掌握许多知识。Java代码的增容,主要依据两个因素,一个是你要增容的进程;一个是增容的类相关联的包名路径,同时还要保证你所运行的手机环境和你要增容的代码是匹配的。只要这两个重要信息匹配,编译不透过也是能展开增容的。

他们增容的控制系统服务是在SystemServer进程中,能采用下面的命令验证(我这里采用Genymotion上加装Android相关联版本镜像的环境演示):

ps -A |grep system_server  查看控制系统服务进程pid

cat /proc/pid/maps |grep services 透过cat查看此进程的内存映射,看一看是否services映射到内存里头

这里他们看见重要信息:/system/framework/oat/x86/services.odex

odex是Android控制系统对于dex的进一步优化,目的是为了提升执行效率。从这个重要信息便能确定,他们的services.jar确实是跑到这里了,也是他们的控制系统服务相关联的代码,能透过增容SystemServer进程展开跟踪。

留下来他们来建立增容环境。

打开Genymotion,选择下载好Android 9.0的镜像文件,开启模拟器。

找到模拟器相关联的ActivityManagerService.java代码。 我是从http://androidxref.com/下载Android 9.0相关联的代码。

打开Android Studio,File -> New -> New Project接着间接Next直到完成就行。

新建一个包名,从ActivityManagerService.java文件中找到它,这里为com.android.server.am,接着把ActivityManagerService.java放到里头即可。

在ActivityManagerService.java的startActivity方式上面增设断点,接着找到菜单的Run -> Attach debugger to Android process勾选Show all process,选中system_server进程确定。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

这时候他们点击Genymotion模拟器中桌面的一个图标,开启新的界面。

会发现这时候他们设定的断点已经生效。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

你能看见断留下来的堆栈重要信息,以及许多变量值,接着他们能一步步增容下去,跟踪开启的流程。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

对于自学控制系统服务线程来讲,透过增容能快速掌握流程,再结合阅读源代码,便可以快速自学,掌握控制系统架构的整个逻辑,从而节省自学的天数成本。

以上他们验证了控制系统服务AMS服务代码的增容,其他服务增容方式也是一样,具体的线程重要信息,能采用下面的命令查看。

ps -T 353 

这里353是采用ps -A |grep system_server查出 SystemServer的进程号

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

在上面图中,PID = TID的只有第一行这一行,如果PID = TID的话,也是这个线程是主线程。下面是他们平时采用Logcat查看输出的重要信息。

03-10 09:33:01.804   240   240 I hostapd : type=1400 audit(0.0:1123): avc: de

03-10 09:33:37.320   353  1213 D WificondControl: Scan result ready event

03-10 09:34:00.045   404   491 D hwcomposer: hw_composer sent 6 syncs in 60s

这里我还框了一个ActivityManager的线程,这个是线程的名称,透过查看这行的TID(368)就知道下面的Log是这个线程输出的。

03-10 08:47:33.574   353   368 I ActivityManager: Force stopping com.android.providers

自学完上面的知识,相信你应该学会了控制系统服务的增容。透过增容分析,他们便能将控制系统服务架构展开庖丁解牛般的自学,面对大量庞杂的代码掌握起来也能轻松许多。

他们回过头来,再次在终端中输入ps -A,看看下面这一段重要信息。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

第三列代表的是PPID,也是父进程ID。

你发现我这里框住的都是同一个父进程,所以他们来找下这个323进程,看一看它到底是谁。

root 323 1 1089040 127540 poll_schedule_timeout f16fcbc9 S zygote

这个名字在自学Android控制系统的时候,总被反复提及,因为它是他们Android世界的孵化器,每一个上层应用领域的建立,都是透过Zygote初始化fork建立的子进程,而子进程能快速承继父进程已经加载的资源库,这里主要就指的是应用领域所需的JAR包,比如说/system/framework/framework.jar,因为他们应用领域所需的基础控件都在这里,像View、TextView、ImageView。

接留下来我来讲解下一个增容,也是对TextView的增容(其他Button增容方式一样)。如前面所说,这个代码被编译到/system/framework/framework.jar,所以他们透过ps命令和cat /proc/pid/maps命令在Zygote中找到它,同时它能够被每一个由Zygote建立的子进程找到,比如说他们当前要增容Gallery的主界面TextView。

他们验证下,采用ps -A |grep gallery3d查到Gallery相关联的进程PID,采用cat /proc/pid/maps |grep framework.jar看到如下重要信息:

efcd5000-efcd6000 r–s 00000000 08:06 684                                /system/framework/framework.jar

这说明他们要增容的应用领域进程在内存映射中确实存在,所以他们就须要在gallery3d进程中下断点了。

留下来他们建立增容环境:

打开Genymotion,选择下载好Android 9.0的镜像文件,开启模拟器,接着在桌面上开启Gallery图库应用领域。

找到模拟器相关联的TextView.java代码。

打开Android Studio,File -> New -> New Project接着间接Next直到完成就行。

新建一个包名,从TextView.java文件中找到它的包名,这里为android.widget,接着把TextView.java放到里头即可。

在TextView.java的onDraw方式上面增设断点,接着找到菜单的Run -> Attach debugger to Android process勾选Show all process,选中com.android.gallery3d进程(他们已知这个主界面有TextView控件)确定。

接着他们点击下这个界面左上角的菜单,随便选择一个点击,发现断点已生效,具体如右图所示。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

接着他们能采用界面上的增容按钮(或是快捷键)展开增容代码。

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

那时我讲解了如何增容Framework中的控制系统服务进程的AMS服务线程,其他PMS、WMS的增容方式跟AMS一样。因此我也讲解了如何增容一个应用领域里头的TextView控件,其他的比如说Button、ImageView增容方式跟TextView也是一样的。

透过那时的自学,我希望能够给你一个自学控制系统架构最便捷的路径。在解决控制系统问题的时候,你能方便的采用增容分析,从而快速定位、修复问题。

所以,你是否已经跃跃欲试,准备增容一下自己的应用领域呢?提出一个问题,他们增容Gallery应用领域的TextView时候,前提是让这个应用领域先运行起来,如果他们想增容从点击桌面Gallery图标到Gallery主界面绘制出来的操作方式过程,该如何增容呢?

他们是否能够增容市面上发行的三方应用领域呢?比如说微信,支付宝的某个界面的TextView控件?

再深入一下,如果他们想研究市面一款应用领域的外部同时实现,须要反编译分析代码,他们能否增容反编译出来的Smali代码呢?

推荐阅读Kotlin新版来了,支持跨网络平台!Google I/O 和 Android 合作开发者有关的点

编程·思维·职场

这些安卓源码调试技巧,不懂的人月薪绝对不过 30k !

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务