今天导师给我将讲了一些如何新建一个系统服务,以及如何去初始化。
android systemserver 中 service 的创建和启动方式
在 android 系统中,systemserver 是系统服务的核心进程,负责启动和管理各种系统服务。以下是 systemserver 中服务创建和启动的详细方式:
1. systemserver 概述
systemserver 是 android 系统启动过程中的关键组件,它运行在 system_server 进程中,负责启动和管理所有核心系统服务。
2. 服务启动流程
2.1 主要启动阶段
systemserver 的服务启动分为几个主要阶段:
// frameworks/base/services/java/com/android/server/systemserver.java
private void run() {
// 1. 启动引导服务 (bootstrap services)
startbootstrapservices();
// 2. 启动核心服务 (core services)
startcoreservices();
// 3. 启动其他服务 (other services)
startotherservices();
// 4. 系统就绪后的回调
startsystemui(context);
systemready();
}2.2 引导服务启动
// frameworks/base/services/java/com/android/server/systemserver.java
private void startbootstrapservices() {
// 启动 activitymanagerservice
mactivitymanagerservice = activitymanagerservice.lifecycle.startservice(
msystemservicemanager, atm);
mactivitymanagerservice.setsystemprocess();
// 启动 powermanagerservice
mpowermanagerservice = msystemservicemanager.startservice(powermanagerservice.class);
// 启动 packagemanagerservice
mpackagemanagerservice = packagemanagerservice.main(msystemcontext, installer,
mfactorytestmode != factorytest.factory_test_off, monlycore);
// 更多引导服务...
}2.3 核心服务启动
private void startcoreservices() {
// 启动 batteryservice
msystemservicemanager.startservice(batteryservice.class);
// 启动 usagestatsservice
msystemservicemanager.startservice(usagestatsservice.class);
mactivitymanagerservice.setusagestatsmanager(
localservices.getservice(usagestatsmanagerinternal.class));
// 启动 webviewupdateservice
mwebviewupdateservice = msystemservicemanager.startservice(webviewupdateservice.class);
// 更多核心服务...
}2.4 其他服务启动
private void startotherservices() {
// 启动 windowmanagerservice
wm = windowmanagerservice.main(context, inputmanager, !mfirstboot, monlycore,
new phonewindowmanager(), mactivitymanagerservice.mactivitytaskmanager);
servicemanager.addservice(context.window_service, wm, /* allowisolated= */ false);
servicemanager.addservice(context.input_service, inputmanager);
// 启动 notificationmanagerservice
msystemservicemanager.startservice(notificationmanagerservice.class);
// 启动自定义服务(如你的 mdm 服务)
try {
tracebeginandslog("startmdmpolicymanager");
mdmpolicymanager = new mdmpolicymanagerservice(context);
servicemanager.addservice(context.mdm_policy_service, mdmpolicymanager);
traceend();
} catch (throwable e) {
reportwtf("starting mdm policy manager", e);
}
// 更多其他服务...
}3. 服务创建方式
3.1 使用 systemservicemanager 启动
这是推荐的方式,适用于继承自 systemservice 的服务:
// 在 systemserver 中
msystemservicemanager.startservice(yourservice.class);
// 服务类定义
public class yourservice extends systemservice {
public yourservice(context context) {
super(context);
}
@override
public void onstart() {
// 服务启动逻辑
publishbinderservice(context.your_service, new yourbinder());
}
@override
public void onbootphase(int phase) {
if (phase == systemservice.phase_boot_completed) {
// 启动完成后的操作
}
}
}3.2 直接实例化并注册
对于不继承 systemservice 的服务:
// 创建服务实例
yourservice yourservice = new yourservice(context);
// 添加到 servicemanager
servicemanager.addservice(context.your_service, yourservice);
// 或者使用带权限的添加方式
servicemanager.addservice(context.your_service, yourservice,
false, servicemanager.dump_flag_priority_default);3.3 使用静态 main 方法
某些服务有静态的 main() 方法:
// 服务类中的静态方法
public static yourservice main(context context) {
yourservice service = new yourservice(context);
servicemanager.addservice(context.your_service, service);
return service;
}
// 在 systemserver 中调用
yourservice.main(msystemcontext);4. 服务生命周期管理
4.1 启动阶段(boot phases)
系统服务可以在不同的启动阶段执行初始化:
public class yourservice extends systemservice {
// ...
@override
public void onbootphase(int phase) {
if (phase == phase_third_party_apps_can_start) {
// 第三方应用可以启动时的初始化
} else if (phase == phase_boot_completed) {
// 系统启动完成后的操作
}
}
}4.2 系统就绪回调
private void systemready() {
// 通知所有服务系统已就绪
mactivitymanagerservice.systemready(() -> {
// 系统就绪后的操作
}, boot_timings_trace_log);
}5. 自定义服务示例
以下是在 systemserver 中添加自定义服务的完整示例:
5.1 服务接口定义 (aidl)
// frameworks/base/core/java/android/app/imycustomservice.aidl
package android.app;
interface imycustomservice {
void dosomething(int param);
int getsomething();
}5.2 服务实现
// frameworks/base/services/core/java/com/android/server/mycustomservice.java
package com.android.server;
import android.app.imycustomservice;
import android.content.context;
import android.os.ibinder;
import android.util.slog;
public class mycustomservice extends imycustomservice.stub {
private static final string tag = "mycustomservice";
private final context mcontext;
public mycustomservice(context context) {
mcontext = context;
slog.i(tag, "mycustomservice created");
}
@override
public void dosomething(int param) {
slog.d(tag, "dosomething called with param: " + param);
// 实现具体功能
}
@override
public int getsomething() {
slog.d(tag, "getsomething called");
return 42; // 示例返回值
}
}5.3 在 systemserver 中启动服务
// frameworks/base/services/java/com/android/server/systemserver.java
public final class systemserver {
// ...
private void startotherservices() {
// ...
// 启动自定义服务
try {
tracebeginandslog("startmycustomservice");
mycustomservice mycustomservice = new mycustomservice(context);
servicemanager.addservice(context.my_custom_service, mycustomservice);
traceend();
} catch (throwable e) {
reportwtf("starting my custom service", e);
}
// ...
}
}5.4 在 context 中定义服务常量
// frameworks/base/core/java/android/content/context.java
public abstract class context {
// ...
public static final string my_custom_service = "my_custom_service";
// ...
}6. 注意事项
- 启动顺序:服务的启动顺序很重要,依赖其他服务的服务应该在依赖服务之后启动
- 异常处理:使用 try-catch 块捕获服务启动过程中的异常
- 性能考虑:避免在服务启动过程中执行耗时操作
- 权限控制:确保服务有适当的权限检查
- 进程间通信:如果服务需要跨进程访问,确保正确实现 binder 接口
7. 调试技巧
使用 dumpsys 命令检查服务状态:
adb shell dumpsys my_custom_service
查看服务列表:
adb shell service list
检查系统日志:
adb logcat -s systemserver
通过以上方式,你可以在 android systemserver 中成功创建和启动自定义系统服务。
到此这篇关于android systemserver 中 service 的创建和启动流程的文章就介绍到这了,更多相关android systemserver service创建启动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论