Xcode 基础工程结构解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode 基础工程结构解析相关的知识,希望对你有一定的参考价值。

参考技术A Xcode 基础概念
这里只讨论单project,不讨论多project间引用

Xcode Project是构建一个或多个软件产品所需的所有文件,资源和信息的存储库。项目包含用于构建产品的所有元素,并维护这些元素之间的关系。它包含一个或多个Target,用于指定如何构建产品。项目为项目中的所有Target定义默认的构建设置(每个Target也可以指定自己的构建设置,这些设置将覆盖项目的构建设置)。

Target指定要构建的product,并包含构建product的配置信息。Target定义单个product;it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product。项目可以包含一个或多个Target,每个Target产生一个product。

构建产品的配置信息采用build settings和build phase的形式,您可以在Xcode项目编辑器中进行检查和编辑。Target会继承project build setting,但是您可以通过在Target级别指定不同的设置来覆盖任何project setting。一次只能有一个活动Target。 Xcode scheme指定了活动Target。

Xcode scheme 定义了要构建的Target的集合,构建时要使用的配置以及要执行的测试的集合。

您可以根据需要设置多个scheme,但一次只能激活一个。 您可以指定scheme是否应存储在Project中(在这种情况下,它可以在包含该Project的每个工作区中使用,也可以在工作区中使用),在这种情况下,它仅在该工作区中可用。 选择活动scheme时,还将选择运行Target(即,为其构建产品的硬件的体系结构)。

构建设置是一个配置,其中包含有关应如何执行产品构建过程的特定方面的信息。例如,构建设置中的信息可以指定Xcode传递给编译器的选项。

xocde 工程文件夹,包含了,单project时,使用它就可以了

worksapce是将项目和其他文档分组的Xcode文档,因此您可以一起处理它们。worksapce可以包含任意数量的Xcode项目,以及您想要包含的任何其他文件。除了组织每个Xcode项目中的所有文件之外,worksapce还提供了包含的项目及其目标之间的隐式和显式关系。

cocoapods 工程的方案就是生成Pods 工程,与默认工程产生依赖关系

project.pbxproj 的大致结构

文件的引用由 PBXBuildFile 中属性 fileRef 指向 PBXFileReference,它有一个path属性标明文件路径,但需要注意的是这里的 path 显示的路径可能不是项目目录下的全路径,只是显示文件名,要得到文件全路径,需要使用 PBXFileReference 的 UUID 索引到 PBXGroup、PBXReferenceProxy等中一层层递归向上搜索路径来拼接成全路径。

objects 的键值对根据内容类型被分成了若干个 section,采用注释的方式分节也使得可读性更强。section 的数量跟工程有关,尤其是每个工程的 BuildPhase 和 Target 差别都很大,section 列表就是上图中objects后的分支结构,显示在 Xcode 中能看见所有的公共配置信息都存在于 project.pbxproj 中。主要包含跟文件相关的 BuildFile,Group 和 FileReference,跟编译相关的 BuildPhase 和 Build Configuration(List),以及一些列 Target 和 TargetDependency等。

https://developer.apple.com/library/archive/featuredarticles/XcodeConcepts/Concept-Schemes.html
https://developer.apple.com/library/archive/navigation/
https://segmentfault.com/a/1190000017278975
http://www.tomorjm.com/xcodeproj-1/

Unity 基础 之 目录结构解析

Unity 基础 之 目录结构解析

一,Unity的资源数据加载

Resources

  • 打包集成到.asset文件里面及引用的资源as后se一个文件里面面
  • 主线程加载
  • 想要动态更新资源则不考虑

AssetBundle

  • unity定义的二进制文件类型
  • 用WWW类下载

StreamingAssets

  • 可读不可写
  • 内容限制 - 无
  • 只能用WWW类下载

PersistentDataPath

  • 可读可写
  • 内容限制 - 无
  • 清除手机缓存文件会一并清理这里的东西
  • 随意弄,可作为本地目录让WWW下载、也可以自己用FileInfo乱整

Resources的序列化

  当项目被构建时,所有名为Resources的文件夹中的所有Asset和Object都会合并到同一个序列化文件中。这个序列化文件中还含有元数据(Metadata)和索引(Indexing)信息,类似于AssetBundle。正如AssetBundle文档中所描述的那样,这个索引中包含了一个用于将给定Object名称转换为恰当的File GUID和Local ID的序列化查找树,同时它也用于定位在序列化文件中偏移了指定字节数的Object。

在大多数平台上,用于查找的数据结构是平衡查找树,其时间复杂度为O(nlog(n))。因此,索引加载时间随Resources文件夹内Object数量而增长的速度高于线性增长。

Resource、StreamingAsset文件夹安装后的路径(Android,iOS)

StreamingAsset

  • iOS : Application.dataPath + /Raw
  • Android : jar:file:// + Application.dataPath + !/assets/

Resources

  • 打包成一个Asset文件

二,Unity的Android和IOS上相关的目录结构

Android:

  • assets 游戏内容相关的都在这里了
  • lib JNI相关的东西
  • META-INF Java包跟rar包的区别
  • res 图标之类的
  • AndroidManifest.xml Android配置文件
  • classes.dex Java虚拟机runtime的东西
  • resources.arsc Java编译后的二进制文件

IOS:

  • level0/level1… Scene
  • sharedassets0/shaedassets1/… Scene相关的东西
  • Managed 脚本编译后的dll
  • resources.assets Resources里面的东西
  • Raw StreamingAssets里面的东西

三,常用目录对应的Android,iOS平台地址

IOS:

  • Application.dataPath : Application/xxxxx/xxx.app/Data
  • Application.streamingAssetsPath : Application/xxxxx/xxx.app/Data/Raw
  • Application.persistentDataPath : Application/xxxxx/Documents
  • Application.temporaryCachePath : Application/xxxxx/Library/Caches

Android:

  • Application.dataPath : /data/app/xxx.xxx.xxx.apk
  • Application.streamingAssetsPath : jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
  • Application.persistentDataPath : /data/data/xxx.xxx.xxx/files
  • Application.temporaryCachePath : /data/data/xxx.xxx.xxx/cache

以上是关于Xcode 基础工程结构解析的主要内容,如果未能解决你的问题,请参考以下文章

go项目标准化工程结构解析

Visual Studio的工程结构解析

「Unity」与iOSAndroid平台的整合:1导出的Xcode工程

canal 源码解析系列-工程结构说明

FBReader工程结构解析

SwiftUI之深入解析如何创建和组合视图