乐于分享
好东西不私藏

台湾学员疑问:如何通过进程名映射出对应源码路径?

台湾学员疑问:如何通过进程名映射出对应源码路径?

背景

早上收到台湾学员疑问,具体疑问如下:因为是繁体,这里总结一下他的问题: 简单说在系统开发中,看到了进程不知道去哪里找这个进程对应的源码。比如ps看到进程名字是surfaceflinger,请问这个surfaceflinger进程对应的源码在哪里呢? 其实这个问题还挺很常见,针对这个问题我们来开展一下剖析。

1.1 AOSP代码结构的复杂性

AOSP源码树包含数十万文件,主要目录结构如下:

AOSP根目录/
├── system/              # 系统核心代码
│   ├── core/           # 核心系统服务
│   ├── vold/           # 存储管理
│   ├── netd/           # 网络管理
│   └── ...
├── frameworks/          # 应用框架
│   ├── base/           # 基础框架
│   ├── native/         # Native服务
│   ├── av/            # 音视频框架
│   └── ...
├── packages/           # 应用程序
│   ├── apps/          # 系统应用
│   ├── providers/     # 内容提供者
│   └── ...
├── hardware/           # 硬件抽象层
│   ├── interfaces/     # HAL接口定义
│   └── qcom/         # 高通硬件实现
├── vendor/             # 厂商代码
│   └── ...
└── external/           # 第三方库

我们没有方法的话其实确实很难找到自己一些不熟悉进程的源码。

1.2 进程类型识别

Android系统中运行的进程分为两类:

Native进程:直接运行Linux可执行文件的进程

/system/bin/surfaceflinger   → 源码在 frameworks/native/services/surfaceflinger/
/system/bin/servicemanager   → 源码在 frameworks/native/cmds/servicemanager/
/system/bin/init            → 源码在 system/core/init/

APK进程:运行在Dalvik/ART虚拟机中的应用进程

com.android.settings   → 源码在 packages/apps/Settings/
com.android.phone     → 源码在 packages/services/Telephony/
com.android.systemui → 源码在 frameworks/base/packages/SystemUI/

二、Native进程源码定位

2.1 基本定位流程

步骤1:找到进程的可执行文件路径
    ↓
步骤2:根据路径推断源码位置
    ↓
步骤3:验证源码位置(查看Android.bp/Android.mk)
    ↓
步骤4:分析编译配置确认对应关系

2.2 定位方法详解

方法1:通过可执行文件路径推断

AOSP中路径映射规则

可执行文件路径
源码位置规则
示例
/system/bin/ frameworks/native/cmds/

 或 system/core/
/system/bin/surfaceflinger

 → frameworks/native/services/surfaceflinger/
/vendor/bin/ hardware/qcom/

 或厂商私有代码
/vendor/bin/audio.primary

 → hardware/qcom/audio/
/system/xbin/ system/extras/ /system/xbin/su

 → system/extras/su/
/product/bin/ device/[厂商]/[型号]/ /product/bin/vendor_app

 → device/google/redfin/

方法2:通过Android.bp/Android.mk查找

搜索命令

# 在AOSP根目录搜索编译模块
cd /path/to/AOSP
grep -r "surfaceflinger" --include="*.bp" --include="*.mk" | head -10

# 输出示例:
# frameworks/native/services/surfaceflinger/Android.bp:cc_binary {
# frameworks/native/services/surfaceflinger/Android.bp:    name: "surfaceflinger",

2.3 实际案例:定位SurfaceFlinger源码

案例:分析SurfaceFlinger进程

步骤1:找到进程和可执行文件

# 在设备上查找进程
adb shell ps -A | grep surfaceflinger

# 输出:
# system    1234  1     1234567 45678  fg  Sg  1000 1000 1000 1000 /system/bin/surfaceflinger

# 确认可执行文件路径
adb shell ls -l /proc/1234/exe

# 输出:
# /proc/1234/exe -> /system/bin/surfaceflinger

步骤2:在AOSP中搜索源码位置

# 进入AOSP源码目录
cd /path/to/AOSP

# 搜索surfaceflinger相关的编译文件
find . -name "Android.bp" -exec grep -l "surfaceflinger" {} \;

# 输出:
# frameworks/native/services/surfaceflinger/Android.bp

步骤3:查看编译配置确认

# 查看Android.bp内容
cat frameworks/native/services/surfaceflinger/Android.bp

# 关键内容:
# cc_binary {
#     name: "surfaceflinger",
#     srcs: [
#         "SurfaceFlinger.cpp",
#         "Client.cpp",
#         "Layer.cpp",
#         ...
#     ],
#     shared_libs: [
#         "libui",
#         "libgui",
#         "libbinder",
#         ...
#     ],
# }

# 查看源码目录结构
ls -la frameworks/native/services/surfaceflinger/

# 输出:
# Android.bp
# Android.mk
# SurfaceFlinger.cpp
# Client.cpp
# Layer.cpp
# DisplayHardware/
# RenderEngine/
# ...

步骤4:验证源码对应关系

# 查看编译生成的可执行文件名
grep -A 5 "name:" frameworks/native/services/surfaceflinger/Android.bp | head -6

# 输出:
# name: "surfaceflinger",

# 确认安装路径
grep -r "surfaceflinger" system/core/rootdir/ | grep -E "init|rc"

# 输出:
# service surfaceflinger /system/bin/surfaceflinger

结论/system/bin/surfaceflinger 的源码位置是 frameworks/native/services/surfaceflinger/

2.4 常见Native进程源码映射表

进程名
可执行文件
源码位置
主要功能
init
/system/bin/init system/core/init/
系统初始化
servicemanager
/system/bin/servicemanager frameworks/native/cmds/servicemanager/
服务管理器
surfaceflinger
/system/bin/surfaceflinger frameworks/native/services/surfaceflinger/
显示合成器
mediaserver
/system/bin/mediaserver frameworks/av/media/mediaserver/
媒体服务
installd
/system/bin/installd frameworks/native/cmds/installd/
安装守护进程
vold
/system/bin/vold system/vold/
存储管理
netd
/system/bin/netd system/netd/
网络管理
zygote
/system/bin/app_process frameworks/base/cmds/app_process/
应用进程孵化
adbd
/system/bin/adbd system/core/adb/
ADB守护进程
bootanimation
/system/bin/bootanimation frameworks/base/cmds/bootanimation/
开机动画

三、APK进程源码定位

3.1 基本定位流程

步骤1:识别包名(com.xxx.xxx)
    ↓
步骤2:查找APK安装位置
    ↓
步骤3:根据APK名或包名推断源码位置
    ↓
步骤4:通过AndroidManifest.xml验证
    ↓
步骤5:查看Android.bp确认编译配置

3.2 定位方法详解

方法1:通过包名到源码的映射

系统应用常见映射规则

包名
源码位置规则
示例
com.android.* packages/apps/ com.android.settings

 → packages/apps/Settings/
com.android.systemui frameworks/base/packages/SystemUI/
com.android.launcher* packages/apps/Launcher3/
com.android.phone packages/services/Telephony/
android.process.media packages/providers/MediaProvider/

3.3 实际案例:定位系统设置应用

案例:分析Settings应用

步骤1:识别应用进程

# 在设备上查找设置应用
adb shell ps -A | grep "settings"

# 输出:
# u0_a100   4567  1234  4567890 67890  fg  Sg  1000 1000 1000 1000 com.android.settings

# 获取包名信息
adb shell dumpsys package com.android.settings | grep -E "codePath|versionName"

# 输出:
# versionCode=34 Android 14
# versionName=14
# codePath=/system/priv-app/Settings/Settings.apk

步骤2:在AOSP中搜索源码

cd /path/to/AOSP

# 搜索Settings相关目录
find packages/apps -name "*[Ss]etting*" -type d

# 输出:
# packages/apps/Settings/
# packages/apps/Settings/src/com/android/settings/

# 查看目录结构
ls -la packages/apps/Settings/

# 输出:
# AndroidManifest.xml
# Android.bp
# Android.mk
# res/
# src/
# ...

# 查看编译配置
cat packages/apps/Settings/Android.bp

# 关键内容:
# android_app {
#     name: "Settings",
#     platform_apis: true,
#     certificate: "platform",
#     privileged: true,
#     ...
# }

# 验证包名
grep "package=" packages/apps/Settings/AndroidManifest.xml

# 输出:
# package="com.android.settings"

3.4 常见APK进程源码映射表

包名
源码位置
APK路径
主要功能
com.android.settings
packages/apps/Settings/ /system/priv-app/Settings/
系统设置
com.android.systemui
frameworks/base/packages/SystemUI/ /system/priv-app/SystemUI/
系统界面
com.android.launcher3
packages/apps/Launcher3/ /system/priv-app/Launcher3/
启动器
com.android.phone
packages/services/Telephony/ /system/priv-app/TeleService/
电话应用
com.android.mms
packages/apps/Messaging/ /system/app/Messaging/
短信应用
com.android.contacts
packages/apps/Contacts/ /system/priv-app/Contacts/
联系人
com.android.calendar
packages/apps/Calendar/ /system/app/Calendar/
日历
com.android.camera2
packages/apps/Camera2/ /system/priv-app/Camera2/
相机
com.android.gallery3d
packages/apps/Gallery2/ /system/app/Gallery2/
图库

总结和最佳实践

四、总结快速方法

获取进程名
    ↓
进程名是包名(com.xxx, org.xxx)?
    ├─ 是 → APK进程
    │   ├─ 查找常见映射表 → 知名对应源码路径
    │   ├─ dumpsys package 包名获取apk名字,知道Android.bp中的名字
    │   ├─ 搜索apk名字在Android.bp/Android.mk → frameworks/ , packages/等或者全局搜索
    │   ├─ 验证Android.bp → 确认编译配置
    │   └─ 检查源码结构 → 确认对应关系
    │
    └─ 否 → Native进程
        ├─ 查找可执行文件路径 ,ps -A获取进程id → adb shell ls -l /proc/进程id/exe得到bin文件名字
        ├─ 搜索bin文件名字在Android.bp/Android.mk → frameworks/ , system/,device/,vendor等或者全局搜索
        └─ 验证编译配置 → 确认对应关系

更多vip免费系统开发经典大厂面试题库获取,课程优惠购买成为vip学员进入vip群,积极讨论各种行业难点痛点疑难问题,答疑服务等。

请联系马哥微信:

目前所有专题课程如下:
1、经典fw的入门到精通实战八件套专题
详细课表:
Android Framework开发rom实战合集课表/车载车机手机高级系统开发工程必会技能