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

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

Yoshimasa Niwa
September 12, 2022

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 ͕஗͍!

    View Slide

  2. Yoshimasa Niwa
    @niw

    View Slide

  3. View Slide

  4. Xcode ஗͍Ͱ͢ΑͶ

    View Slide

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

    View Slide

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

    View Slide

  7. View Slide

  8. ϫʔΫεʔϖʔεΛ։͍ͯ

    Ϗϧυ͢Δͱࢭ·Δ໰୊
    Ϗϧυ͢Δͱ Planning Ͱͱ·ͬͯɺProvisioning ͱදࣔ͞
    Εͯਐ·ͳ͍
    ͜ͷঢ়ଶͩͱϏϧυΛࢭΊΔ͜ͱ΋Ͱ͖ͳ͍

    View Slide

  9. ϫʔΫεʔϖʔεΛ։͍ͯ

    Ϗϧυ͢Δͱࢭ·Δ໰୊
    Xcode ڧ੍ऴྃ͢Δ͔͠ͳ͍
    Activity Monitor ΛݟΔͱ XCBBuildService ͕ 900% ͘Β͍
    CPUΛ࢖ͬͯΔ

    View Slide

  10. ͜Ε͸ Xcode ͷ໰୊

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. ճආࡦ

    View Slide

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

    View Slide

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

    View Slide

  17. XCBBUILDSERVICE_PATH
    ࣮͸ XCBBuildService ͸ XCBBUILDSERVICE_PATH ؀ڥม
    ਺ͰมߋͰ͖Δ
    XCBBuildService Λஔ͖׵͑ͯ Xcode ͱΦϦδφϧͷ
    XCBBuildService ͷؒʹೖͬͯϓϩηεؒ௨৴Λ๦֐͢Ε͹
    ͍͍

    View Slide

  18. github.com/MobileNativeFoundation/XCBBuildServiceProxyKit
    XCBBuildServiceProxyKit
    SwiftNIO ϕʔεͷ࣮૷
    HybridXCBBuildService Λ࢖͑͹࣮ݱͰ͖Δ

    View Slide

  19. XCBBuildServiceProxyKit Λ࢖͏

    View Slide

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

    View Slide

  21. func handleRequest(
    _ request: RPCRequest, ...
    ) {
    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()
    }

    View Slide

  22. XCBBuildServiceProxyKit
    Xcode Λىಈ͢Δͱ͖ʹ
    open --env XCBBUILDSERVICE_PATH=ࣗ෼ͷ
    XCBBuildService /Applications/Xcode.app
    ͱ͢Δ

    View Slide

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

    View Slide

  24. ࣮͸…

    View Slide

  25. Xcode 14
    ͦ΋ͦ΋ͷ XCBBuildService ͷόά͕ Xcode 14 Beta 2 Ͱͳ
    ͓Γ·ͨ͠
    Xcode 14 ͷ Release Candidate ΋ϦϦʔε͞Ε·ͨ͠

    View Slide

  26. ͜ͷճආࡦ͸طʹෆཁ

    View Slide

  27. ͨ·ʹීஈΑΓ

    Ϗϧυ͕஗͘ͳΔ໰୊

    View Slide

  28. View Slide

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

    View Slide

  30. ϩοΫػߏͷ໰୊

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  36. llvm::LockFileManager::waitForUnlock()
    Ethernet ͷিಥݕग़ʹࣅͨ࢓૊Έ
    ·ͣ 10 ms * ͋Δൣғͷཚ਺ (࠷େ500 ms) Λ଴ͭ
    ·ͩղ์͞Εͳ͔ͬͨΒൣғΛ2ഒʹͯ͠·ͨ଴ͭɻ͜ΕΛ
    ܁Γฦ͢ɻσϑΥϧτͰ࠷େ1෼30ඵ଴ͭɻ

    View Slide

  37. clang ͕ϩοΫͷղ์Λ଴ͯͳ͔ͬͨ৔߹
    clang ͸ϩοΫ͕औΕͣɺղ์͕଴ͯͳ͔ͬͨ৔߹ɺطଘͷ
    ϩοΫΛ࡟আͯ͠΋͏Ұ౓ϩοΫΛऔΖ͏ͱ͢Δ
    ෳ਺ͷ clang ͕ಉ͡ϞδϡʔϧΛ୳͍ͯͨ͠৔߹ɺ͜͜Ͱ
    ϩοΫͷऔΓ߹͍ʹͳΔ

    View Slide

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

    View Slide

  39. Module
    clang
    clang
    clang

    View Slide

  40. Module
    clang
    clang
    clang

    View Slide

  41. Module
    clang
    clang
    clang
    .lock
    !

    View Slide

  42. Module
    clang
    clang
    clang
    .lock
    !
    "

    View Slide

  43. Module
    clang
    clang
    clang
    .lock
    !
    "

    View Slide

  44. Module
    clang
    clang
    clang
    .lock
    !
    "

    View Slide

  45. Module
    clang
    clang
    clang
    .lock
    !
    "

    View Slide

  46. Module
    clang
    clang
    clang
    "

    View Slide

  47. Module clang
    clang

    View Slide

  48. Module clang
    clang

    View Slide

  49. Module clang
    clang
    .lock
    !

    View Slide

  50. Module clang
    clang
    .lock
    !
    "

    View Slide

  51. Module clang
    clang
    .lock
    !
    "

    View Slide

  52. Module clang
    clang
    .lock
    !
    "

    View Slide

  53. Module clang
    clang
    .lock
    !
    "

    View Slide

  54. Module clang
    clang
    "

    View Slide

  55. Module
    clang

    View Slide

  56. Module
    clang

    View Slide

  57. Module
    clang
    .lock
    !

    View Slide

  58. Module
    clang
    .lock
    !
    "

    View Slide

  59. Module
    clang
    "

    View Slide

  60. Module

    View Slide

  61. ճආࡦ

    View Slide

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

    View Slide

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

    View Slide

  64. ࠜຊతͳղܾ
    llvm::LockFileManager ΍ clang ͷڍಈΛม͑Δඞཁ͕͋Δ
    Xcode Ͱ͸ swift ΍ clang ͸πʔϧνΣʔϯͱͯ͠ఏڙ͞Εͯ
    ͍Δ

    View Slide

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

    View Slide

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

    View Slide

  67. ࣮͸…

    View Slide

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

    View Slide

  69. ͳ͓ͯ͠…

    View Slide

  70. Xcode ΍ΊΔ?

    View Slide

  71. Xcode ͷ໰୊఺
    Xcode ΍ΊΔ?
    Xcode ͸جຊతʹ Apple ͔͠खग़͠Ͱ͖ͳ͍͏͑ʹߋ৽͕஗
    ͍
    Xcode ͸جຊతʹϓϩμΫτͱͯ͠ɺେ͖ͳΞϓϦΛϏϧυ
    ͢Δސ٬͕λʔήοτͰ͸ͳ͍Α͏ʹࢥ͑Δ

    View Slide

  72. Xcode ͷར఺
    Xcode ΍ΊΔ?
    ϓϥοτϑΥʔϜͷ৽͍͠ػೳʹଈ࠲ʹ௥ैͰ͖Δɻ
    macCatalyst ͳͲɻ
    Xcode ͸σϑΝΫτɻ΄ͱΜͲͷ։ൃऀ͕࢖͍ͬͯΔɻ

    View Slide

  73. ֎෦ͷϏϧυπʔϧ

    View Slide

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

    View Slide

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

    View Slide

  76. Ϗϧυͷ৘ใ΁ͷΞΫηε
    XCBBuildService Ͱ͸Ϗϧυͷ৘ใ͸ Project Interchange
    Format (PIF) ͰऔಘͰ͖Δ
    Swift Package Manager ʹ࣮૷ͷ֓ཁ͕͋Δ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide