Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Embedded Frameworkのススメ
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Go Takagi
October 16, 2018
Programming
590
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Embedded Frameworkのススメ
https://nikkei.connpass.com/event/98887/
Go Takagi
October 16, 2018
More Decks by Go Takagi
See All by Go Takagi
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
350
日経電子版のStoreKit2フルリニューアル
shimastripe
4
1.7k
アプリ内課金と自社の認証認可基盤を連携する複雑な課金ネットワークを構築する
shimastripe
5
5k
日経iOSプロジェクトのマルチモジュール戦略
shimastripe
45
2.4k
UIKit ベースの Custom UIContentConfiguration API を 用いた複雑なカスタムセルの作り方
shimastripe
14
4.2k
リーダーアプリに外部課金リンクを設置する
shimastripe
2
2k
Effective PencilKit / 新聞スクラップ体験の実現
shimastripe
5
4k
SPM Build tools を用いて SwiftGen を導入する上での罠とTips / SPM-SwiftGen-Plugin
shimastripe
6
3.4k
Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する
shimastripe
12
5.7k
Other Decks in Programming
See All in Programming
Family mrubyの進捗
kishima
1
130
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
350
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
260
iOSDC2026登壇資料.pdf
riofujimon
0
170
App Intentsのビルドプロセスを支える技術
kntkymt
0
410
Jetpack Compose メカニズム
skydoves
0
450
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
140
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
6
2.3k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
160
SONY CISC-NEWS NWS-1750 + NWB-225 フレームバッファの NetBSD/news68k ドライバ実装 / OSC2026Hiroshima
tsutsui
0
120
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
180
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
Designing for Performance
lara
611
70k
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
Code Review Best Practice
trishagee
74
20k
Claude Code のすすめ
schroneko
67
230k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
340
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
The SEO identity crisis: Don't let AI make you average
varn
0
560
Facilitating Awesome Meetings
lara
57
7.1k
Designing Powerful Visuals for Engaging Learning
tmiket
1
570
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
530
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Transcript
差分Buildでサクサク開発 Embedded Frameworkのススメ ⾼⽊ 豪 ⽇本経済新聞社インターン Otemachi.swift #02
‣ Status • 東京⼯業⼤学 M2 ‣ SNS • @shimastripe /
@shimastriper / @root ‣ Intern Task (iOS) • 電⼦版の3d touch • Modulesをフレームワーク化 ←Now!! ‣ Fav Language • Go (は?) ✴ ⼿持ちのMBPはiOSのBuildが⻑くて⾟い Go Takagi 2
翻訳「Buildを待つ僕」 3
1. スペックで殴る • iMacProを購⼊しましょう 2. プロダクトのボトルネックを減らす • 例えば型推論 • 重複コンパイルを減らす
• 差分Buildを促進したい • Build時間改善⽅法 4 Embedded Framework !!
‣ Embedded Frameworkの紹介 ‣ 電⼦版への導⼊に必要だったタスク ‣ Build時間改善した?? Agenda 5
Embedded Framework
‣ Info • AppとExtension間でコード共有する埋め込みFramework ‣ Build時間改善 • App, Extensionをまたぐ重複コンパイルの削減 ✴
Target Membershipの場合各々にコピーしてコンパイル • 差分Buildの促進 ✴ 「1⾏しかいじってないのに全体に…」が減らせる ‣ Appのサイズを⼩さくできる(起動時) • Dynamic Framework ‣ 名前空間 • 依存関係・レイヤーを嫌でも意識、例えばAPI Clientで切る Embedded Framework (iOS8) 7
電⼦版の導⼊の経緯 8 RichNotification実装しよう! Ref. Human Interface Guidelines
電⼦版の導⼊の経緯 9 RichNotification実装しよう! 共有Moduleが多い… Membership全部に 貼るの⾯倒くさい!!
電⼦版の導⼊の経緯 10 RichNotification実装しよう! 共有Moduleが多い… 未来のExtensionの数だけ コンパイルが遅くなる… Extension毎にコピー 重複コンパイルされる
電⼦版の導⼊の経緯 11 RichNotification実装しよう! 共有Moduleが多い… 未来のExtensionの数だけ コンパイルが遅くなる… 今のうちにFrameworkに!!
導⼊
‣ Emb に依存するLibrary/Framework ‣ 移⾏するModuleの設計 ‣ 躓きやすいところ 導⼊に向けて確認すべき項⽬ 13
‣ FrameworkはBridging-Headerが使えない • Clang Modulesを利⽤してモジュール化 • Headerをバイナリ化するためコンパイル時間の短縮にも C LibraryをModule Mapでモジュール化
14 ※ CommonCryptoはXcode10から標準Moduleに #import <CommonCrypto/CommonCrypto.h> #import <CommonCrypto/CommonRandom.h> shim.h module CommonCrypto [system] { header "shim.h" export * } module.modulemap CommonCrypto Module import CommonCrypto Swift 1. ModuleMapに読み込むHeaderを記述 2. Header Search Pathを指定 3. Swiftファイル上でImport可能になる
‣ Emb FrameworkはApp専⽤APIを持てない • Extensionが使えないAPIはダメ(リジェクト) ✴ Ex.) UIApplication.shared • Require
Only App-Extension-Safe API: YES ↑でBuildしたFrameworkしか利⽤できない ✴ してないものをLinkするとwarning ๏ linking against dylib not safe for use in application extensions ✴ 後述しますが、もちろん⾃前のコードに対しても対象 Dynamic Framework Link時の注意点 15
‣ EmbeddedFrameworkで使えるよう改善 • Bridging-Headerで読んでいたものをModuleMapに • OSSにSafe APIフラグのPR • Carthage化(Membershipの重複改善) •
どうしようもなかったらUnsafeなAPIをforkして削除 PR投げたりCarthage化したりコード消したり… 16
‣ 設計構造の⾒直し • 移⾏する前に設計が悪い箇所は直しておく ✴ Ex. UIViewControllerの型を⾒て分岐する箇所を取り除く ✴ Ex. App限定のAPIをApp側に持たせる(先述)
‣ Framework化 1. Modulesの移⾏、Framework単体でBuild Succeed 2. 外部(AppやExtension)から参照したいモジュールに アクセス修飾⼦を付加(public / open class) 3. AppやExtensionから参照する箇所にimportを付加 • statement毎にError出るのでものすごいエラー数になります Module群を移⾏ 17
‣ 直感的じゃないError • 何かが抜けて明⽰的に指定する必要性が⽣じるError ✴ ambiguous use of ✴ frameworkのimportし忘れ
✴ frameworkのextensionがPublicになってないとか • Repositoryを複製して何が参照できなくなったか 確認できるようにしておくといい ‣ 他ブランチとのpbxprojの衝突がとても多い • (オススメMergeツールあったら教えてください) 躓きやすいところ 1/2 18
‣ Emb Frameworkで利⽤できないFramework • CrashlyticsはInstanceをAppにしか持つことができない • 【対策】 ✴ Emb Framework上ではprotocolとして抽象的に定義
ApplicationからEmb Frameworkに逆Injection ‣ protocol extensionの衝突が解決できない • StringをextensionしてisEmptyフィールドを定義、 Framework同⼠で衝突すると区別することができない • 【対策】 ✴ 冗⻑な名前を避ける/extensionを⼯夫して名前空間(疑似)作る ๏ Ex. RxSwift 躓きやすいところ 2/2 19
‣ Build回数がとにかく多い • Error潰してBuildしてのサイクル • 作業はスペックいいPCでやるべき ‣ スペック低いとXcodeが死ぬ • 適当に移⾏するとエラー700件とか平気で出る
• Indexing Prebuilding って常にクルクルする • 静的解析が終わらない ✴ ジャンプ先が意味不明なファイルに⾶ぶ • 儚げに落ちる 感覚的に⾟いところ 20
Build時間改善した??
‣ 実機iPhone7plusで3回測って平均 ‣ 重複コンパイルしてた箇所が効いてる • Full Buildチェック 22 iMacPro2017 MBP2013
(Xcode10) Base Embed Base Embed Debug (second) 35.87 30.03 57.93 51.03 Release (second) 125.83 98.87 213.23 172.47 (あくまでゆるふわな実測値です)
‣ 差分Buildが効率的に起きててサクサク!! 差分Buildチェック 23 iMacPro2017 MBP2013 (Xcode10) FullBuild 差分Build FullBuild
差分Build Debug (second) 35.87 (30.03) 19.0 57.93 (51.03) 39.3 (あくまでゆるふわな実測値です)
‣ 従来の2分の1以下にBuild時間が短縮 • 僕が闘った 数秒は〜〜〜(完全にインパクト⾷われる) ✴ 重複・差分コンパイルの恩恵はちゃんと効いてます (ところで) Xcode10のBuildが凄い 24
iMacPro Xcode9 Xcode10 Debug (seconds) 81.94 30.03 今こそEmbeddedFrameworkに⼿をつけるチャンス!!
まとめ
‣ Build時間改善に役⽴つ • 差分Buildの促進 • 重複コンパイルの除去 • TargetMembership貼らなくていい • Appのサイズを⼩さくできる
✴ Dynamic Link過多に対するAppの⽴ち上がりの遅延は要確認 • レイヤーを意識した設計にも役⽴てる ‣ 移⾏するぞ!! 1. 作業時はスペックが⾼いPCでやるべき ‣ Build回数が通常より明らかに増えるため 2. 依存するLibrary / Frameworkの精査 ‣ 個⼈的にはここで苦労する⼿戻りが多かった 3. レイヤーの切り分け・設計構造の⾒直し 4. 移⾏ -> ひたすらErrorをつぶす Embedded Frameworkのススメ 26