再学安卓 - 单步调试和单编运行

544 阅读4分钟

0.jpg

感谢小猫日以继夜的监督我输出文档

前言

上一篇我们已经在WSL2+Ubuntu环境下成功编译了AOSP源码,接下来我们开始配置最终的开发环境。我们的目标有如下几个:

  • 在Windows端使用Android Studio加载源码
  • 将编译好的模拟器镜像打包并放到Windows端运行
  • 使用Android Studio调试系统进程
  • 单编模块并Push到模拟器中运行

完成以上目标后,我们就可以在AOSP代码中自由穿梭,像平常我们调试运行普通APP一样随心所欲了。

注:我们的环境暂时无法支持Native程序的断点调试,但单编、Push运行和framework.jar没有区别。如果有断点调试C/C++层代码的需求,建议在Ubuntu环境(非WSL环境中)下安装Android Studio for Platform(一款官方专门用于平台开发的IDE,也是基于IDEA开发的)。

在Windows端使用Android Studio加载源码

  1. 使用AIDEGen生成Android Studio项目配置文件。AIDEGen参数详解请参见官方文档
# 在aosp根目录下执行环境初始化,和我们前面编译的选项保持一致
source build/envsetup.sh && lunch sdk_pc_x86_64-userdebug

# 生成项目配置文件
# framework:想要生成项目配置文件的模块名
# -n:生成后不自动拉起IDE,因为我们的WSL上没有安装IDE
# -s:跳过编译,默认AIDEGen会启动编译,根据编译过程记录依赖关系并生成项目配置文件
# -i:表示IDE参数,s=AndroidStudio e=Eclipse c=CLion v=VSCode j=IntelliJ
aidegen framework -n -s -i s

# 执行完毕之后会在frameworks/base目录下生成.idea目录、base.iml、dependencies.iml、framework_srcjars.iml
  1. 上一步生成的配置文件还不能在Windows端直接使用,原因是其中的目录路径是Ubuntu中的绝对路径,我们需要手动改为Windows下的访问路径。

因此我们需要将.idea\vcs.xml、.idea\modules.xml、base.iml、dependencies.iml、framework_srcjars.iml文件中的路径/root/aosp全部替换为//wsl.localhost/ubuntu2204/root/aosp。

# AIDEGen默认生成的路径,格式如下:
<sourceFolder url="file:///root/aosp/frameworks/base/apct-tests/perftests/autofill/src" isTestSource="false" />
# Windows下能识别的路径,格式如下:
<sourceFolder url="file:////wsl.localhost/ubuntu2204/root/aosp/frameworks/base/apct-tests/perftests/autofill/src" isTestSource="false" />
  1. 打开Android Studio,加载工程frameworks/base。可以看到,IDE已能识别此目录。 1.png

  2. 静待index完成,代码跳转无问题,nice!

将编译好的模拟器镜像打包并放到Windows端运行

  1. 在Android Studio中创建一个Android14的模拟器。 2.png

  2. 打包已编译的模拟器镜像。

# 在aosp根目录下执行环境初始化,和我们前面编译的选项保持一致
source build/envsetup.sh && lunch sdk_pc_x86_64-userdebug
# 打包镜像
m emu_img_zip

3.png

  1. 将生成的zip解压覆盖替换SDK/system-images目录下的所有文件。

  2. Windows命令行启动模拟器。

# 名称为第一步创建模拟器时取的
emulator -avd android14_r28_api34

使用Android Studio调试系统进程

  1. 打开Android Studio,随便找一行System Server的代码做个实验。 4.png

  2. 在Android Studio中创建一个JVM远程调试器,Run -> Edit Configurations -> Remote JVM Debug,取个名字,其他配置项保持默认。

  3. 由于AOSP源码的这一笔修改,因此默认情况下,我们无法远程调试System_server进程,因此,我们需要打开调试开关。

# Windows命令行执行
adb shell setprop persist.debug.dalvik.vm.jdwp.enabled 1
adb reboot

等待重启后,Run -> Attach Debugger to Android Process,我们已经能看到System_server进程了。 5.png

  1. 在模拟器中随便打开一个APP,在我们刚打的断点处就会停下来。和我们调试普通APP一模一样,非常nice!您也可以试试StepOver、StepInto等。 6.png

单编模块并Push到模拟器中运行

  1. 修改代码,增加一条日志,以便我们观察修改是否成功。 7.png

  2. 单编services.jar模块。

source build/envsetup.sh && lunch sdk_pc_x86_64-userdebug
# 单编services
m services
# 如果您需要单编其他模块,可以执行allmod查找模块名
# 单编framework.jar:
# m framework-minus-apex (Android 12及之后)
# m framework (Android 12之前)

8.png

  1. 关闭模拟器,以可写模式启动。
emulator -writable-system -avd android14_r28_api34
  1. 启动后执行以下命令,打开system目录的可写权限。
adb root
adb remount

# 重启设备
adb reboot

# 重启后继续执行
adb root
adb shell mount -o bind /system /system
adb shell mount -o rw,remount /system
  1. 上传修改之后的jar,并重启设备。若您有其他修改,上传之前最好备份一下services.jar,如果代码有问题,可能会导致系统无法启动。
adb push services.jar /system/framework
adb reboot
  1. 现在随便打开一个APP,我们会看到那条日志输出。 9.png

参考

使用AIDEGen将AOSP项目导入Android Studio

官方文档 - 打包 AVD 映像 zip 文件

官方文档 - 从命令行启动模拟器

AVD文件详解

使用ASfP搭建Android Framwork开发调试阅读环境