Android Framework底层开发深度解析:从系统架构到内核定制
一、Android系统架构全景
1. 分层架构与核心组件
Android系统架构:
┌───────────────────────┐
│ Applications │
├───────────────────────┤
│ Java API Framework │
├───────────────────────┤
│ Native Libraries │
│ Android Runtime │
├───────────────────────┤
│ Hardware Abstraction │
├───────────────────────┤
│ Linux Kernel │
└───────────────────────┘
2. 核心进程启动流程
// system/core/init/init.cpp 主入口
int main(int argc, char** argv) {
// 1. 初始化内核日志
klog_init();
// 2. 挂载基础文件系统
mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
// 3. 启动关键守护进程
property_init();
signal_handler_init();
// 4. 解析init.rc
LoadBootScripts();
// 5. 进入主循环
while (true) {
epoll_wait(...);
handle_control_message();
}
}
二、Binder IPC机制剖析
1. Binder驱动核心调用
// kernel/drivers/android/binder.c
static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {
switch (cmd) {
case BINDER_WRITE_READ:
ret = binder_ioctl_write_read(filp, cmd, arg, thread);
break;
case BINDER_SET_CONTEXT_MGR:
ret = binder_ioctl_set_ctx_mgr(filp);
break;
// 其他命令处理...
}
return ret;
}
2. 服务注册流程(AIDL实现)
// 服务端实现
public class MyService extends IMyService.Stub {
@Override
public int getPid() {
return Process.myPid();
}
}
// 注册系统服务
public static void addService() {
ServiceManager.addService("my_service", new MyService());
}
// 客户端调用
IMyService myService = IMyService.Stub.asInterface(
ServiceManager.getService("my_service"));
int pid = myService.getPid();
三、Zygote进程孵化机制
1. Zygote启动流程
// frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
public static void main(String argv[]) {
// 1. 注册socket
ZygoteServer zygoteServer = new ZygoteServer();
// 2. 预加载资源
preloadClasses();
preloadResources();
// 3. 进入循环等待请求
zygoteServer.runSelectLoop();
// 4. 关闭socket
zygoteServer.closeServerSocket();
}
2. 应用进程创建流程
// frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
static pid_t ForkAndSpecializeCommon(...) {
pid_t pid = fork(); // 关键fork调用
if (pid == 0) { // 子进程
// 设置进程名
set_process_name(nice_name);
// 挂载存储空间
MountEmulatedStorage(uid, ...);
// 设置SELinux安全上下文
SetUpSeLinux(se_info, nice_name);
}
return pid;
}
四、WindowManagerService架构
1. 窗口添加流程
// frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java
public int addWindow(Session session, IWindow client, ...) {
// 1. 创建WindowToken
WindowToken token = getWindowToken(attrs.token);
// 2. 创建WindowState
WindowState win = new WindowState(this, session, client, token, ...);
// 3. 添加到窗口树
mWindowMap.put(client.asBinder(), win);
token.addWindow(win);
// 4. 执行布局
performLayoutAndPlaceSurfacesLocked();
return res;
}
2. SurfaceFinger交互
// frameworks/native/libs/gui/SurfaceComposerClient.cpp
status_t SurfaceComposerClient::createSurface(
const String8& name, uint32_t w, uint32_t h, PixelFormat format) {
// 通过Binder调用SurfaceFlinger
sp<ISurfaceComposer> sm(getComposerService());
sp<IBinder> handle = sm->createSurface(name, w, h, format);
// 创建SurfaceControl
sp<SurfaceControl> surface = new SurfaceControl(this, handle, ...);
return surface;
}
五、Input事件分发系统
1. InputReader原始事件处理
// frameworks/native/services/inputflinger/InputReader.cpp
void InputReader::loopOnce() {
// 1. 从设备读取原始事件
size_t count = mEventHub->getEvents(timeoutMillis, mEventBuffer, EVENT_BUFFER_SIZE);
// 2. 处理事件
for (const RawEvent* rawEvent = mEventBuffer; count--; rawEvent++) {
processEventsForDeviceLocked(rawEvent->deviceId, rawEvent);
}
// 3. 分发到InputDispatcher
mQueuedListener->flush();
}
2. 事件分发流程
// frameworks/base/services/core/java/com/android/server/input/InputManagerService.java
private int injectInputEventInternal(InputEvent event, int mode) {
// 转换为原生事件
NativeInputEvent nativeEvent = convertToNative(event);
// 通过JNI调用Native层
return nativeInjectInputEvent(
mPtr, nativeEvent, deviceId, displayId, mode);
}
六、ART虚拟机深度优化
1. JIT编译流程
// art/runtime/jit/jit_compiler.cc
void JitCompiler::CompileMethod(Thread* self, ArtMethod* method) {
// 1. 生成HIR中间表示
HGraph* graph = builder.BuildGraph();
// 2. 优化处理
RunOptimizations(graph);
// 3. 生成机器码
codegen->Compile(graph);
// 4. 安装编译结果
method->SetEntryPointFromQuickCompiledCode(code);
}
2. GC算法调优
// art/runtime/gc/collector/garbage_collector.cc
void GarbageCollector::Run() {
// 1. 暂停所有线程
ThreadList* thread_list = runtime->GetThreadList();
thread_list->SuspendAll();
// 2. 标记可达对象
MarkReachableObjects();
// 3. 清理阶段
if (IsConcurrent()) {
ReclaimConcurrent();
} else {
ReclaimSticky();
}
// 4. 恢复线程
thread_list->ResumeAll();
}
七、HAL层开发实战
1. 自定义HIDL服务
// hardware/interfaces/myservice/1.0/IMyService.hal
interface IMyService {
getVersion() generates (string version);
setValue(int32_t val) generates (bool success);
};
// 实现类
struct MyService : public IMyService {
Return<void> getVersion(getVersion_cb _hidl_cb) override {
_hidl_cb("1.0.0");
return Void();
}
};
2. 内核驱动交互
// 字符设备驱动示例
static long my_ioctl(struct file *file, unsigned int cmd, unsigned long arg) {
switch (cmd) {
case MY_GET_VALUE:
put_user(global_value, (int __user *)arg);
break;
case MY_SET_VALUE:
global_value = get_user(arg);
break;
}
return 0;
}
// HAL层调用
int hal_get_value() {
int fd = open("/dev/mydev", O_RDWR);
int val;
ioctl(fd, MY_GET_VALUE, &val);
close(fd);
return val;
}
八、系统性能调优
1. 启动时间优化
# 分析启动时间
adb shell su root am start -S -W com.example.app/.MainActivity
# 跟踪系统调用
adb shell atrace -z -b 4096 ssync sched freq idle am wm gfx view
# 优化建议
1. 延迟初始化非关键服务
2. 并行化Init.rc任务
3. 优化zygote预加载
2. 内存泄漏检测
// 使用Android Profiler API
Debug.dumpHprofData("/data/local/tmp/heapdump.hprof");
// 分析工具链
1. MAT (Memory Analyzer Tool)
2. Perfetto
3. LeakCanary
// 常见泄漏场景
- 静态集合持有Activity引用
- 未注销的广播接收器
- Handler内存泄漏
通过系统学习Android Framework底层开发,开发者可以:
- 深入理解系统运行机制
- 定制ROM满足特殊需求
- 优化系统性能问题
- 开发系统级功能扩展
推荐学习路径:
- 从AOSP源码编译开始
- 重点研究Binder/Handler/Looper机制
- 深入WindowManager/ActivityManager
- 实践HAL层开发与内核定制
关键调试技巧:
- 使用
adb shell dumpsys获取系统状态 - 通过
logcat -b all查看完整日志 - 利用
systrace分析性能瓶颈 - 自定义
sepolicy解决权限问题