1. 程式人生 > >AndroidManifest.xml中許可權問題

AndroidManifest.xml中許可權問題

最近需要利用Android internal API做一些事,在AndroidManifest.xml加上了

android:sharedUserId="android.uid.system"

但是在系統裡卻看不到我的AP,找了很久,發現還要在Android.mk裡再加上

LOCAL_CERTIFICATE := platform

這樣系統的許可權才夠。

相關的解說可參考:

http://www.wretch.cc/blog/michaeloil/23398272

以下說明copy自

http://www.jollen.org/blog/2010/02/android-uid-system.html

原來,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;
 
    return 0;
}
 
int do_add_service(struct binder_state *bs,
                   uint16_t *s, unsigned len,
                   void *ptr, unsigned uid)
{
    struct svcinfo *si;
//    LOGI("add_service('%s',%p) uid=%d\n", str8(s), ptr, uid);
 
    if (!ptr || (len == 0) || (len > 127))
        return -1;
 
    if (!svc_can_register(uid, s)) {
        LOGE("add_service('%s',%p) uid=%d - PERMISSION DENIED\n",
             str8(s), ptr, uid);
        return -1;
    }
    ...
}

AID_SYSTEM 被定義為 1000,即 system server 的 UID。從上述的實作可以瞭解,ServiceManager 會去檢查應用程式的 UID,當 UID 不符規定時,便無法執行 do_add_service()。

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