android 系统中的服务可以分为两种
1.Android Java Service,主要存在于 SystemServer 程序中,主要通过AIDL语言来定义以及实现,如PhoneInterfaceManager.
2.Android Native Service, 主要存在于 系统程序(如mediaserver)或者自定义的程序中。如 CameraService,AudioFlinger等。
Java 服务和 Native Service 在添加时,最终会调用 service_manager.c 中的do_add_service,在这个方法中,它会检查添加服务的程序的uid,如果uid 是0或者 AID_SYSTEM ,那么检查结束。
int svc_can_register(unsigned uid, uint16_t *name)
{
unsigned n;
if ((uid == 0) || (uid == AID_SYSTEM))
return 1;
for (n = 0; n < sizeof(allowed) / sizeof(allowed[0]); n++)
if ((uid == allowed[n].uid) && str16eq(name, allowed[n].name))
return 1;
return 0;
}
一般情况下,Java Service 服务的添加都不会有问题,他们是通过 SystemServer 程序来添加的,SystemServer的uid 就是 AID_SYSTEM.如果你自定义的Native Service
你就需要修改 allowed 数组的内容,不然你的服务是无法添加成功的。
static struct {
unsigned uid;
const char *name;
} allowed[] = {
{ AID_MEDIA, "media.audio_flinger" },
{ AID_MEDIA, "media.player" },
{ AID_MEDIA, "media.camera" },
{ AID_MEDIA, "media.gestures" },
{ AID_MEDIA, "media.audio_policy" },
{ AID_MEDIA, "media.tvservice.TvService" },
{ AID_DRM, "drm.drmManager" },
{ AID_NFC, "nfc" },
{ AID_RADIO, "radio.phone" },
{ AID_RADIO, "radio.sms" },
{ AID_RADIO, "radio.phonesubinfo" },
{ AID_RADIO, "radio.simphonebook" },
/* TODO: remove after phone services are updated: */
{ AID_RADIO, "phone" },
{ AID_RADIO, "sip" },
{ AID_RADIO, "isms" },
{ AID_RADIO, "iphonesubinfo" },
{ AID_RADIO, "simphonebook" },
{ AID_RADIO, "phone_msim" },
{ AID_RADIO, "simphonebook_msim" },
{ AID_RADIO, "iphonesubinfo_msim" },
{ AID_RADIO, "isms_msim" },
// 在phone 应用中注册一个叫videophone 的native service
{ AID_RADIO, "videophone" },
{ AID_MEDIA, "common_time.clock" },
{ AID_MEDIA, "common_time.config" },
};
1.Android Java Service,主要存在于 SystemServer 程序中,主要通过AIDL语言来定义以及实现,如PhoneInterfaceManager.
2.Android Native Service, 主要存在于 系统程序(如mediaserver)或者自定义的程序中。如 CameraService,AudioFlinger等。
Java 服务和 Native Service 在添加时,最终会调用 service_manager.c 中的do_add_service,在这个方法中,它会检查添加服务的程序的uid,如果uid 是0或者 AID_SYSTEM ,那么检查结束。
int svc_can_register(unsigned uid, uint16_t *name)
{
unsigned n;
if ((uid == 0) || (uid == AID_SYSTEM))
return 1;
for (n = 0; n < sizeof(allowed) / sizeof(allowed[0]); n++)
if ((uid == allowed[n].uid) && str16eq(name, allowed[n].name))
return 1;
return 0;
}
一般情况下,Java Service 服务的添加都不会有问题,他们是通过 SystemServer 程序来添加的,SystemServer的uid 就是 AID_SYSTEM.如果你自定义的Native Service
你就需要修改 allowed 数组的内容,不然你的服务是无法添加成功的。
static struct {
unsigned uid;
const char *name;
} allowed[] = {
{ AID_MEDIA, "media.audio_flinger" },
{ AID_MEDIA, "media.player" },
{ AID_MEDIA, "media.camera" },
{ AID_MEDIA, "media.gestures" },
{ AID_MEDIA, "media.audio_policy" },
{ AID_MEDIA, "media.tvservice.TvService" },
{ AID_DRM, "drm.drmManager" },
{ AID_NFC, "nfc" },
{ AID_RADIO, "radio.phone" },
{ AID_RADIO, "radio.sms" },
{ AID_RADIO, "radio.phonesubinfo" },
{ AID_RADIO, "radio.simphonebook" },
/* TODO: remove after phone services are updated: */
{ AID_RADIO, "phone" },
{ AID_RADIO, "sip" },
{ AID_RADIO, "isms" },
{ AID_RADIO, "iphonesubinfo" },
{ AID_RADIO, "simphonebook" },
{ AID_RADIO, "phone_msim" },
{ AID_RADIO, "simphonebook_msim" },
{ AID_RADIO, "iphonesubinfo_msim" },
{ AID_RADIO, "isms_msim" },
// 在phone 应用中注册一个叫videophone 的native service
{ AID_RADIO, "videophone" },
{ AID_MEDIA, "common_time.clock" },
{ AID_MEDIA, "common_time.config" },
};