android studio build debug ASOP

debug 配置

  • cpu 最低6核12 推荐8核16
  • 内存 最少32G, 推荐64G
  • 硬盘:SSD 最少512G 推荐1T

源码目录结构:

frameworks/ :包含 Android 系统框架的代码。
libcore/ :包含 Android 核心库 (Libcore) 的代码。
packages/ :包含 Android 系统内置应用程序和服务的代码。
sdk/ :包含 Android 软件开发工具包 (SDK) 的代码和工具。
system/ :包含 Android 系统服务和应用程序的代码。
hardware/ :包含 Android 硬件抽象层 ( HAL ) 的代码。
kernel/ :包含 Linux 内核 的代码。
art/:包含 Android 运行时 (ART) 的代码。
bionic/:包含 Android C 库 (Bionic) 的代码。
bootable/:包含 Android 启动相关的代码。
build/:包含 Android 编译系统的代码和配置文件。
cts/:包含 Android 兼容性测试套件 (CTS) 的代码和测试用例。
dalvik/:包含 Dalvik 虚拟机的代码。
development/:包含 Android 开发工具和示例代码。
device/:包含设备树和硬件相关的代码。
docs/:包含 Android 系统文档和开发者指南。
external/:包含 Android 系统使用的外部开源项目的代码。
libnativehelper/:包含 Android JNI 帮助库的代码。
ndk/:包含 Android Native Development Kit (NDK) 的代码和工具。
out/:包含 Android 编译系统生成的临时文件和输出文件。
pdk/:包含 Android 兼容性测试套件 (CTS) 的 Java API。
prebuilts/:包含预编译的二进制文件和工具链。
tools/:包含 Android 开发工具和实用程序的代码。

安装JDK

Ubuntu下JDK安装

#更新库
apt update
#查看jdk版本
apt search openjdk
#安装jdk
apt install openjdk-11-jdk
#查看已存在安装版本的jdk
update-alternatives --list java
#选择要使用的版本
update-alternatives --config java
#查看java编译器版本
update-alternatives --list javac
#更改java编译器版本
update-alternatives --config javac
#查看版本
java -version


生成android.ipr文件

cd ~/aosp

source build/envsetup.sh  
lunch aosp_oriole-userdebug
make idegen -j16

编译完成后有idegen.jar生成 [100% 5/5] Install out/host/linux-x86/framework/idegen.jar

./development/tools/idegen/idegen.sh  

android.ipr 和android.iml文件

若出现Couldn't find idegen.jar. Please run make first.则需要执行

source build/envsetup.sh
mmm development/tools/idegen/

然后再执行

//改成可读可写,否则,在更改一些项目配置的时候可能会出现无法保存的情况
sudo chmod 777 android.iml
sudo chmod 777 android.ipr

修改anroid.iml

搜索 excludeFolder,把下面的内容加进去

<excludeFolder url="file://$MODULE_DIR$/./external/emma" />
<excludeFolder url="file://$MODULE_DIR$/./external/jdiff" />
<excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
<excludeFolder url="file://$MODULE_DIR$/external/chromium" />
<excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
<excludeFolder url="file://$MODULE_DIR$/external/webkit" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />

或设置:

Project Structure -> Modules, 可快速去除某些模块, 其中红色代码Exclueded选项(即代表已删除的目录),

打开 android.ipr

打开Android Studio,File->open,选择需要导入工程根目录下的android.ipr文件

关联源码跳转

  • 配置JDK/SDK

    • 调试源码
    • 跳转源码
    • 排除非SDK代码的跳转
  • JDK(Java Development Kit)Java编译器、标准库

  • Android SDK(Android Software Development Kit)Android工具和库

  • classpath 是指包含 Java 类文件的目录列表。编译器会在 classpath 中查找所需要的类文件。

  • sourcepath 是指包含 Java 源文件的目录列表。编译器可以使用 sourcepath 中的源文件来调试 Java 代码。

新建JDK(No Libraries)

  • File->Projects Structure->SDKs,新建JDK并任取一个名字,
  • 清空Classpath、Sourcepath、Annotations、Documentation Paths
  • JDK home path 选择/usr/bin/jvm/java-8-jdk-amd64

配置SDK

Project Structure -> SDKs, 选中Android API 34 Platform, 然后选择其Java SDK为前面新建的JDK(No Libraries)

配置SDK

  • Project Structure -> SDKs, 选中Android API 34 Platform, (版本不要太低),
  • Java SDK栏选择刚刚新建的JDK,清空Classpath,Sourcepath,Annotations,Documentation Paths
  • Android SDK home path 目前不知道作用,选 /home/username/Android/Sdk

product中选Android API 34 Platform

在product中选Android API 34 Platform

建立依赖

Modules -> android -> Dependencies

  • 删除Android API 25 Platform之外的所有依赖
  • 然后点击下图绿色的+号来选择Jars or directories,添加frameworks, 也可添加其他的源码.

下图便是添加后的结果图:

Apply -> OK

在线调试

frameworks各大核心服务运行在system_server进程,

在调试器上名字为system_process,通过如下操作attach到我们要调试的目标进程,

同理, 要调试其他app进程也是这个方式.

测试debug

首先需要设置断点, 一旦进入断点便会停下来, 可以查看当时各个线程/变量值. 关于调试下一步等快捷键, 只需点击Tools即可看到.

断点1 设置电源中

SettingsBaseActivity.java文件中

void onCreate

打断点

运行 Setting 应用在 IDE attach 到 setting 进程

然后打开设置中的电源,就可以debug了.

断点 2

ActivityTaskManagerService.java中的startActivityAsUser

任意启动一个app都会运行断点

更多断点知识:https://juejin.cn/post/7349446682826948617

其他知识点

类型enguserdebuguser
ro.debuggable110
ro.kernel.android.checkjni100
ro.secure001
adb(默认状态)110