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 的權限。
Android应用程序的`AndroidManifest.xml`文件中,添加权限是为了让应用能够访问系统或第三方API的功能,如网络、摄像头、GPS等。这是Android安全模型的一部分,开发者需要明确声明他们的应用需要哪些权限。以下是添加权限的基本步骤: 1. 打开`AndroidManifest.xml`文件,通常位于项目的根目录下。 2. 在`<manifest>`标签内,找到`<uses-permission>`或`<permission-sdk>`(适用于Android O及以上版本)元素。如果你的应用需要某个特定权限,比如读取联系人列表,会在这个区域添加: ```xml <uses-permission android:name="android.permission.READ_CONTACTS" /> ``` 这里的`android:name`属性指定权限的名称,例如`READ_PHONE_STATE`、`INTERNET`等。 3. 对于需要运行时请求的权限(如Android M引入的动态权限),在`<application>`标签内添加`<requestPermission>`元素,并在相应的活动上使用`ActivityCompat.requestPermissions()`函数动态请求: ```xml <uses-permission android:name="android.permission.CAMERA" android:maxSdkVersion="28" /> <!-- ... --> <activity> <intent-filter> <!-- ... --> <action android:name="android.hardware.camera.action.MAIN" /> <category android:name="android.intent.category.LENS" /> </intent-filter> <!-- 使用 <meta-data> 标签请求权限 --> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".CameraActivity" /> </activity> ``` 4. 确保在用户授权前处理权限请求,如果用户拒绝,则应用可能无法正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值