缘由
有一个系统,需要我们的解决方案,但是却没有提供BSP的源码。
我们的方案有一个So文件,并在其中有注册service,但是启动后发现service并没有注册成功,查询log发现是:
<span style="font-family:Microsoft YaHei;font-size:18px;">E/ServiceManager﹕ add_service('XXXX',0x48) uid=YYY - PERMISSION DENIED</span>
看起来是我们不具备权限,然后确定了一下SElinux的状态,发现是没有开启的,而servicemanager对添加service的权限的检查是位于其代码中的。
关于ServiceManager是如何检查权限的可以参考一下stackoverflow中的答案,或者自己看看servicemanager的源码。
参考的链接为这个,从这里面我们可以得知权限的检查写死在了对应的source code中(Android 4.4),暂时没有配置文件,这个和SeLinux不一样。
判断逻辑
ServiceManager的判断逻辑为:
- 1. uid判断是否为system
- 2. 是否在可信任的表格中
如果两个都不是,那么就认为没有权限,然后打印出前面的话来。这个对应的代码为:
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;
}
另外这个allowed的数组为:
/* TODO:
* These should come from a config file or perhaps be
* based on some namespace rules of some sort (media
* uid can register media.*, etc)
*/
static struct {
unsigned uid;
const char *name;
} allowed[] = {
{ AID_MEDIA, "media.audio_flinger" },
{ AID_MEDIA, "media.log" },
{ AID_MEDIA, "media.player" },
{ AID_MEDIA, "media.camera" },
{ AID_MEDIA, "media.audio_policy" },
{ AID_DRM,