android索引权限深入分析

android目录权限深入分析平台:FSL imx android 2.3.7现象:# ls -l /mnt/sdcarddrwxrwxr-x systemsdcard_rw

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
好文,居然没人顶,顶一个!