Facebook SDK 是如何自动初始化的

在研究 Facebook SDK 的 Change Log 时, 发现一个有趣的地方:Facebook SDK 从 4.19.0 版本开始, 不需要手动调用 FacebookSdk.initialize() 方法了。

这是为啥? 咋做到的?

搞代码

首先怎么才能看到 FacebookSdk 的代码呢?

很简单:

  1. aar 包下载下来
  2. unzip
  3. dex2class
  4. jd-gui

这么简单就能看到代码其实是因为 Facebook 并没有打算混淆代码

分析代码

其实很简单, FacebookSdk 在自己的模块中的 AndroidManifest.xml 中注册了一个 ContentProvider:

(此处用 AccountKit 的 SDK 代替, 懒得去搞 FacebookSdk 的源码了, 正好手上有个 AccountKit 的

<provider
      android:name="com.facebook.accountkit.internal.AccountKitInitProvider"
      android:authorities="com.meet.android.AccountKitInitialization"
      android:exported="false" />

此时去看 AccountKitInitProvider, 发现 Provider 里在 onCreate()的时候调用了初始化相关的代码. 这样看来实现相当简单, 就是通过这种方式实现了所谓的"自动初始化". 而 ContentProvider 的初始化也正好是在主线程的, 所以也不会影响 SDK 初始化时对线程的需求.(FacebookSdk 是否有要求不清楚,因为以前都是在 Application 或者 MainActivityonCreate()时做的)

优点

这种初始化的方式, 最大的优点就是可以尽量地避免 Application 的onCreate() 方法过于臃肿。

缺点

还好吧, 就是会多创建一个 ContentProvider。如果项目所依赖的很多 Library 都通过这种方式来自动初始化, 那么在应用启动时会实例化很多 ContentProvider。感觉对于资源是一种浪费。