SharedUserId 与 Android自定义Permission

本文深入探讨了Android应用中文件访问权限管理,重点解释了SharedUserId的概念、权限组设置及如何通过权限组实现底层文件访问。文章还详细阐述了为何系统级应用不能访问SD卡,以及如何通过权限配置解决底层文件访问问题。

Android给每个APK进程分配一个单独的用户空间,其manifest中的UserId就是对应一个Linux用户

sharedUser id
通过sharedUserId,拥有同一个User Id的多个APK可以配置成运行在同一个进程中.所以默认就是
可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的
数据库和文件.就像访问本程序的数据一样.

SharedUserId有很多需要注意的地方,如果Application的SharedUserId为System.则Application是不能访问SD卡的。为什么会有这样的限制呢?因为卸载SD卡的必要条件是没有进程访问SD卡的资源文件。因此卸载SD卡的时候会杀掉访问SD卡上资源文件的进程。如果Application使用SharedUserId为System,就会连系统一起杀掉。这样的设计是不被允许的。

如果我们给底层文件设置了权限(驱动文件如/dev/sensors),有需要上层应用来访问底层文件,可以通过给系统添加权限的方式来解决。比如我们在init.rc中设置/dev/sensors设置的权限为0660,对应owner和group分别为system和media,我们可以在frameworks/base/core/res目录下的AndroidManifest.xml中添加新的permission如下

<permission android:name="android.permission.USE_SENSORS"
        android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
        android:protectionLevel="dangerous"
        android:label="@string/permlab_useSensors"
        android:description="@string/permdesc_useSensors" />
 

然后在frameworks/base/data/etc目录下的platform.xml中设置使用此权限可以获取media group的权限。

<permission name="android.permission.USE_SENSORS" >
        <group gid="media" />
    </permission>

最后,我们只需要在Application中的AndroidManifest.xml中使用此permission就访问/dev/sensors了。

<uses-permission android:name="android.permission.USE_SENSORS" />

转载于:https://my.oschina.net/shaorongjie/blog/99283

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.isa.navi" android:sharedUserId="android.uid.system" android:versionCode="1" android:versionName="V0.9.0_20250621"> <!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />--> <!-- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />--> <!-- <uses-permission android:name="android.permission.INTERNET" />--> <!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />--> <!-- <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />--> <!-- <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />--> <!-- <uses-permission android:name="android.permission.USB_PERMISSION"/>--> <!-- <uses-permission android:name="android.permission.WAKE_LOCK" />--> <!-- <uses-permission android:name="android.permission.READ_PHONE_STATE" />--> <!-- <uses-permission android:name="android.permission.ACCESS_MAP_ISA"/>--> <application android:name="com.isa.navi.ui.ISANaviApplication" android:allowBackup="false" android:label="ISA-NaviService" android:supportsRtl="true" android:networkSecurityConfig="@xml/network_security_config" android:taskAffinity="" android:persistent="true" > <!-- android:debuggable="true" --> <service android:name="com.isa.navi.service.ISANaviService" android:directBootAware="true" android:exported="false"> <!-- android:permission="com.isa.permission.ACCESS"--> <!-- >--> <intent-filter> <action android:name="com.isa.intent.action.ISA_NAVI" /> <action android:name="com.isa.intent.action.ISA_NAVI_DEBUG" /> <action android:name="com.isa.intent.action.ISA_CARPLAY" /> </intent-filter> </service> <receiver android:name="com.isa.navi.BootCompleteReceive" android:directBootAware="true" android:exported="false" > <!-- 开机广播 --> <!-- <intent-filter>--> <!-- <action android:name="android.intent.action.BOOT_COMPLETED" />--> <!-- </intent-filter>--> <intent-filter android:priority="2147483647"> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver> <!-- <activity android:name=".ui.MainActivity">--> <!-- <intent-filter>--> <!-- <action android:name="android.intent.action.MAIN" />--> <!-- <category android:name="android.intent.category.LAUNCHER" />--> <!-- </intent-filter>--> <!-- </activity>--> <receiver android:name=".receiver.USBReceiver" android:exported="false"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.BOOT_COMPLETED"/> <action android:name="android.intent.action.MEDIA_MOUNTED"/> <action android:name="android.intent.action.MEDIA_UNMOUNTED" /> <action android:name="android.intent.action.MEDIA_REMOVED"/> <data android:scheme="file"></data> </intent-filter> </receiver> </application> </manifest> 这个xml是什么
最新发布
07-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值