ServiceManager 會去檢查應用程式的權限;Android 作業系統會根據 UID 做權限管制,這裡所講的 UID 就是 Linux 系統管理面所討論的 User ID,即使用者 ID。在 [frmeworks/base/cmds/servicemanager/service_manager.c] 裡,找到這段實作:


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;    re

int do_add_service(struct binder_state *bs,                   uint16_t *s, unsigned len,                   void *ptr, unsigned uid, int allow_isolated){    struct svcinfo *si;    //ALOGI("add_service('%s',%p,%s) uid=%d\n", str8(s), ptr,    //        allow_isolated ? "allow_isolated" : "!allow_isolated", uid);    if (!ptr || (len == 0) || (len > 127))        return -1;   <span style="color:#FF0000;"> if (!svc_can_register(uid, s)) {</span>        ALOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED\n",             str8(s), ptr, uid);        return -1;    }    si = find_svc(s, len);    if (si) {        if (si->ptr) {            ALOGE("add_service('%s',%p) uid=%d - ALREADY REGISTERED, OVERRIDE\n",                 str8(s), ptr, uid);            svcinfo_death(bs, si);        }        si->ptr = ptr;    } else {        si = malloc(sizeof(*si) + (len + 1) * sizeof(uint16_t));


也就是:當應用程式的 UID 不是 1000 時,是沒有權限新增 Android Service 的。所以,在 AndroidManifest.xml 裡加上 android:sharedUserId 屬性的目的在於此:將應用程式的 UID 定義為 android.uid.system 即 1000,程式即可具備新增 Android Service 的權限

更多相关文章

  1. Android(安卓)Studio创建Xposed Module项目的正确姿势。
  2. Android之工具通用的Adapter
  3. adb 指令
  4. ubuntu10.04 java6
  5. android中获取项目的版本信息
  6. Android(安卓)Studio 3.3.X 导入项目的正确姿势
  7. android studio 将一个android项目当做另外一个android项目的lib
  8. Android下使用C++ 的NDK範例
  9. 可用手势切换播放节目的android视频播放器

随机推荐

  1. 支付宝即时到账接口开发 - DEMO讲解与源
  2. 3.16 部署vCenter Server Appliance理论
  3. 十、正则表达式
  4. IntelliJ IDEA 激活码2021,激活码2020 永
  5. 跨域配置相关选项
  6. Golang笔记之基本组成元素
  7. 作业2-html注册页面和课程表
  8. 初识初学表单
  9. 前后端Date类型装换
  10. 图片上传