作者 | Alexandre Colucci
译者 | 弯月
出品 | CSDN(ID:CSDNnews)

iOS 15 已经发布几个月了,在本文中,我们来分析一下 iOS 15 的内置应用,看看 iOS 15 中有多少个二进制文件?每个应用都是用什么语言开发的?有多少应用是用 Swift 编写的?苹果有没有在内置应用中使用 SwiftUI?

方法论

本文使用的工具和方法论在之前的文章中介绍过。如果你有兴趣,可以参考以下两篇文章:
https://blog.timac.org/2020/1019-evolution-of-the-programming-languages-from-iphone-os-to-ios-14/
https://blog.timac.org/2016/1101-apples-use-of-swift-in-ios-10-1-and-macos-10-12/

在讨论细节之前,首先澄清几个点:

我只分析了通常意义上的“iOS”,即内核之上的一切。XNU内核和底层固件(SecureROM、Baseband等)不在本文的讨论范围内。但是,我包含了 dyld 共享缓存中的框架,这是 iPhone OS 3.1 引入的一个机制。

开发人员可以在同一个二进制文件中混合使用多种编程语言。举个例子,我开发的 Clatters 就使用了Swift、SwiftUI、Objective-C 和 C,因为我们希望使用最适合的编程语言解决每个问题。本文判断应用使用了 Swift 的标准为:至少包含了一行 Swift 代码。

你会看到本文多次提及Objective-C 和 C++ ,但却没有提到Objective-C++。这是因为本文使用的方法并不能检测出使用 Objective-C++ 编译的二进制文件,这种文件可能同时使用了 Objective-C 和 C++。
最后,本文的分析只是个人的看法。尽管我相信大方向是正确的,但由于我没有 iOS 的源代码,分析结果不一定准确,所以方法也有局限性。

iOS15 中 Swift 和 SwiftUI 的使用情况

可能很多人很感兴趣 iOS 15 中 Swift 和SwiftUI 的使用情况。下面我们就来一起看看吧。
iOS15 中共计有 114 个二进制文件使用了 SwiftUI,几乎是 iOS 14 的三倍。相应地,iOS 15 中至少包含一行 Swift 代码的二进制文件也是 iOS 14 的两倍:

可见,苹果一直在内置应用中逐步采用 Swift。今年 SwiftUI 的采用率也呈现大幅度增长。iOS 15 中使用了 SwiftUI 的知名应用包括:

  • 图书
  • 地图
  • 便笺
  • 天气
  • 音乐
  • 提示
  • 播客
  • FaceTime通话(InCallService)
  • 设置
    下面这些新应用也使用了 SwiftUI:
  • 翻译
  • 快捷方式
  • 电话
  • AirPods连接对话框(SharingViewService)
  • 锁屏界面(SleepLockScreen)
    其他使用了 SwiftUI 的二进制文件基本上都是小窗体或新的框架。下面是使用了 SwiftUI 的114个二进制文件:
/Applications/AppSettings.app/AppSettings
/Applications/AppStore.app/PlugIns/AppStoreWidgetsExtension.appex/AppStoreWidgetsExtension
/Applications/FamilyControlsAuthenticationUI.app/FamilyControlsAuthenticationUI
/Applications/FindMy.app/PlugIns/FindMyWidgetIntentsItems.appex/FindMyWidgetIntentsItems
/Applications/FindMy.app/PlugIns/FindMyWidgetIntentsPeople.appex/FindMyWidgetIntentsPeople
/Applications/FindMy.app/PlugIns/FindMyWidgetItems.appex/FindMyWidgetItems
/Applications/FindMy.app/PlugIns/FindMyWidgetPeople.appex/FindMyWidgetPeople
/Applications/FTMInternal-4.app/FTMInternal-4
/Applications/GameCenterWidgets.app/PlugIns/GCWidgets.appex/GCWidgets
/Applications/InCallService.app/InCallService
/Applications/PeopleViewService.app/PlugIns/PeopleWidget_iOSExtension.appex/PeopleWidget_iOSExtension
/Applications/SleepWidgetContainer.app/PlugIns/SleepWidgetExtension.appex/SleepWidgetExtension
/private/var/staged_system_apps/Books.app/Books
/private/var/staged_system_apps/Maps.app/Maps
/private/var/staged_system_apps/MobileMail.app/PlugIns/MailWidgetExtension.appex/MailWidgetExtension
/private/var/staged_system_apps/MobileNotes.app/MobileNotes
/private/var/staged_system_apps/MobileNotes.app/PlugIns/com.apple.mobilenotes.SharingExtension.appex/com.apple.mobilenotes.SharingExtension
/private/var/staged_system_apps/Music.app/Frameworks/MusicApplication.framework/MusicApplication
/private/var/staged_system_apps/Podcasts.app/Frameworks/PodcastsStoreUI.framework/PodcastsStoreUI
/private/var/staged_system_apps/Shortcuts.app/PlugIns/QuickLookExtension.appex/QuickLookExtension
/private/var/staged_system_apps/Tips.app/Tips
/private/var/staged_system_apps/Weather.app/Weather
/System/Library/Assistant/UIPlugins/SiriFindMyUIPlugin.siriUIBundle/SiriFindMyUIPlugin
/System/Library/Frameworks/_CoreLocationUI_SwiftUI.framework/_CoreLocationUI_SwiftUI
/System/Library/Frameworks/_MusicKit_SwiftUI.framework/_MusicKit_SwiftUI
/System/Library/Frameworks/FamilyControls.framework/FamilyControls
/System/Library/Frameworks/FamilyControls.framework/PlugIns/ActivityPickerExtension.appex/ActivityPickerExtension
/System/Library/Health/FeedItemPlugins/Heart.healthplugin/Heart
/System/Library/Health/FeedItemPlugins/Highlights.healthplugin/Highlights
/System/Library/Health/FeedItemPlugins/MenstrualCyclesAppPlugin.healthplugin/MenstrualCyclesAppPlugin
/System/Library/Health/FeedItemPlugins/SleepHealthAppPlugin.healthplugin/SleepHealthAppPlugin
/System/Library/Health/FeedItemPlugins/Summaries.healthplugin/Summaries
/System/Library/PreferenceBundles/BatteryUsageUI.bundle/BatteryUsageUI
/System/Library/PreferenceBundles/CoreRoutineSettings.bundle/CoreRoutineSettings
/System/Library/PreferenceBundles/FocusSettings.bundle/FocusSettings
/System/Library/PrivateFrameworks/AccessibilitySharedUISupport.framework/AccessibilitySharedUISupport
/System/Library/PrivateFrameworks/ActionKitUI.framework/ActionKitUI
/System/Library/PrivateFrameworks/CommandAndControlUI.framework/CommandAndControlUI
/System/Library/PrivateFrameworks/CoreChartSwift.framework/CoreChartSwift
/System/Library/PrivateFrameworks/CoreSuggestionsUI.framework/CoreSuggestionsUI
/System/Library/PrivateFrameworks/FocusSettingsUI.framework/FocusSettingsUI
/System/Library/PrivateFrameworks/FocusUI.framework/FocusUI
/System/Library/PrivateFrameworks/HealthExperienceUI.framework/HealthExperienceUI
/System/Library/PrivateFrameworks/HealthRecordsUI.framework/HealthRecordsUI
/System/Library/PrivateFrameworks/HealthVisualization.framework/HealthVisualization
/System/Library/PrivateFrameworks/HearingUI.framework/HearingUI
/System/Library/PrivateFrameworks/MediaFoundation.framework/MediaFoundation
/System/Library/PrivateFrameworks/MessagesSupport.framework/MessagesSupport
/System/Library/PrivateFrameworks/MLKit.framework/MLKit
/System/Library/PrivateFrameworks/MLKit.framework/PlugIns/com.apple.MLKit.MLModelPreview.appex/com.apple.MLKit.MLModelPreview
/System/Library/PrivateFrameworks/MLKit.framework/PlugIns/com.apple.MLKit.MLPackagePreview.appex/com.apple.MLKit.MLPackagePreview
/System/Library/PrivateFrameworks/NotesUI.framework/NotesUI
/System/Library/PrivateFrameworks/PaymentUI.framework/PaymentUI
/System/Library/PrivateFrameworks/PeopleUI.framework/PeopleUI
/System/Library/PrivateFrameworks/PreviewsInjection.framework/PreviewsInjection
/System/Library/PrivateFrameworks/PreviewsMessaging.framework/PreviewsMessaging
/System/Library/PrivateFrameworks/ScreenTimeUICore.framework/ScreenTimeUICore
/System/Library/PrivateFrameworks/SleepHealthUI.framework/SleepHealthUI
/System/Library/PrivateFrameworks/SleepWidgetUI.framework/SleepWidgetUI
/System/Library/PrivateFrameworks/SnippetUI.framework/SnippetUI
/System/Library/PrivateFrameworks/TipKit.framework/TipKit
/System/Library/PrivateFrameworks/TranslationUI.framework/TranslationUI
/System/Library/PrivateFrameworks/TranslationUIServices.framework/PlugIns/TranslationUIService.appex/TranslationUIService
/System/Library/PrivateFrameworks/VideosUI.framework/VideosUI
/System/Library/PrivateFrameworks/WeatherUI.framework/WeatherUI
/System/Library/PrivateFrameworks/WorkflowUI.framework/WorkflowUI
/System/Library/Snippets/UIPlugins/AudioUIPlugin.bundle/AudioUIPlugin
/System/Library/Snippets/UIPlugins/SiriVideoUIPlugin.bundle/SiriVideoUIPlugin
/System/Library/Snippets/UIPlugins/SystemPlugin.bundle/SystemPlugin
/usr/lib/swift/libswiftExtensionKit.dylib
/usr/libexec/proximitycontrold

​二进制文件总数

iOS15 中有多少个二进制文件?iOS 15 有 4738 个二进制文件,比 iOS 14 多了565个, iOS14 有 4173个。

编程语言的变化

在分析了 iPhone OS 1.0 到 iOS 15 的所有主要版本后,我们可以看到IOS 使用的编程语言的发展历程。同样,注意这里同一个二进制文件可能被统计多次,因此本图中的二进制文件总数多于上面:

在 iOS 15 的所有二进制文件中,

  • 89%使用了Objective-C
  • 17%使用了 C++
  • 13%使用了 Swift
  • 8%完全使用 C编写
  • 2%使用了SwiftUI

从这些数据可以得出什么结论?

  • Objective-C 依然是 iOS 的核心,短时间内不会消失。
  • 苹果采用 Swift的进度大大加快了。去年,Swift 超过了 C,今年已经接近 C++。
  • SwiftUI 几乎接近于零,但今年苹果似乎在更广的范围内采用了 SwiftUI,包括旗舰应用。
  • C++ 和 C 依然扮演了重要角色。这些语言通常被涉及到音频、视频、电话、Web的应用和其他底层框架采用。

下图展示了每种编程语言的发展:

原始数据

如果想进一步分析,则可以去原文网站上下载从 iPhone OS 1.0 到 iOS 15.0 的所有主要版本的原始数据:https://blog.timac.org/2021/1219-state-of-swift-and-swiftui-ios15/

结论

即使我们没有 iOS 的源代码,也可以确定 iOS 中应用程序使用的语言,进而统计 iPhone OS 1.0到 iOS 15 编程语言的发展情况。

可以看出,苹果在持续采用 Swift:iOS 15 中采用Swift 的内置应用是 iOS 14 的两倍。现在大约有13% 的二进制文件使用了 Swift。此外,从今年开始,有几款旗舰应用也开始使用 SwiftUI 了。
如前所述,这种方法有明显的局限性,尽管我相信大方向是正确的,但无法保证结果百分之百准确。

参考链接:

  • https://blog.timac.org/2021/1219-state-of-swift-and-swiftui-ios15/

Objective-C依然占C位,Swift和SwiftUI在iOS 15中的使用情况相关推荐

  1. iOS 15 中的 Swift 和 SwiftUI

    iOS 15 包含 114 个使用 SwiftUI 的二进制文件,几乎是 iOS 14 的 3 倍.同样,包含至少一行 Swift 代码的二进制文件的数量在 iOS 14 和 iOS 15 之间多了差 ...

  2. int在64位操作系统中占多少位?

    仍然是32位. 曾经是这样的:16位操作系统中,int 占16位:在32位操作系统中,int 占32位.但是现在人们已经习惯了 int 占32位,因此在64位操作系统中,int 仍为32位.64位整型 ...

  3. java占32位存储空间时,java空间

    手机评站网今天精心准备的是<java空间>,下面是详解! java用户定义数组空间代码 packagechen;//整数从大到小排序importjava.util.*;publicclas ...

  4. short类型占16位,可以赋给short类型的最大值32767,最小值为-32768

    short类型占16位,可以赋给short类型的最大值32767,最小值为-32768 最大值0111111111111111 = 32767 最小值1000000000000000 = -32768

  5. 设某机为定长指令字结构,指令长度12位,每个地址码占3位,试提出一种分配方案……

    2022年12月13日修改 原来的博客是 2018-09-21 17:34:47 发布 的啊,偶尔也有人让详细讲讲--行吧-- 题目: 设某机为定长指令字结构,指令长度12位,每个地址码占3位,试提出 ...

  6. java是几位的unicode,下列说法错误的是()。A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种...

    下列说法错误的是().A.Java的字符类型采用的是Unicode编码,每个Unicode码占16位比特B.Java的各种 更多相关问题 [名词解释] 捐躯juān qū [名词解释] 藕断丝连ǒu ...

  7. 在C语言中各种数据类型各占多少位 C语言 中结构体的位域(位段)

    (一)32位平台: 分为有符号型与无符号型. 有符号型: short 在内存中占两个字节,范围为-2^15~(2^15-1) int 在内存中占四个字节,范围为-2^31~(2^31-1) long在 ...

  8. Python根据输入的公司编号、名称、网址,格式化输出公司信息。其中1)冒号统一为英文冒号,编号占6位,不足6位的前面补0。编号后面是制表符。

    根据输入的公司编号.名称.网址,格式化输出公司信息.其中 1)冒号统一为英文冒号,编号占6位,不足6位的前面补0.编号后面是制表符. 2)"公司名称:" 后面输出字符串占8位,左对 ...

  9. KuPlay平台:安全性对区块链游戏而言,依然是第一位

    微信公众号:酷玩区块 春风得意马蹄疾,一日看尽长安花. 说这是过去多年来中国互联网游戏厂商的真实写照不为过,然而这样春风得意的"黄金时代"却在渐行渐远.近日著名游戏人称:" ...

最新文章

  1. Spring源码分析【6】-ThreadLocal的使用和源码分析
  2. mysql 1236_Mysql主从同步Last_IO_Errno:1236错误解决方法
  3. QIIME 2用户文档. 12训练特征分类器Training feature classifiers(2018.11)
  4. Silverlight Telerik控件学习:带CheckBox复选框的树形TreeView控件
  5. CTime COleDateTime的常用操作和比较
  6. 数据库索引的作用和优点缺点以及索引的11中用法
  7. 使用vue.js devtools遇到的磕磕绊绊
  8. mysql xtrabackup备份工具使用
  9. Visual 数据绑定
  10. (急聘) 高级软件工程师(C#.Net/JS) http://job.cnblogs.com/offer/8966/
  11. fanuc机器人四边形编程_中国工控 | FANUC 机器人码垛编程详解
  12. C语言,利用一维数组选择法排序,使学生成绩高低排序(要求输入为负值时输入结束)
  13. Java JDBC工具类
  14. 【Interfacenavigation】规划多个触摸屏尺寸(57)
  15. 学习 TTreeView [12] - FullExpand、FullCollapse、GetNodeAt
  16. python基于情感词典的情感分析
  17. 彻底关闭弹出广告“FF新推荐”
  18. ArcGis软件出图时修改色带上的刻度并导出色带
  19. iPhone 计算机 桌面,变身iOS?让Windows 10的桌面和苹果一样美
  20. pwnable.kr第五题:passcode

热门文章

  1. 使用Idea添加PYTHONPATH的一种方案
  2. JS实现图片翻书效果
  3. 敏捷开发一千零一问系列之十:总体架构什么时机进行?(下)
  4. idea快速搭建spring cloud-注册中心与注册
  5. Webpack基础学习
  6. mac下安装php环境
  7. Redis Cluster部署、管理和测试
  8. 谷歌浏览器开发者工具解析
  9. c#划分目录和文件(小白的一点经验)
  10. 订阅号、服务号与企业号区别