android目录权限深入分析
平台:FSL imx android 2.3.7
现象:
# ls -l /mnt/sdcard
drwxrwxr-x system sdcard_rw 2000-01-01 01:40 LOST.DIR
drwxrwxr-x system sdcard_rw 2000-01-01 03:21 Android
# ls -l /data/data/
安装未签名的某apk:
drwxr-x--x app_34 app_34 com.xxx.noplatform
安装签名的某apk:
drwxr-x--x system system com.xxx.platform
# ls -l /data/data/com.xxx.noplatform
drwxr-xr-x system system 2000-01-01 00:00 lib
一. 分析在sdcard上新增的目录或文件的用户组、权限是如何设置上的
1. sdcard 挂载归Vold管理
=> system/vold/Volume.cpp 中Volume::mountVol()
代码:
if (Fat::doMount(devicePath, getMountpoint(), false, false, false, 1000,1015,0002, true)) {
SLOGE("%s failed to mount via VFAT (%s)\n", devicePath, strerror(errno));
continue;
}
2. 查看文件system/vold/Fat.cpp 中Fat::doMount()
接口:
int Fat::doMount(const char *fsPath, const char *mountPoint,bool ro, bool remount, bool executable,
int ownerUid, int ownerGid, int permMask, bool createLost);
故1000是uid,1015是gid,0002是permMask(即775,对应上drwxrwxr-x)
3.查看文件 system/core/include/private/android_filesystem_config.h
#define AID_SYSTEM 1000 /* system server */
#define AID_SDCARD_RW 1015 /* external storage write access */
#define AID_APP 10000 /* first app user */
即对应上uid=system gid=sdcard_rw
4.当apk在AndroidManifest.xml中申请“android.permission.WRITE_EXTERNAL_STORAGE”
查看文件frameworks/base/data/etc/platform.xml,其中定义:
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
<group gid="sdcard_rw" />
</permission>
故当apk申请WRITE_EXTERNAL_STORAGE权限后,用户组即变为sdcard_rw,
在sdcard上权限即为7(rwx),可读写操作
二.apk安装后的用户组和权限,同时分析安装过程
当非签名的apk安装完后,在/data/system/packages.xml中,会加入
<package name="com.xxx.noplatform" codePath="/data/app/com.xxx.noplatform.apk" nativeLibraryPath="/data/data/com.xxx.noplatform/lib" flags="0" ft="dc6b8ddb80" it="dc6ad239f8" ut="dc6b8de262" version="1" userId="10034">
可以看到分配的uid是10034 = 10000+34 = AID_APP+34,即app_34
代码:
frameworks/base/services/java/com/android/server/PackageManagerService.java 为负责安装apk的service
在PackageManagerService构造函数中
1)注册了几个AppDirObserver,一旦/vendor/app,/system/app,/system/framework,/data/app,/data/app-private发生ADD/REMOVE事件,就进行相应的处理
2)mSettings = new Settings(); Settings是个内部类。处理packages.xml,packages.list的相关动作
3)mInstaller = new Installer(); com.android.server.Installer负责进行实际的install、dexopt、remove等动作。
Installer通过socket和一个natvie的installd deamon程序进行通信,将操作指令传递给installd,实际由installd完成功能。
installd代码目录:frameworks/base/cmds/installd//
在installd的install()接口中,调用
mkdir(pkgdir, 0751);即对应上 drwxr-x--x
chown(pkgdir, uid, gid);即对应上 uid=app_34和gid=app_34
mkdir(libdir, 0755);即对应上 drwxr-xr-x
chown(libdir, AID_SYSTEM, AID_SYSTEM);即对应上 uid=system和gid=system
- 1楼zmyde20103天前 13:52
- 好文,居然没人顶,顶一个!
