Upgrade to Pro — share decks privately, control downloads, hide ads and more …

App Size Optimization への挑戦

Avatar for nade nade
September 18, 2021

App Size Optimization への挑戦

Avatar for nade

nade

September 18, 2021
Tweet

More Decks by nade

Other Decks in Technology

Transcript

  1. アプリサイズによるユーザー影響 インストール時 • データ通信量の制限 • ⽇中の速度低下 
 ダウンロードが全く終わらない → キャンセル

    
 インストールしたことを忘れる → 起動しない 広告効果の影響 • ダウンロード→起動での離脱が増える • ストア→インストールでのコンバージョン率と⽐較して、 
 広告sdk側で計上される成果数が落ちる
  2. 174 . 2 MB → 127 . 6 MBへと26.8%の削減 Size

    Over Time of Tapple               150 MB Limit 
 2017 - 20 1 9 100 MB Limit 
 2013 - 20 1 7 200 MB Limit 
 2019 -
  3. ⽣成物の種類について アプリケーションバンドル(*.app) • アーカイブ時に⽣成される「*.app」ファイルのこと • アプリが正常に動作するために必要なすべてのものを含む App Store⽤IPA • AppStoreへのアップロード、AppStore提出⽤のアップロード時に⽣成

    • 各端末⽤のすべてのバンドル、.dSYM等のApp Store⽤のメタデータが圧縮されたもの 端末⽤IPA • ユニバーサルIPA(〜iOS 8 )もしくはApp Thinning済みのIPA(iOS 9 〜) • Bitcodeは再コンパイルされ、アセットも各端末⽤に最適化される • App Storeのサービスのためのリソースは削除される https://dev.classmethod.jp/articles/reducing-the-size-of-ios-app/
  4. リリース済みアプリのサイズを確認する • App Store ConnectのTest Flight > ビルド セクションから確認できる •

    Apple公式⽈く最も正確なサイズ • ダウンロードサイズとインストールサイズが提供されている
  5. 開発中アプリのサイズを確認する • XcodeのレポートツールでApp Size Reportを作成できる ⼿順 1 . XcodeでアプリをArchive 2

    . Ad Hoc, Development, or EnterpriseとしてExport 3 . オプション設定でApp Thinningに“All compatible device variants” 
 “Rebuild from Bitcode”にチェックする 4 . 証明書を選んでアプリをExportする 5 . 作成されたフォルダ内の “ App Thinning Size Report.txt”を確認する
  6. App Thinning Size Report for All Variants of ExampleAp p

    Variant: ExampleApp.ip a Supported variant descriptors: [device: iPhone11,4, os-version: 12.0], [device: iPhone9,4, os-version: 12.0], [device: iPhone10,3, os-version: 12.0], [device: iPhone11,6, os-version: 12.0], [device: iPhone10,6, os-version: 12.0], [device: iPhone9,2, os-version: 12.0], [device: iPhone10,5, os-version: 12.0], [device: iPhone11,2, os-version: 12.0], and [device: iPhone10,2, os-version: 12.0 ] App + On Demand Resources size: 6.7 MB compressed, 18.6 MB uncompresse d App size: 6.7 MB compressed, 18.6 MB uncompresse d On Demand Resources size: Zero KB compressed, Zero KB uncompresse d // Other Variants of Your App . App Thinning Size Report.txt
  7. ԼهͷεΫϦϓτʹͯϫϯϥΠφʔͰApp Size ReportΛੜ੒Մೳ
 ※ OptionsPlist.plistʹ<thin-for-all-variants> ΛؚΊΔඞཁ͋Γ
 ※ Ұ౓खಈͰߦ͍ɺੜ੒͞ΕͨOptionsPlist.plistΛར༻͢Δ͜ͱ͕ਪ঑ 
 $

    xcodebuild -exportArchive -archivePath iOSApp.xcarchive -exportPath Release/ MyApp -exportOptionsPlist OptionsPlist.plist CIでApp Size Reportを⽣成する
  8. Bloaty: a size pro fi ler for binaries https://github.com/google/bloaty •

    Google製のバイナリサイズ プロファイラ • CLI Application • M 1 Macでも動作 • ELF, Mach-O, PE/COFF, WebAssemblyに対応(⼀部experimental) • Size di f を取る機能もある
  9. $ bloaty Frameworks/Umbrella.framework/Umbrella FILE SIZE VM SIZE -------------- -------------- 67.9%

    7.74Mi 67.0% 7.74Mi __TEXT,__tex t 5.1% 599Ki 5.1% 599Ki Export Inf o 3.2% 373Ki 3.2% 380Ki [38 Others ] 3.1% 358Ki 3.0% 358Ki __DATA,__cons t 3.1% 357Ki 3.0% 357Ki String Tabl e 2.7% 320Ki 2.7% 320Ki __TEXT,__gcc_except_ta b 2.6% 309Ki 2.6% 309Ki __TEXT,__cons t 1.8% 206Ki 1.7% 206Ki __TEXT,__cstrin g 1.6% 184Ki 1.6% 184Ki __TEXT,__unwind_inf o 1.4% 162Ki 1.4% 162Ki __DATA,__objc_cons t 1.3% 146Ki 1.2% 146Ki __TEXT,__objc_methtyp e 0.0% 0 1.2% 146Ki __DATA,__bs s 1.2% 141Ki 1.2% 141Ki __DATA,__dat a 0.9% 108Ki 0.9% 108Ki Symbol Tabl e 0.9% 108Ki 0.9% 108Ki Code Signatur e 0.9% 99.5Ki 0.8% 99.5Ki __TEXT,__eh_fram e 0.5% 58.5Ki 0.5% 58.5Ki Function Start Addresse s 0.5% 57.8Ki 0.5% 57.8Ki __DATA,__objc_dat a 0.5% 55.1Ki 0.5% 55.1Ki Weak Binding Inf o 0.5% 53.2Ki 0.5% 53.2Ki Lazy Binding Inf o 0.4% 46.0Ki 0.4% 46.0Ki Binding Inf o 100.0% 11.4Mi 100.0% 11.5Mi TOTAL Bloaty: a size pro fi ler for binaries
  10. App Thinning • IPAに特定のデバイスで動作させるために必要なリソースだけを含まれるよう にする技術 • Archive後のオプション設定でApp Thinning項⽬に 
 “All

    compatible device variants”を設定することで有効に TappleではFastlane経由で特に意識せずIPAを作成していたところオフになっ ていた😇
  11. for_lane :archive_and_submit_ipa d o scheme 'app ' export_method 'app-store '

    configuration 'Release ' codesigning_identity 'codesigning_identity ' export_options( { thinning: "<thin-for-all-variants>" , provisioningProfiles: { "com.example.bundleid" => "Provisioning Profile Name " } } ) en d App Thinning -Fastlane Gym fi le
  12. Image Compression • 32ビッドPNGの場合AppleはPhotoshopの「Web⽤に保存」を推奨 
 ImageOptim https://github.com/ImageOptim/ImageOptim • ロスレスのイメージ最適化ツール •

    内部ではZop fl i, PNGOUT, OxiPNG, JPEGOptim, SVGO等のツールを組み合わせて動いている • GUI • M 1 Macでも動作 https://help.apple.com/xcode/mac/ 11 . 0 /index.html?localePath=en.lproj#/devde 46 df 08 a
  13. On-Demand Resources • App Storeでホストされ、アプリインストール後の任意のタイミングでダウ ンロードすることができるリソース • 使⽤頻度の低いリソースに対する利⽤を推奨 
 eg)

    期間の限定された機能、アプリ内購⼊のリソース https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide
  14. コンパイルのサイズ最適化オプション • プロジェクトによって変化が⼤きく変わるため試してみるしかなそう コードコンパイル最適化 
 Swift Compiler - Optimization Level

    
 
 Apple Clang - Optimization Level 
 SWIFT_OPTIMIZATION_LEVEL: -OSizeʢOptimize for Size [-O]ʣ Optimize Compile Option GCC_OPTIMIZATION_LEVEL: sʢFastest, Smallest [-Os]ʣ
  15. debugConfigurations = ['Debug', 'Debug_etp', 'Release_adhoc', 'Release_etp' ] post_install do |installer

    | installer.pods_project.targets.each do |target | target.build_configurations.each do |config | if debugConfigurations.any? {|i| config.name.include?(i) } config.build_settings['GCC_OPTIMIZATION_LEVEL'] = '0 ' config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = '-Onone ' els e config.build_settings['GCC_OPTIMIZATION_LEVEL'] = 's ' config.build_settings['SWIFT_OPTIMIZATION_LEVEL'] = ‘-Osize ' en d en d en d en d Optimize Compile Option - Pod fi le
  16. External Framework / Module • なるべく純正のアプリケーションを使う 
 RxSwift → Combine

    
 Realm → CoreData • 複数ターゲットに対してStatic Linkしていないか
  17. • まずは計測してみる • 計測が定常的に⾏われる仕組みをつくる • ⾃分たちのサービスにできる最適化を知る 
 ⼤きくなってしまった場合に棚卸し まとめ 優先度⾼(コスト低

    / 効果⾼) • App Thinning • 不要なファイルの確認‧削除 • リソース管理をAsset Catalogに • Optimize Compile Option • Image Format • Image Compression • Frameworkの純正化 • On-Demand Resource • Enable Bitcode 優先度低(コスト低 / 効果⾼)
  18. 参考⽂献 • Reducing Your App’s Size 
 https://developer.apple.com/documentation/xcode/reducing-your-app-s- size •

    Doing Basic Optimization to Reduce Your App’s Size 
 https://developer.apple.com/documentation/xcode/doing-basic- optimization-to-reduce-your-app-s-size • Doing Advanced Optimization to Further Reduce Your App’s Size 
 https://developer.apple.com/documentation/xcode/doing-advanced- optimization-to-further-reduce-your-app-s-size