做者 / Yacine Rezguinode
應用啓動時間是應用性能的關鍵衡量指標。應用啓動後,用戶指望可以獲得快速響應並加載內容,當不符合預期時用戶會感到失望。這種糟糕的體驗可能會致使用戶在 Play 商店上對您的應用給予低分數的評價,甚至不會再次使用。android
Jetpack App Startup 庫在應用啓動時以一種簡單、高效的方法來初始化組件。庫開發者和應用開發者均可以使用 App Startup 簡化啓動流程,並顯式指定初始化順序。app
應用和庫每每須要在 Application.onCreate()
以前初始化組件,如: WorkManager
、ProcessLifecycleObserver
、FirebaseApp
等。這每每經過使用 ContentProvider 來實現不一樣依賴的初始化。經過 App Startup,您無需爲每一個組件單獨定義 ContentProvider 進行初始化,而能夠定義多個 Initializer 去共享相同的 ContentProvider。每減小一個 ContentProvider 一般會有約 2ms 的收益,這能夠顯著提升應用啓動速度。App Startup 還能夠簡化 延遲初始化組件 操做,從而幫助您進一步提升啓動性能。當 App Startup 進入穩定版本後,咱們將更新諸如 WorkManager 和 ProcessLifecycle 之類的庫,以從中受益。maven
App Startup 支持 API 14 及以上。ide
爲了在您的依賴庫或應用中使用 App Startup,您須要在 Gradle 文件中添加以下依賴項:性能
repositories { google() maven() } dependencies { implementation "androidx.startup:startup-runtime:1.0.0" }
爲了在應用中使用 App Startup,您須要定義一個 Initializer。您能夠在此定義如何初始化以及指定依賴其餘的 Initializer。這是您須要實現的接口:ui
interface Initializer<out T: Any> { fun create(context: Context): T fun dependencies(): List<Class<out Initializer<*>>> }
在實際案例中,初始化 WorkManager 的 Initializer 可能以下:google
class WorkManagerInitializer : Initializer<WorkManager> { override fun create(context: Context): WorkManager { val configuration = Configuration.Builder() .setMinimumLoggingLevel(Log.DEBUG) .build() WorkManager.initialize(context, configuration) return WorkManager.getInstance(context) } // 此組件無需任何依賴 override fun dependencies() = emptyList<Class<out Initializer<*>>>() }
提示 : 此示例爲純粹說明性質,該 Initializer 實際上應該由 WorkManager 依賴庫定義。code
最後,咱們須要在 AndroidManifest.xml
中增長 WorkManagerInitializer
條目:component
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- This entry makes WorkManagerInitializer discoverable. --> <meta-data android:name="com.example.WorkManagerInitializer" android:value="androidx.startup" /> </provider>
App Startup 使用了一個名爲 InitializationProvider 的 ContentProvider。該 ContentProvider 在合併後的 AndroidManifest.xml 文件中查找 <meta-data> 條目來發現 Initializer。此過程發生在 Application.onCreate() 被調用以前。
完成上一階段以後,加載組件以前會先加載該組件的全部依賴項。所以,能夠確保組件的全部依賴項都已完成初始化後纔對其進行初始化。
咱們強烈推薦您使用延遲初始化來進一步提高啓動性能,您能夠經過以下方式實現組件的延遲初始化,在 <meta-data>
條目下爲 Initializer
增長 tools:node="remove"
屬性,這將禁用即時初始化:
<provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- 禁用即時初始化 --> <meta-data android:name="com.example.WorkManagerInitializer" tools:node="remove" /> </provider>
爲了實現 WorkManagerInitializer
的延遲初始化,您能夠進行以下操做:
// 此處返回一個 WorkManager 的實例 AppInitializer.getInstance(context) .initializeComponent(WorkManagerInitializer.class);
至此,您的應用已經延遲初始化該組件了。您能夠閱讀咱們的 詳細文檔。
App Startup 目前處於 1.0.0 版本。您能夠從咱們的 文檔 中找到有關如何使用它的更多信息。若是您在使用中出現任何問題,請及時向咱們 反饋問題,以幫助咱們更好地改進。