101人参与 • 2025-08-20 • Android
今天导师给我将讲了一些如何新建一个系统服务,以及如何去初始化。
在 android 系统中,systemserver 是系统服务的核心进程,负责启动和管理各种系统服务。以下是 systemserver 中服务创建和启动的详细方式:
systemserver 是 android 系统启动过程中的关键组件,它运行在 system_server 进程中,负责启动和管理所有核心系统服务。
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();
}// 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);
// 更多引导服务...
}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);
// 更多核心服务...
}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);
}
// 更多其他服务...
}这是推荐的方式,适用于继承自 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) {
// 启动完成后的操作
}
}
}对于不继承 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);某些服务有静态的 main() 方法:
// 服务类中的静态方法
public static yourservice main(context context) {
yourservice service = new yourservice(context);
servicemanager.addservice(context.your_service, service);
return service;
}
// 在 systemserver 中调用
yourservice.main(msystemcontext);系统服务可以在不同的启动阶段执行初始化:
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) {
// 系统启动完成后的操作
}
}
}private void systemready() {
// 通知所有服务系统已就绪
mactivitymanagerservice.systemready(() -> {
// 系统就绪后的操作
}, boot_timings_trace_log);
}以下是在 systemserver 中添加自定义服务的完整示例:
// frameworks/base/core/java/android/app/imycustomservice.aidl
package android.app;
interface imycustomservice {
void dosomething(int param);
int getsomething();
}// 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; // 示例返回值
}
}// 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);
}
// ...
}
}// frameworks/base/core/java/android/content/context.java
public abstract class context {
// ...
public static final string my_custom_service = "my_custom_service";
// ...
}使用 dumpsys 命令检查服务状态:
adb shell dumpsys my_custom_service
查看服务列表:
adb shell service list
检查系统日志:
adb logcat -s systemserver
通过以上方式,你可以在 android systemserver 中成功创建和启动自定义系统服务。
到此这篇关于android systemserver 中 service 的创建和启动流程的文章就介绍到这了,更多相关android systemserver service创建启动内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论