平臺: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


From:CSDN

 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()