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" />