$(SRCROOT)什么意思

本文详细解释了在Xcode中如何使用(SRCROOT)来指定工程目录下的路径,例如配置预编译头文件(pch)时的具体操作方法。

(SRCROOT)xcode(SRCROOT)表示定位到工程的目录下。比如在配置pch文件的时候,添加路径的时候一般这样添加:“$(SRCROOT)/工程名/pch文件名”这里写图片描述
my job这个工程为例,$(SRCROOT)表示定位到Desktop下的my job目录。

Build input files cannot be found: '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerAuthPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Controller/TPMultiPreviewControllerReselectCategory.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerVolumePresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Controller/TPMultiPreviewControllerPreconnectCategory.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiCollectionPresenterGestureCategory.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Controller/TPMultiPreviewController.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiCollectionPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerSnapshotPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/View/TPMultiPlayerPageView.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiPlayerToolPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiPlayerPreviewPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Controller/TPMultiPreviewControllerOrientationCategory.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Interactor/TPMultiPreviewInteractor.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/View/TPMultiNavigationBarView.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerRelayTimeoutPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerAlarmPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiMediaSpeakerPrenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMediaPlayerMobileDataPresenter.swift', '/Users/macong/VIGI/SurveillanceApp/iOS/SurveillanceHome/SurveillanceHome/SurveillanceHome/Sources/Sections/Preview/MultiPreview/Presenter/TPMultiMediaCloudControlPresenter.swift'. Did you forget to declare these files as outputs of any script phases or custom build rules which produce them? 这报错什么意思
最新发布
12-09
<think>嗯,用户问的是iOS启动优化中的二进制重排原理。我之前已经回答过关于iOS启动流程的问题,现在用户可能是在深入优化启动时间,特别是对pre-main阶段的优化感兴趣。二进制重排属于启动优化中的高级技巧,可能用户已经了解了基本优化措施,现在想进一步减少加载时间。 首先,我需要回忆二进制重排的具体原理。这个技术主要是通过重新排列二进制文件中的函数顺序,来利用局部性原理,减少缺页中断(Page Fault)的次数。因为iOS系统加载Mach-O文件时是按页加载的,如果启动时需要的函数分散在不同页,就会增加加载的页数,导致时间增加。重排后,把启动阶段用到的函数集中放在前面的页,可以减少所需的页数,从而减少缺页次数,加快启动速度。 接下来,用户可能想知道具体如何实现,比如Clang插桩或者基于LLVM的工具。我需要解释清楚这两个步骤:检测函数调用顺序和重新排列二进制。同时,可能涉及到的技术细节,比如.order文件的生成,链接器参数的使用。这里需要注意用户可能对Mach-O文件结构、虚拟内存分页机制不太熟悉,需要用比较易懂的语言解释。 另外,用户可能会关心实际效果和注意事项,比如对包大小的影响,是否适用于Swift,以及如何验证优化效果。需要提到使用Instrument的System Trace工具来检查Page Fault次数,或者使用Apple提供的官方方案App Launch Metrics。 还需要注意潜在的问题,比如动态调用的函数可能无法被静态分析检测到,导致优化不彻底。这时候可能需要结合运行时数据,比如通过Clang插桩收集调用顺序,再进行重排。同时,Swift因为函数名修饰的问题,可能需要额外的处理,或者依赖Apple的改进。 最后,确保回答结构清晰,分点说明原理、实现步骤、注意事项,并且给出示例,比如链接器参数的设置。避免使用过于专业的术语,或者在必要时进行解释,确保用户能够理解。</think>iOS启动优化中的**二进制重排(Binary Rearrangement)**是提升冷启动速度的关键技术,其核心原理是通过**调整函数在二进制文件中的物理排列顺序**,减少启动阶段触发的**缺页中断(Page Fault)**次数。以下是具体原理解析: --- ### 一、底层机制 #### 1. 内存加载单位 - iOS使用**4KB内存页**作为加载单位(实际是16KB物理页+4KB虚拟页) - Mach-O文件被加载时,系统按需加载所需内存页 #### 2. 缺页中断成本 ```mermaid graph LR A[访问未加载页] --> B[触发Page Fault] --> C[磁盘I/O加载页] --> D[20~100μs延迟] ``` - 冷启动时约产生**1000-2000次**Page Fault - 传统排列方式导致**非连续页访问** --- ### 二、重排原理 #### 1. 局部性原理优化 - **目标**:将启动阶段高频使用的函数集中到**连续内存页** - **效果**:使前N个内存页包含80%以上的启动代码 #### 2. 技术实现步骤 ```mermaid sequenceDiagram participant A as 检测调用顺序 participant B as 生成.order文件 participant C as 链接时重排 A->>B: 通过插桩/静态分析获取函数调用链 B->>C: 指定-objc_reorder_sections C->>Mach-O: 按.order文件顺序排列符号 ``` --- ### 三、关键技术细节 #### 1. 函数调用检测 - **Clang插桩**:通过`-fsanitize-coverage=func,trace-pc-guard`注入监控代码 - **静态分析**:分析`__TEXT,__text`段的符号引用关系 #### 2. 链接器控制 ```makefile # Xcode链接器参数 LD_GENERATE_MAP_FILE = YES LD_MAP_FILE_PATH = $(TEMP_DIR)/LinkMap.txt LD_ORDER_FILE = $(SRCROOT)/app.order ``` #### 3. 典型.order文件结构 ``` # 启动关键路径函数 -[AppDelegate application:didFinishLaunchingWithOptions:] _main __swift_FORCE_LOAD$_swiftCompatibility56 ___llvm_profile_runtime ``` --- ### 四、实际效果对比 | 指标 | 优化前 | 优化后 | 提升幅度 | |---------------|------------|------------|---------| | Page Fault次数 | 1500次 | 800次 | 46%↓ | | 冷启动耗时 | 2.1s | 1.6s | 23%↓ | | 首帧渲染 | 1.4s | 1.0s | 28%↓ | --- ### 五、注意事项 1. **Swift兼容性**: - Swift函数名经过修饰(需解析`swift-demangle`) - Swift5.3+支持`@_optimize(none)`防止函数被内联 2. **动态调用问题**: - Objective-C消息发送(objc_msgSend)无法静态分析 - Block/函数指针调用需要特殊处理 3. **验证方式**: ```shell # 查看符号排列 nm -m YourApp.app/YourApp | grep __TEXT,__text # 检查Page Fault Instruments -> System Trace -> Virtual Memory Events ``` --- ### 六、进阶方案 1. **基于PGO的优化**: - 收集线上用户真实启动路径 - 通过`llvm-profdata merge`生成优化配置 2. **Apple官方方案**: - 使用Xcode14+的`App Launch Metrics` - 结合MetricKit实现动态调整 ```swift // 示例:Swift函数标记 @_optimize(none) func criticalStartupFunction() { // 必须保留的启动代码 } ``` 这种优化需要平衡可维护性,建议在包体积超过20MB或启动耗时超过1.5秒时采用。实际项目中,配合`Instruments`的`Virtual Memory Trace`工具可直观看到内存页访问热力图。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值