如何在 Android 系统中添加一个 Java 层的系统服务

120 阅读2分钟

这篇文章通俗易懂地讲解了如何在 Android 系统中添加一个 Java 层的系统服务。整个过程就像在餐厅里新建一个服务窗口,让其他顾客(App)可以点单。我分四个关键点为您讲解:

  1. ​定义菜单(AIDL接口)​
    就像餐厅要设计菜单一样,我们用 AIDL 文件定义服务接口。这个文件:
  • 包含两个"菜品"(方法):sayhello() 和 sayhello_to()
  • 会被自动生成 Java 代码(就像把菜单印刷成册)
  • 需要放在系统源码的特定目录(frameworks/base/core/java)
  1. ​创建服务窗口(服务端实现)​
    我们继承生成的 Stub 类实现具体服务:
  • 就像厨房根据菜单做菜
  • 记录服务调用次数(cnt1/cnt2 计数器)
  • 通过 Log 打印服务日志(类似餐厅的出餐记录)
  1. ​开业准备(系统集成)​
    要让服务在开机时自动启动:
  • 在系统启动流程(SystemServer)添加服务注册
  • 类似在餐厅开业时把新窗口加入营业列表
  • 需要配置 SELinux 权限(相当于办理卫生许可证)
  • 添加接口白名单(让其他 App 能看见这个窗口)
  1. ​顾客点单(客户端调用)​
    系统 App 通过三步调用服务:
java
Copy
// 1. 找到服务窗口
IJavaHelloService service = IJavaHelloService.Stub.asInterface(
    ServiceManager.getService("JavaHelloService"));

// 2. 下单(调用方法) 
service.sayhello();

// 3. 获取返回结果(如sayhello_to()返回的计数)
int count = service.sayhello_to("Alice");

整个过程通过 Binder 机制实现跨进程通信,就像:

  • 顾客(App)和服务员(Binder 驱动)传递点菜单
  • 厨房(服务端)处理请求后通过服务员返回菜品

这样的设计让系统服务可以:
✓ 开机自启动
✓ 被多个 App 共享使用
✓ 保证安全隔离(通过 SELinux 和权限控制)
✓ 方便后续功能扩展(修改 AIDL 即可)