麦子学院·Android HAL编程实战-实现自己的HAL和探索Android底层开发视频教程

71 阅读4分钟

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底层开发,开发者可以:

  1. 深入理解系统运行机制
  2. 定制ROM满足特殊需求
  3. 优化系统性能问题
  4. 开发系统级功能扩展

推荐学习路径

  1. 从AOSP源码编译开始
  2. 重点研究Binder/Handler/Looper机制
  3. 深入WindowManager/ActivityManager
  4. 实践HAL层开发与内核定制

关键调试技巧

  • 使用adb shell dumpsys获取系统状态
  • 通过logcat -b all查看完整日志
  • 利用systrace分析性能瓶颈
  • 自定义sepolicy解决权限问题