文件系统

0. 大体目录

Application:存放系统级App

Developer:给开发者用的

Library:存放系统资源、用户设置

--Library/Logs:系统日志

--Library/Ringtones:系统铃声

--Library/LaunchDaemons:开机自启进程?

--Library/MobileSubstrate:存放着所有基于Cydia Substrate的插件

System:系统的重要组成部分

--System/Library/Carrier Bundles:运营商的一些设置

--System/Library/Frameworks:系统公开Frameworks

--System/Library/PrivateFrameworks:系统私有Frameworks

--System/Library/CoreServices/SpringBoard.app:桌面管理app

--System/Library/PreferenceBundles:系统设置App中的一些设置项

User:用户目录,实际执行”/var/mobile”

--User/Media:存放着系统相册

--User/Library:存放着短信、邮件等

bin:存放用户级的二进制文件

dev:设备文件

etc:存放系统脚本、hosts配置、SSH配置文件等,实际指向/private/etc

sbin:存放系统级二进制文件,例如reboot、mount等。

usr:用户工具和程序。

--usr/include:存放标准C头文件

--usr/lib:存放库文件

var:粗放一些经常改动的文件,包括keychains、临时文件、从App Store下载的应用

0.1 iOS10 storeApp

// 数据目录(Document & Library)
/var/mobile/Containers/Data/Application/9D304635-095C-4D17-A5A7-1FBE85654A97/Documents

/var/mobile/Containers/Data/Application/9D304635-095C-4D17-A5A7-1FBE85654A97/Library

// 应用目录(.app)
/var/containers/Bundle/Application/7D3924D3-C7B1-4D7F-B492-2CC64AC3CB62/NillApp.app

0.2 System

// 基于CydiaSubstrate的dylib

/Library/MobileSubstrate/DynamicLibraries/

// daemon

/System/Library/LaunchDaemons

/Library/LaunchDaemons

/Library/LaunchAgents

// PreferenceBundles

/System/Library/PreferenceBundles/

// 可执行文件

/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv7s

/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

0.3 Cydia

// 自动安装路径(iOS9&10 一样)
// 放在该路径下的deb包,在手机重启后,会自动安装
/var/root/Media/Cydia/AutoInstall

// iOS 9插件安装路径
// 卸载插件时,删除路径下的对应文件即可
/Library/MobileSubstrate/DynamicLibraries/


1. 文件权限

1.0 demo

lrwxr-xr-x 1 root admin 32 May 7 2016 Applications -> /var/stash/_.6ZoO3L/Applications

drwxrwxr-t 8 root admin 340 Oct 16 2015 Developer

drwxrwxr-x 17 root admin 782 Oct 26 2018 Library

drwxr-xr-x 3 root wheel 102 Oct 21 2014 System

lrwxr-xr-x 1 root admin 11 Jun 26 16:53 User -> /var/mobile

drwxr-xr-x 2 root wheel 2040 May 7 2016 bin

drwxr-xr-x 2 root wheel 68 Oct 28 2006 boot

drwxrwxr-t 2 root admin 68 Sep 13 2014 cores

dr-xr-xr-x 3 root wheel 1394 Jun 26 16:53 dev

lrwxr-xr-x 1 root admin 11 Jan 13 2015 etc -> private/etc

drwxr-xr-x 2 root wheel 68 Oct 28 2006 lib

drwxr-xr-x 2 root wheel 68 Oct 28 2006 mnt

-rwxr-xr-x 1 root admin 259504 May 7 2016 pguntether

drwxr-xr-x 4 root wheel 136 Feb 25 2015 private

drwxr-xr-x 2 root wheel 1224 Jun 25 2018 sbin

lrwxr-xr-x 1 root admin 15 Jan 13 2015 tmp -> private/var/tmp

drwxr-xr-x 9 root wheel 374 May 7 2016 usr

lrwxr-xr-x 1 root admin 11 Jan 13 2015 var -> private/var

1.1 说明

—-> 第1个字符串:10位,代表文件权限的相关说明。

第1位:表示文件的类型,“l”表示符号链接文件,“d”表示文件夹,“-”表示普通文件

第2-4位:表示文件所有者的权限

第5-7位:表示文件所属组的权限

第8-10位:表示其他人的权限

r:表示可读
w:表示可写
x:表示执行

—-> 第3个字符串:表示文件所属用户,一般为root/mobile

—-> 第4个字符串:表示文件所属组,一般为wheel/admin

1.2 权限修改

// 修改用户
chown -R mobile:mobile RIBackups/

—-> 绝对模式

// 设置用户为rwx,组为rx,其他为rx
chmod 755 testfile

—-> 符号模式

// 设置用户为删除执行,组为rx,其他增加wx
chmod u-x,g=rx,o+wx testfile

-rw------- (600) 只有所有者才有读和写的权限

-rw-r--r-- (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限

-rwx------ (700) 只有所有者才有读,写,执行的权限

-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限

-rwx--x--x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限

-rw-rw-rw- (666) 每个人都有读写的权限

-rwxrwxrwx (777) 每个人都有读写和执行的权限


2. App 相关

2.1 ipa目录 大体目录

├── META-INF

│ ├── com.apple.FixedZipMetadata.bin

│ └── com.apple.ZipMetadata.plist

├── Payload

│ └── Destiny.app

│ ├── Info.plist // 存储应用先关的设置、Bundle identifier、Executable file等

│ ├── AMap.bundle

│ ├── Frameworks // 存放的第三方Framework、Swift 动态库

│ ├── PlugIns // 当前应用使用的 Extension

│ ├── Assets.car // 资源文件

│ ├── ...

├── iTunesArtwork

└── iTunesMetadata.plist

2.2 Xcode 编译过程(图为Xcode 11.2的编译过程,字为小黄书的内容)

—> 1. 编译源文件:使用 Clang 编译项目中所有参与编译的源文件,生成目标文件

—> 2. 链接目标文件:将目标文件链接成一个可执行文件

—> 3. 复制编译资源文件:例如 storyboard 文件

—> 4. 生成 plist 文件

—> 5. 复制图片资源

—> 6. 生成 dSYM 文件

—> 7. 签名:使用Emtitlements文件对App进行签名

-> 8. 打包

2.3 通过命令生成一个 ipa 包

makefile:

CurrentDir = "$(shell pwd)"
ResourceDirecrory = AppSource
AppName = DemoApp
TmpBuildFile = $(AppName).app
ConstIBFile = Base.lproj
Architecture = arm64
CertificateName = "iPhone Development: XXXXXX (XXXXXX)"

compile:
    #0、创建BuildDemo.app文件
    @rm -r -f $(TmpBuildFile)
    @test -d $(TmpBuildFile) || mkdir $(TmpBuildFile)

    #1、Compile Objective-C file
    @#如果不用xcrun直接用clang,需要用-isysroot指定系统SDK路径,如/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk

    @xcrun -sdk iphoneos clang \
        -arch $(Architecture) \
        -mios-version-min=8.0 \
        -fmodules \
        -fobjc-arc \
        -c $(ResourceDirecrory)/AppDelegate.m \
        -o $(TmpBuildFile)/AppDelegate.o

    @xcrun -sdk iphoneos clang -arch $(Architecture) -mios-version-min=8.0 -fmodules -fobjc-arc -c $(ResourceDirecrory)/main.m -o $(TmpBuildFile)/main.o
    @xcrun -sdk iphoneos clang -arch $(Architecture) -mios-version-min=8.0 -fmodules -fobjc-arc -c $(ResourceDirecrory)/ViewController.m -o $(TmpBuildFile)/ViewController.o
    
link:
    #2、Link Object file
    @xcrun -sdk iphoneos clang \
        $(TmpBuildFile)/main.o $(TmpBuildFile)/AppDelegate.o $(TmpBuildFile)/ViewController.o \
        -arch $(Architecture) \
        -mios-version-min=8.0 \
        -fobjc-arc \
        -fmodules \
        -o $(TmpBuildFile)/$(AppName)

    @rm $(TmpBuildFile)/AppDelegate.o $(TmpBuildFile)/main.o $(TmpBuildFile)/ViewController.o

storyboard:
    #3、编译storyboard文件
    @mkdir $(TmpBuildFile)/$(ConstIBFile)

    @ibtool \
        --compilation-directory \
        $(TmpBuildFile)/$(ConstIBFile) \
        $(ResourceDirecrory)/$(ConstIBFile)/Main.storyboard

    @ibtool --compilation-directory $(TmpBuildFile)/$(ConstIBFile) $(ResourceDirecrory)/$(ConstIBFile)/LaunchScreen.storyboard

plist:
    #4、plist : App ID、name、version ...
    
    @defaults write \
        $(CurrentDir)/$(TmpBuildFile)/Info \
        CFBundleDevelopmentRegion en #国际化时优先使用的语言

    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleExecutable $(AppName)
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleIdentifier com.alonemonkey.$(AppName)
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleInfoDictionaryVersion 6.0 #plist文件结构的版本
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleName $(AppName)
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundlePackageType APPL #APPL: app,FMWK: frameworks,BND: loadable bundles
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleShortVersionString 1.0
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info CFBundleVersion 1
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info LSRequiresIPhoneOS YES
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info UIMainStoryboardFile Main
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info UILaunchStoryboardName LaunchScreen
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info MinimumOSVersion 8.0
    @defaults write $(CurrentDir)/$(TmpBuildFile)/Info DTPlatformName iphoneos

asset:
    #5、复制图片资源
    @cp -a $(ResourceDirecrory)/images/. $(TmpBuildFile)/

dsym:
    #6、生成dSYM文件
    @#使用`dwarfdump --uuid `可以查看dSYM或可执行文件的UUID,匹配成功才能完全将crash log中的16进制地址符号化
    @dsymutil \
        -arch $(Architecture) \
        $(TmpBuildFile)/$(AppName) \
        -o $(AppName).app.dSYM

codesign:
    #7、签名
    @#mobileprovision文件包含Team ID和允许安装设备的ID
    @cp -f embedded.mobileprovision $(TmpBuildFile)
    @#provision查看命令:security cms -D -i provision_file

    @codesign \
        -fs \
        $(CertificateName) \
        --entitlements entitlements.plist \
        $(TmpBuildFile)
    @#使用codesign -vv xx.app 命令查看App签名信息

package:
    #8、打包ipa
    @mkdir -p Payload
    @cp -r -f $(TmpBuildFile) Payload
    @zip -r -q $(AppName).ipa Payload
    @rm -f -r Payload/
    @rm -f -r $(TmpBuildFile)


all: compile link storyboard plist asset dsym codesign package

推荐阅读更多精彩内容

  • 硬盘是由一个个圆形的盘片组全起来的,从物理特性上看,硬盘盘片的转速越快,它的性能就越好,而且我们的磁道越靠外部,它...
    zejin阅读 207评论 0 1
  • 一个基本的计算机系统由“硬件”和“软件”组成,一台Linux设备,主要的组成如下图所示: 一般情况下,我们所说的L...
    时待吾阅读 958评论 0 14
  • 文件系统 Mac的文件系统大致可以分为两种: 符合Unix传统的目录 /bin包含基本的用户命令,可被所有用户使...
    cuzzy阅读 1,421评论 0 2
  • Filesystem Hierarchy Standard 文件系统层次化标准(以下简称FHS) FHS为类UNI...
    _Joeyoung_阅读 2,101评论 3 2
  • 中文乱码解决办法 因软件设置编码或服务器安装语言,导致显示乱码时,可按如下方式解决 界面展示乱码 image.pn...
    Lv_0阅读 111评论 0 1