Android AOSP基础(五)Android Studio调试系统源码的三种方式

刘望舒
• 阅读 2527
  • AOSP基础
  • Android框架层

本文首发于微信公众号「刘望舒」

前言

作为应用开发,我们将AOSP源码下载下来后,去查看源码已经足够用,如果想更进一步,可以学习调试源码,这样有助于了解系统源码和原理。调试系统源码的方式有很多种,今天分享出来的是比较适合应用开发的三种,分别是AOSP源码项目调试、导入部分源码调试、新建Android项目调试。

需要注意的是,这三种方法都不需要整编系统源码,甚至有的方法只需要下载部分源码就可以了,哪个方法更适合你呢?看完本篇文章就会有答案了。

1. AOSP源码项目调试

这种调试方法的前提是要将AOSP源码下载下来,关于下载AOSP源码,可以查看Android AOSP基础(二)AOSP源码下载这篇文章,另外还需要将AOSP源码导入到Android Studio中,并且配置SDK和JDK,这个在Android AOSP基础(四)Source Insight和Android Studio导入系统源码讲过,因为这篇文章多次用到配置SDK和JDK这一知识点,再次讲一遍。

1.1 配置SDK和JDK

由于我们下载的是9.0的AOSP源码,SDK版本也应该对应为API 28,如果没有就去SDK Manager下载即可。 点击File -> Project Structure-->SDKs配置项目的JDK、SDK。 创建一个新的JDK,这里取名为1.8(No Libraries),删除其中classpath标签页下面的所有jar文件。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

接着设置将Android SDK的Java SDK设置为1.8(No Libraries),这样Android源码使用的Java就是Android源码中的。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

确保的项目的SDK为源码对应的SDK。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

1.2 新建Android工程配置

实际上不按如下配置也可以调试源码,但是打开AS时会在Event Log处报错且不能消除提醒,因此这里建议还是要配置下。 在File-->Project Structure-->Modules中添加一个Android FrameWork: Android AOSP基础(五)Android Studio调试系统源码的三种方式

修改Manifest file等路径为下图中类似的路径,因为我们常调试这个目录所以这么设置,你也可以设置其他的路径。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

在AS最顶部的工具条中选择Edit Configurations Android AOSP基础(五)Android Studio调试系统源码的三种方式

在Run/Debug Configurations弹框中点击左上角的加号,添加一个Android App配置,按下图进行配置: Android AOSP基础(五)Android Studio调试系统源码的三种方式

1.3 调试源码

打开Genymotion,运行Android 9.0的模拟器。 应用程序的启动过程是大部分开发都熟悉的知识点,这是不作介绍 应用程序的启动时会调用ActivityStarter的startActivityMayWait方法,下图是AMS到ApplicationThread的调用链。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

ctrl+N 查找类ActivityStarter,在ActivityStarter的startActivityMayWait方法上打断点,也可以在其他地方打断点,比如AMS的startActivity方法,这里只是举一个例子。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

点击菜单的Run-->Attach Debugger to Android Process或者上方工具条的Attach Debugger to Android Process图标,

勾选Show all processer,选择system_process,如下图所示。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

在Genymotion模拟器中点击Gallery应用,我们设的断点就会生效,就可以愉快的进行调试了。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

2. 导入部分源码进行调试

第一种方法需要对源码的idegen模块进行单编,生成android.ipr以便于AS导入AOSP全部源码。事实上,我们平常调试源码也用不到AOSP全部源码,导入部分源码也可以调试。这里导入最常用的frameworks/base目录作为举例。

在当前项目File-->New-->Import project,或者关闭当前项目,选择Import project,如下图所示。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

选择导入frameworks/base目录,一路Next: Android AOSP基础(五)Android Studio调试系统源码的三种方式

这是AS会列出frameworks/base目录下的所有项目,因为要调试ActivityStarter类,这里只需要导入frameworks/base/services/core/java就可以了。 Android AOSP基础(五)Android Studio调试系统源码的三种方式

剩下一路Next就可以了,项目加载进来后,按照本文1.1小节来配置项目的JDK、SDK。接下来的调试步骤和1.3小节是一样的。

3. 新建Android项目进行调试

如果我们没有下载源码,或者不想导入那么多源码,也可以新建一个Android项目来进行调试,步骤如下:

  1. File --> New --> New Project,一路Next就可以了。
  2. 新建一个包,因为要调试ActivityStarter类,包名称就为ActivityStarter的包名com.android.server.am。
  3. 将9.0版本的ActivityStarter类复制到包中,如果没有下载源码,可以从http://androidxref.com 中下载。
  4. 按照1.3节的内容开始调试。

4.总结

这篇文章介绍了3种调试源码的方法,作为应用开发来说,这三种调试方法就够用了,总体来说都是大同小异,适合不同需求的开发人员,按照我个人的理解,最推崇第一种方法,毕竟这种方法一劳永逸。好了AOSP基础系列就讲到这,接下来你可以开始阅读和调试源码了,建议从Android系统启动系列开始看。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
刘望舒 刘望舒
3年前
Android AOSP基础(二)AOSP源码和内核源码下载
title:"AndroidAOSP基础(二)AOSP源码和内核源码下载"date:20193900:18cover:https://s2.ax1x.com/2019/05/27/VZRBi4.jpgtag:AOSP基础categories:Android框架层本文首发于微信公众号「后厂技术官」前言这篇文章我们来学习如何下载AOSP源码,
刘望舒 刘望舒
3年前
Android AOSP基础(三)Android系统源码的整编和单编
AOSP基础Android框架层本文首发于微信公众号「刘望舒」前言在上一篇文章中,我们顺利的将AOSP下载了下来,很多时候我们不仅仅需要去查看源码,还有以下的几个需求:动态调试Android系统源码定制Android系统将最新版本的Android系统刷入到自己的Android设备中将系统源码导入到AndroidStudio中为了实现这些需求,就
刘望舒 刘望舒
3年前
Android AOSP基础(四)Source Insight和Android Studio导入系统源码
AOSP基础Android框架层本文首发于微信公众号「刘望舒」前言在上一篇文章中,我们对系统源码进行了编译,这篇文章我们接着来学习如何将系统源码导入到编辑器中,以便于查看和调试源码。关于查看源码,可以使用AndroidStudio、Eclipse、Sublime、SourceInsight等软件,这里我推荐使用SourceInsight,但是有的同
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
刘望舒 刘望舒
3年前
Android AOSP基础(一)VirtualBox 安装 Ubuntu
AOSP基础Android框架层本文首发于微信公众号「刘望舒」前言在Android进阶三部曲第二部《Android进阶解密》的第一章,我介绍了两种阅读源码的方式,其中一种是从百度网盘:https://pan.baidu.com/s/1ngsZs将源码下载下来,然后用SouceInsight来查看,这种方式很便捷,适合去阅读源码,但是有两个弊端,一个是无
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这