台湾学员疑问:如何通过进程名映射出对应源码路径?
背景
早上收到台湾学员疑问,具体疑问如下:
因为是繁体,这里总结一下他的问题: 简单说在系统开发中,看到了进程不知道去哪里找这个进程对应的源码。
比如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进程源码映射表
|
|
|
|
|
|---|---|---|---|
|
|
/system/bin/init |
system/core/init/ |
|
|
|
/system/bin/servicemanager |
frameworks/native/cmds/servicemanager/ |
|
|
|
/system/bin/surfaceflinger |
frameworks/native/services/surfaceflinger/ |
|
|
|
/system/bin/mediaserver |
frameworks/av/media/mediaserver/ |
|
|
|
/system/bin/installd |
frameworks/native/cmds/installd/ |
|
|
|
/system/bin/vold |
system/vold/ |
|
|
|
/system/bin/netd |
system/netd/ |
|
|
|
/system/bin/app_process |
frameworks/base/cmds/app_process/ |
|
|
|
/system/bin/adbd |
system/core/adb/ |
|
|
|
/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进程源码映射表
|
|
|
|
|
|---|---|---|---|
|
|
packages/apps/Settings/ |
/system/priv-app/Settings/ |
|
|
|
frameworks/base/packages/SystemUI/ |
/system/priv-app/SystemUI/ |
|
|
|
packages/apps/Launcher3/ |
/system/priv-app/Launcher3/ |
|
|
|
packages/services/Telephony/ |
/system/priv-app/TeleService/ |
|
|
|
packages/apps/Messaging/ |
/system/app/Messaging/ |
|
|
|
packages/apps/Contacts/ |
/system/priv-app/Contacts/ |
|
|
|
packages/apps/Calendar/ |
/system/app/Calendar/ |
|
|
|
packages/apps/Camera2/ |
/system/priv-app/Camera2/ |
|
|
|
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群,积极讨论各种行业难点痛点疑难问题,答疑服务等。
请联系马哥微信:

夜雨聆风