Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Embedded Frameworkのススメ
Search
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
日経電子版のStoreKit2フルリニューアル
shimastripe
4
1.6k
アプリ内課金と自社の認証認可基盤を連携する複雑な課金ネットワークを構築する
shimastripe
5
4.8k
日経iOSプロジェクトのマルチモジュール戦略
shimastripe
45
2.2k
UIKit ベースの Custom UIContentConfiguration API を 用いた複雑なカスタムセルの作り方
shimastripe
14
4.1k
リーダーアプリに外部課金リンクを設置する
shimastripe
2
2k
Effective PencilKit / 新聞スクラップ体験の実現
shimastripe
4
3.9k
SPM Build tools を用いて SwiftGen を導入する上での罠とTips / SPM-SwiftGen-Plugin
shimastripe
6
3.4k
Background Notificationで新聞紙面の大きい画像の自動ダウンロードを実現する
shimastripe
12
5.6k
Otemachi.swift#04 今から始めるCodable移行
shimastripe
1
1.2k
Other Decks in Programming
See All in Programming
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
490
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
進化を続けるGo toolsの現在地 / The Current State of Ever-Evolving Go Tools
hond0413
0
220
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
500
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
190
What's New in Android 2026
veronikapj
0
260
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
210
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
180
React本体のコードリーディング
high_g_engineer
1
140
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
150
VibeCodingからAgenticWorkflowへ
starfish719
0
480
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
130
Featured
See All Featured
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
280
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Balancing Empowerment & Direction
lara
6
1.2k
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Build your cross-platform service in a week with App Engine
jlugia
234
19k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
290
VelocityConf: Rendering Performance Case Studies
addyosmani
332
25k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Marketing to machines
jonoalderson
1
5.7k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
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