平臺: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
全站熱搜
留言列表