背景
早上收到台湾学员疑问,具体疑问如下:
因为是繁体,这里总结一下他的问题:
简单说在系统开发中,看到了进程不知道去哪里找这个进程对应的源码。
比如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等或者全局搜索
└─ 验证编译配置 → 确认对应关系
原文地址:
[https://mp.weixin.qq.com/s/mA-CZBOkpFyi9kF6J2FXNw](https://mp.weixin.qq.com/s/mA-CZBOkpFyi9kF6J2FXNw)
1386



被折叠的 条评论
为什么被折叠?



