是什么使“ FBAudienceNetwork”链接花费了20秒的时间?

问题描述

最近我发现,花大约20秒的时间链接项目的原因是由于CocoaPods安装了“ FBAudienceNetwork” SDK,如下图所示:

enter image description here

您可以在此处克隆演示项目:

git@github.com:JohnnyTseng/FBDemoProject.git

这是一个干净的项目,仅包含CocoaPods安装的“ FBAudienceNetwork”,链接该项目大约需要20秒。

复制步骤:

  1. 使用CocoaPods安装“ FBAudienceNetwork”
  2. 构建应用
  3. 链接时间大约需要20秒(对于MBPR 16“,16G,8核)

有趣的是,即使使用CocoaPods安装了10多个库,链接时间仍然非常快,一旦安装了“ FBAudienceNetwork”,每个增量构建大约要花费20秒。

有人知道这是怎么回事吗?我很好奇,但没有足够的知识来探讨这个问题

谢谢!

解决方法

这个问题我也有一段时间了,很烦人。 我不知道解决链接时间问题的方法(也许使用框架的动态版本,而不是静态版本,但这意味着手动管理此依赖项,这对我来说是行不通的),我认为这取决于FB 团队来修复。

但有一个解决方法 - 完全避免链接 FBAudienceNetwork。

这将问题减少到仅与 FB 广告相关的开发,幸运的是这种情况并不常见。

  • 在 XCode 和 Podfile 中创建一个单独的目标
  • 不要在 Podfile 中指定 FBAudienceNetwork 依赖项
  • 创建预处理器宏以从编译中排除 FBAudienceNetwork 相关代码
  • 创建一个辅助类来封装所有与FB相关的逻辑
  • 使用带有虚拟广告助手的工厂方法

一些细节:

  • 目标

假设您的无 fb 目标是 FBDemoProject-no-fb。然后在Podfile

target 'FBDemoProject' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for FBDemoProject
  pod 'FBAudienceNetwork'
  # any other libs

end

target 'FBDemoProject-no-fb' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # any other libs

end
  • 预处理器:

用于 swift:其他 swift 标志 -> -D NO_FB_AD

用于 obj-c 或头文件:预处理器宏 -> NO_FB_AD=1

  • 助手:
protocol FbAd {
    func tryLoad()
    func isLoaded() -> Bool
    func tryShow(_ from: UIViewController?)
}

class FbAdFactory {
    static func create(
        _ placementId: String,_ didLoad: @escaping () -> (),//to be used in `FBInterstitialAdDelegate` methods - just to get an idea
        _ didClose: @escaping () -> (),_ onError: @escaping () -> ()
    ) -> NvFbAd {
        #if !NO_FB_AD
            return FbAdHelper(
                placementId,didLoad,didClose,onError)
        #else
            return FbAdDummy() //dummy implementation
        #endif
    }
}

FbAdHelper 中使用条件导入:

//to avoid compiler errors
#if canImport(FBAudienceNetwork)
    import FBAudienceNetwork
#endif

#if !NO_FB_AD
class FbAdHelper: NSObject,FbAd,FBInterstitialAdDelegate {
    //here go encapsulated logic and delegate methods
}
#endif
  • 然后在您的控制器中:

var fbAdHelper: NvFbAd!

//...

self.fbAdHelper = FbAdFactory.create("placementId",{ },{ }
        )