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

Xcode が遅い! とにかく遅い!! 遅い Xcode をなんとかする方法

Xcode が遅い! とにかく遅い!! 遅い Xcode をなんとかする方法

Xcode が遅い。とにかく遅い!! あああ!!!

皆さんはそんな経験ありませんか...?

iOS アプリの開発にはなくてなはならないツール、それは Xcode です。
しかし、Xcode がとにかく遅いのです。
アプリが成長し、ワークペースが巨大になり、多くのターゲットができるにつれてどんどん遅くなり、最後にはハングして終了すらできなくなってしまいます。
このセッションではそんな遅い Xcode を使えるように頑張った経験をもとに、Xcode のビルドの仕組み、そして Bazel などほかのビルドツールについても検証したいと思います。

対象とする方:
- Xcode が遅くて辛い方
- 大きなアプリを作っている方
- killall XCBBuildService が癖になってしまった方
- Xcode のビルドの仕組みをちょっと知りたい方

前提とする知識:
- Xcode

Yoshimasa Niwa

September 12, 2022
Tweet

More Decks by Yoshimasa Niwa

Other Decks in Programming

Transcript

  1. ͱʹ͔͘஗͍!! ஗͍ Xcode ΛͳΜͱ͔͢Δํ๏ @niw 9/12/2022 — Tokyo, Japan iOSDC

    Japan 2022 Xcode ͕஗͍!
  2. Yoshimasa Niwa @niw

  3. None
  4. Xcode ஗͍Ͱ͢ΑͶ

  5. Xcode ͕஗͍ ීஈͷΫϦʔϯϏϧυ͸10෼͘Β͍ͰऴΘΔ ϫʔΫεʔϖʔεΛ։͍ͯϏϧυͨ͠Β Xcode ͕ࢭ·Δ ৔߹ʹΑͬͯ͸ Xcode ͕൓Ԡ͠ͳ͘ͳͬͯ͠·͏ ͳ͔ͥ೔ʹΑͬͯ͸ͱͯ΋Ϗϧυʹ͕͔͔࣌ؒΔ

  6. ϫʔΫεʔϖʔεΛ։͍ͯ Ϗϧυ͢Δͱࢭ·Δ໰୊

  7. None
  8. ϫʔΫεʔϖʔεΛ։͍ͯ
 Ϗϧυ͢Δͱࢭ·Δ໰୊ Ϗϧυ͢Δͱ Planning Ͱͱ·ͬͯɺProvisioning ͱදࣔ͞ Εͯਐ·ͳ͍ ͜ͷঢ়ଶͩͱϏϧυΛࢭΊΔ͜ͱ΋Ͱ͖ͳ͍

  9. ϫʔΫεʔϖʔεΛ։͍ͯ
 Ϗϧυ͢Δͱࢭ·Δ໰୊ Xcode ڧ੍ऴྃ͢Δ͔͠ͳ͍ Activity Monitor ΛݟΔͱ XCBBuildService ͕ 900%

    ͘Β͍ CPUΛ࢖ͬͯΔ
  10. ͜Ε͸ Xcode ͷ໰୊

  11. Xcode ͷ໰୊ ϫʔΫεϖʔεΛ։͘ͱɺݟ͑Δશ෦ͷϓϩδΣΫτͷΠϯ σοΫεΛ࡞Ζ͏ͱ͢Δ ΠϯσοΫε࡞੒ͷ࡞ۀΛ XCBBuildService ʹґཔ͢Δ ͜ͷ࡞ۀͷͳ͔Ͱ͋ΔόάΛ;Ή ͦͷ݁Ռ XCBBuildService

    ͕൓Ԡ͠ͳ͘ͳΔ
  12. XCBBuildService ͱ͸ Xcode ͷϏϧυΛ͔ͭ͞ͲΔผͷϓϩάϥϜ Xcode ͱ͸ϓϩηεؒ௨৴Λ͍ͯ͠Δ

  13. Xcode ͷ໰୊ XCBBuildService ͕όάΛ౿Ήͱ൓Ԡ͠ͳ͘ͳΔ Xcode ͕ϏϧυϦΫΤετΛૹͬͯ΋൓Ԡ͠ͳ͍ͷͰࢭΊΔ ͜ͱ΋Ͱ͖ͳ͍

  14. ճආࡦ

  15. Xcode ͷ໰୊͋ΔڍಈΛ્ࢭ͢Δ ΠϯσοΫεͷػೳͦͷ΋ͷΛࢭΊΔඞཁ͸ͳ͍ ϫʔΫεϖʔεΛ։͍ͨޙʹى͜Δ໰୊ͷ͋Δશ෦ͷΠϯ σοΫεΛ࡞ΔڍಈΛ્ࢭ͢Ε͹ྑ͍

  16. Xcode ͷ໰୊͋ΔڍಈΛ્ࢭ͢Δ Xcode ͱ XCBBuildService ͱͷؒʹԿ͔͍Εͯɺશ෦ͷΠ ϯσοΫεΛ࡞ΔϦΫΤετΛ્ࢭ͢Ε͹Α͍ͷͰ͸? ϦΫΤετΛ્ࢭ

  17. XCBBUILDSERVICE_PATH ࣮͸ XCBBuildService ͸ XCBBUILDSERVICE_PATH ؀ڥม ਺ͰมߋͰ͖Δ XCBBuildService Λஔ͖׵͑ͯ Xcode

    ͱΦϦδφϧͷ XCBBuildService ͷؒʹೖͬͯϓϩηεؒ௨৴Λ๦֐͢Ε͹ ͍͍
  18. github.com/MobileNativeFoundation/XCBBuildServiceProxyKit XCBBuildServiceProxyKit SwiftNIO ϕʔεͷ࣮૷ HybridXCBBuildService Λ࢖͑͹࣮ݱͰ͖Δ

  19. XCBBuildServiceProxyKit Λ࢖͏

  20. XCBBuildServiceProxyKit Λ࢖͏ ࣗલͷ XCBBuildService Λ࡞ΓɺHybridXCBBuildService ࢖ͬͯϦΫΤετΛୣ͏ ෳ਺ͷλʔήοτͷΠϯσοΫεΛ࡞Δ CreateBuildRequest ͕͖ͨΒ્ࢭ ͦΕҎ֎͸ΦϦδφϧͷ

    XCBBuildService ʹԣྲྀ͠
  21. func handleRequest( _ request: RPCRequest<RequestPayload>, ... ) { switch request.payload

    { case let .createBuildRequest(message): let buildRequest = message.buildRequest if buildRequest.parameters.action == "indexbuild", buildRequest.configuredTargets.count > 1 { context.sendErrorResponse("Abort", request: request) return } default: break } context.forwardRequest() }
  22. XCBBuildServiceProxyKit Xcode Λىಈ͢Δͱ͖ʹ open --env XCBBUILDSERVICE_PATH=ࣗ෼ͷ XCBBuildService /Applications/Xcode.app ͱ͢Δ

  23. ͜ͷճආࡦͷ໰୊఺ Xcode ͕ࢭ·ͬͯ͠·͏໰୊͸ճආͰ͖Δ ςετεΩʔϚͳͲෳ਺λʔήοτͷϏϧυΛ͢Δͱࢭ·Δ ͷ͸௚ͤͳ͍ɻಉ͡ঢ়ଶʹͳͬͯ͠·͏ɻ Create build description ͕ͱͯ΋஗͍ͳͲɺ࣮ࡍͷϏϧυ͕ ஗͍໰୊͸ճආͰ͖ͳ͍

  24. ࣮͸…

  25. Xcode 14 ͦ΋ͦ΋ͷ XCBBuildService ͷόά͕ Xcode 14 Beta 2 Ͱͳ

    ͓Γ·ͨ͠ Xcode 14 ͷ Release Candidate ΋ϦϦʔε͞Ε·ͨ͠
  26. ͜ͷճආࡦ͸طʹෆཁ

  27. ͨ·ʹීஈΑΓ
 Ϗϧυ͕஗͘ͳΔ໰୊

  28. None
  29. ͨ·ʹීஈΑΓϏϧυ͕஗͘ͳΔ໰୊ Ϗϧυ͕ਐΜͰ͍ͳ͍Α͏ʹݟ͑Δ Activity Monitor ΛΈΔͱҰͭͷ swift-frontend ΍ clang ͚͕ͩ ಈ࡞͍ͯ͠Δ

    CPU͕Ջͯ͠Δ
  30. ϩοΫػߏͷ໰୊

  31. ͨ·ʹීஈΑΓϏϧυ͕஗͘ͳΔ໰୊ clang ಺෦ʹ͋Δ llvm ͷϩοΫػߏ͕ݪҼ clang ͕Ұ͔ͭ͠ಈ͚ͳ͍ঢ়گ͕͋Δ Swift ΋಺෦Ͱ clang

    ࢖ͬͯΔ
  32. clang.llvm.org/docs/Modules.html clang ͷϞδϡʔϧͱϩοΫ ௨ৗ clang ͸ϞδϡʔϧΛ୳࣌͢ʹɺσΟεΫʹ͋ΔϞ δϡʔϧΩϟογϡΛ࢖͏ ϞδϡʔϧΩϟογϡ͸ίϯύΠϧ࣌ͷϑϥάͳͲͷઃఆ͝ ͱʹผʑͷ΋ͷ͕࡞ΒΕΔ ݟ͔ͭΒͳ͔ͬͨΒͦͷ࣌ʹ࡞ΒΕΔ

  33. clang.llvm.org/docs/Modules.html clang ͷϞδϡʔϧͱϩοΫ ͜͜Ͱෳ਺ͷ clang ͕ಉ࣌ʹಉ͡ϞδϡʔϧΛඞཁͱͨ͠৔ ߹ɺಉ͡ϞδϡʔϧΛ࡞ΔͷΛ๷͙ͨΊʹϩοΫΛऔΔ ϞδϡʔϧϑΝΠϧͷύεΛ llvm::LockFileManager Λ࢖ͬ

    ͯϩοΫ͢Δ
  34. llvm::LockFileManager ϑΝΠϧͷύε͝ͱʹྡʹ .lock ϑΝΠϧΛ࡞ͬͯɺϓϩη ε͝ͱʹϩοΫΛऔΕΔ࢓૊Έ ϩοΫ͕औΕͳ͔ͬͨΒղ์͞ΕΔ·Ͱ଴ͭػೳ͕͋Δ

  35. ͜ͷϩοΫػߏʹ໰୊͕͋Δ

  36. llvm::LockFileManager::waitForUnlock() Ethernet ͷিಥݕग़ʹࣅͨ࢓૊Έ ·ͣ 10 ms * ͋Δൣғͷཚ਺ (࠷େ500 ms)

    Λ଴ͭ ·ͩղ์͞Εͳ͔ͬͨΒൣғΛ2ഒʹͯ͠·ͨ଴ͭɻ͜ΕΛ ܁Γฦ͢ɻσϑΥϧτͰ࠷େ1෼30ඵ଴ͭɻ
  37. clang ͕ϩοΫͷղ์Λ଴ͯͳ͔ͬͨ৔߹ clang ͸ϩοΫ͕औΕͣɺղ์͕଴ͯͳ͔ͬͨ৔߹ɺطଘͷ ϩοΫΛ࡟আͯ͠΋͏Ұ౓ϩοΫΛऔΖ͏ͱ͢Δ ෳ਺ͷ clang ͕ಉ͡ϞδϡʔϧΛ୳͍ͯͨ͠৔߹ɺ͜͜Ͱ ϩοΫͷऔΓ߹͍ʹͳΔ

  38. clang ͕ϩοΫͷղ์Λ଴ͯͳ͔ͬͨ৔߹ ͋Δ clang ͕ͱͬͨϩοΫ͕ղ์੍ݶ࣌ؒ·Ͱʹղ์͞Εͳ ͍ͱɺ͜ΕΛ܁Γฦ͢ ͜ͷ݁Ռɺӡྑ͘ϩοΫ͕औΕͨҰͭͷ clang ͔͠࢓ࣄ͕ Ͱ͖ͳ͍͕࣌ؒͰ͖Δ

  39. Module clang clang clang

  40. Module clang clang clang

  41. Module clang clang clang .lock !

  42. Module clang clang clang .lock ! "

  43. Module clang clang clang .lock ! " ⏳

  44. Module clang clang clang .lock ! "

  45. Module clang clang clang .lock ! "

  46. Module clang clang clang "

  47. Module clang clang

  48. Module clang clang

  49. Module clang clang .lock !

  50. Module clang clang .lock ! "

  51. Module clang clang .lock ! " ⏳

  52. Module clang clang .lock ! "

  53. Module clang clang .lock ! "

  54. Module clang clang "

  55. Module clang

  56. Module clang

  57. Module clang .lock !

  58. Module clang .lock ! "

  59. Module clang "

  60. Module

  61. ճආࡦ

  62. ϩοΫ͠ͳ͍Α͏ʹ͢Δ ࠷ۙಋೖ͞ΕͨΦϓγϣϯ BuildingImplicitModuleUsesLock Ͱ ͜ͷϩοΫΛ࢖Θͳ͍Α͏ʹ͢Δ͜ͱ͕Ͱ͖Δ OTHER_CFLAGS ʹ -Xclang -fno-implicit-modules-use-lock Λ଍͢

  63. ͜ͷճආࡦͷ໰୊఺ ෳ਺ͷ clang ͕ಉ͡ϞδϡʔϧΛ࡞ΔՄೳੑ͕૿͑ΔͷͰ τʔλϧͰޮՌ͸͋Δ͔͸ঢ়گ࣍ୈ ͨͩɺϏϧυ͕ࢭ·Βͳ͘ͳΔͷͰؾ෼͸ྑ͍

  64. ࠜຊతͳղܾ llvm::LockFileManager ΍ clang ͷڍಈΛม͑Δඞཁ͕͋Δ Xcode Ͱ͸ swift ΍ clang

    ͸πʔϧνΣʔϯͱͯ͠ఏڙ͞Εͯ ͍Δ
  65. πʔϧνΣʔϯΛஔ͖׵͑Δ Xcode ͕࢖͏πʔϧνΣʔϯ͸ஔ͖׵͕͑Մೳ ͜ΕΒͷڍಈΛม͑ͨ clang ΛؚΉπʔϧνΣʔϯΛ࡞Δ ~/Library/Developer/Toolchains ʹ഑ஔ͢Δͱ Xcodeͷϝχϡʔ͔Β੾Γସ͑ΒΕΔ

  66. πʔϧνΣʔϯΛஔ͖׵͑Δ ͨͩ͠ɺπʔϧνΣʔϯͷϏϧυ͸͔ͳΓେม clang ͚ͩͳΒɺCC ؀ڥม਺Ͱஔ͖׵͑Δͱ͍͏͜ͱ΋Ͱ͖ Δ

  67. ࣮͸…

  68. ࠜຊతͳղܾ llvm::LockFileManager ͷ࣮૷ʹ͸ // FIXME: implement event-based waiting ͬͯॻ͍ͯ͋Δɻ

  69. ͳ͓ͯ͠…

  70. Xcode ΍ΊΔ?

  71. Xcode ͷ໰୊఺ Xcode ΍ΊΔ? Xcode ͸جຊతʹ Apple ͔͠खग़͠Ͱ͖ͳ͍͏͑ʹߋ৽͕஗ ͍ Xcode

    ͸جຊతʹϓϩμΫτͱͯ͠ɺେ͖ͳΞϓϦΛϏϧυ ͢Δސ٬͕λʔήοτͰ͸ͳ͍Α͏ʹࢥ͑Δ
  72. Xcode ͷར఺ Xcode ΍ΊΔ? ϓϥοτϑΥʔϜͷ৽͍͠ػೳʹଈ࠲ʹ௥ैͰ͖Δɻ macCatalyst ͳͲɻ Xcode ͸σϑΝΫτɻ΄ͱΜͲͷ։ൃऀ͕࢖͍ͬͯΔɻ

  73. ֎෦ͷϏϧυπʔϧ

  74. ݱঢ়ɺۀքඪ४ͩͱࢥΘΕΔϏϧυπʔϧ Ұ؏ੑΛॏࢹͨ͠πʔϧͰɺͦͷ݁ՌΩϟογϡΛଟ༻Ͱ ͖ɺશମͷϏϧυ͕࣌ؒݮΔ ଟ͘ͷେ͖Ίͷ iOS ΞϓϦͰطʹଟ͘࢖ΘΕ͍ͯΔ Bazel

  75. Xcode ͷϏϧυΛஔ͖׵͑Δ External Build System λʔήοτΛ࢖͏ Run Script Phase Λ࢖͏

    XCBBuildService Λஔ͖׵͑Δ
  76. Ϗϧυͷ৘ใ΁ͷΞΫηε XCBBuildService Ͱ͸Ϗϧυͷ৘ใ͸ Project Interchange Format (PIF) ͰऔಘͰ͖Δ Swift Package

    Manager ʹ࣮૷ͷ֓ཁ͕͋Δ
  77. Xcode ͷϏϧυΛஔ͖׵͑Δ Ҡߦظʹ͸ XCBBuildService Λஔ͖׵͑ΔͳͲͷख๏Ͱ Xcode ͱ֎෦ͷϏϧυπʔϧΛཱ྆ͤ͞Δ ࠷ऴతʹ͸֎෦ͷϏϧυπʔϧ͚ͩʹ͢Δ Xcode ͷϓϩδΣΫτ΋֎෦ϏϧυπʔϧͰੜ੒͢ΔΑ͏ʹ

    ͢Δ
  78. ·ͱΊ Xcode ͷϏϧυ͸ XCBBuildService ͱ͍͏ผͷϓϩηε͕ ୲͍ͬͯΔ XCBBuildService ͸ஔ͖׵͕͑Մೳɻ஗͘ͳΔόάΛճආ͠ ͨΓɺ֎෦ϏϧυπʔϧΛ࢖͏ͷʹΤϯτϦϙΠϯτͱͯ͠ ࢖͑Δ

  79. ·ͱΊ Xcode ͕஗͍ͷ͸ clang ͳͲͷπʔϧνΣʔϯͷ໰୊Ͱ͋Δ ͜ͱ΋͋Δ ͜ΕΒ͸πʔϧνΣʔϯΛஔ͖׵͑Δ͜ͱͰ໰୊ΛճආͰ͖ Δ