iOS 15 於 2021 年 9 月正式發布。在本文中,貓科動物分析了 iOS 15 的內置應用程序。iOS 15 中有多少個二進制文件?使用哪些編程語言來開發這些應用程序?有多少應用程序是用 Swift 編寫的?Apple 是否為使用 SwiftUI 來開發某些內置應用程序呢?
方法
創建本文的方法和工具已在作者在一些帖子中詳細介紹過。如果您有興趣,請參考:
Evolution of the programming languages from iPhone OS 1.0 to iOS 14https://blog.timac.org/2020/1019-evolution-of-the-programming-languages-from-iphone-os-to-ios-14/
Apple’s use of Swift in iOS 10.1 and macOS 10.12.https://blog.timac.org/2016/1101-apples-use-of-swift-in-ios-10-1-and-macos-10-12/
在進入細節之前,先澄清幾點:
作者只分析了通常所說的「iOS」,即內核之上的所有內容。不包括 XNU 內核和低級固件(SecureROM、基帶……)。另一方面,作者計算了位於 dyld 共享緩存中的框架,這是 iPhone OS 3.1 中引入的一種機制。
請記住,開發人員可以混合使用不同的編程語言來創建一個二進制文件。一個例子是作者開發的應用程序 Clatters,作者在其中使用 Swift、SwiftUI、Objective-C 和 C,這是用於解決每個特定問題的最合適的編程語言。在本文中,包含單行 Swift 代碼的應用程序將被視為使用 Swift。
您會看到提及 Objective-C 和 C++,但您可能會注意到沒有 Objective-C++。這裡使用的方法不能真正檢測使用 Objective-C++ 構建的二進制文件。此類二進制文件被視為同時使用了 Objective-C 和 C++。
最後,您應該對此分析持保留態度。雖然作者相信整體情況是準確的,但作者的方法有一些局限性,因為無法訪問 iOS 源代碼並且依賴於不精確的編譯工件。
iOS 15 中的 Swift 和 SwiftUI
可能最有趣的數字之一是衡量 Apple 在 iOS 15 中對 Swift 和 SwiftUI 的使用。所以讓我們從這個開始吧!
iOS 15 包含 114 個使用 SwiftUI 的二進制文件,幾乎是 iOS 14 數量的 3 倍。同樣,包含至少一行 Swift 代碼的二進制文件數量在 iOS 14 和 iOS 15 之間翻了一番:
如您所見,Apple 繼續在其內置應用程序中逐步採用 Swift。2021 年也是採用 SwiftUI 的大年。現在,一些廣泛使用的應用似乎在 iOS 15 中使用了 SwiftUI:
Books
Maps
Notes
Weather
Tips
Music
Podcasts
FaceTime? (InCallService)
AppSettings?
而在此之前使用 SwiftUI 的有 5 個應用:
Translate
Shortcuts
Phone
AirPods Connect Pop-up? (SharingViewService)
Lock Screen? (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二進制文件總數
我們可以在 iOS 15 中枚舉多少個二進制文件?iOS 15 由 4738 個二進制文件組成,高於 iOS 14 中的 4173 個。有 565 個新的二進制文件。
編程語言的演變
通過分析從 iPhone OS 1.0 到 iOS 15 的所有主要 iOS 版本,我們可以看到 iOS 使用的編程語言的演變。再次請注意,單個二進制文件可以計算多次,因此該圖中二進制文件的總和大於二進制文件的總數:
在 iOS 15 中的所有二進制文件中:
89% 正在使用 Objective-C
17% 使用 C++
13% 正在使用 Swift
8% 完全用 C 編寫
2% 正在使用 SwiftUI
我們可以在這裡了解到什麼呢?
Objective-C 仍然是 iOS 的核心,不會很快消失。
Apple 對 Swift 的使用比以往任何時候都快。去年 Swift 超過了 C。今年 Swift 越來越接近 C++。
SwiftUI 去年幾乎不引人注目,但今年蘋果似乎更廣泛地採用了它,即使在旗艦應用程序中也是如此。
C++ 和 C 仍然扮演着重要的角色。這些語言通常由與音頻、視頻、電話、Web 和其他低級框架相關的二進制文件使用。
這是每種編程語言演變的另一種圖示:
原始數據
如果您想進行更深入的分析,您可以在下面下載我為從 iPhone OS 1.0 到 iOS 15.0 的所有主要 iOS 版本生成的原始數據。
結論
儘管我們無法訪問 iOS 源代碼,但我們可以確定用於在 iOS 中創建內置應用程序的編程語言,並且我們可以衡量這些語言從 iPhone OS 1.0 到 iOS 15 的演變。
正如我們所見,Apple 繼續在自己的應用程序中採用 Swift:使用 Swift 的二進制文件數量在 iOS 14 和 iOS 15 之間翻了一番。現在大約 13% 的二進制文件使用 Swift。此外,SwiftUI 的採用從今年開始真正開始,現在有幾個旗艦應用程序現在使用 SwiftUI。
如前所述,這種方法顯然有一些限制,雖然作者相信整體情況是準確的,但不能保證結果完全準確。