摘要: 如果你的 Android 構(gòu)建中涉及到字節(jié)碼插裝(bytecode instrumentation),或者應(yīng)用中提供了進(jìn)行插裝的插件,并希望它能支持 Instant Run,那么你必須切換到 Transform API。
目前,字節(jié)碼插裝雖然可以添加到構(gòu)造過程中,但還沒有對應(yīng)的 API。通用的方法是找到 dx 任務(wù),抓取其輸入,并替換成自己的輸出。隨后,任務(wù)依賴就不得不重新連接,以便將新的中間任務(wù)納入。
該方法存在一定的問題,原因如下:
-無法區(qū)分某些輸入(如子模塊與外部庫)
-主要 dex 類列表的計算也必須包含插裝輸出,因此增加了處理多個遺留dex的難度。
-將一個以上第三方插裝合并時會非常不穩(wěn)定,而且容易被破壞。
除此之外,該方法不支持 Instant Run。盡管原始構(gòu)造的APK的確能通過常規(guī)的構(gòu)建步驟,熱調(diào)換(hotswap)模式卻可運(yùn)行不同的任務(wù)。
在常規(guī)構(gòu)造中,Instant Run添加了以下步驟:
-用項目類插裝為代碼替換添加間接法。
-復(fù)制類,以便在隨后進(jìn)行比較并生成覆蓋類
然而,必須在任何第三方插裝之后,才能執(zhí)行此步驟,而以前的插裝機(jī)制(在最后dx之前添加)不可能出現(xiàn)這種情況。
在hotswap構(gòu)造時, Instant Run 會運(yùn)行 java 編譯程序,并將輸出與先前構(gòu)造的輸出進(jìn)行比較,以生成覆蓋類。隨后, Instant Run 會運(yùn)行不同的dx任務(wù),該任務(wù)僅對覆蓋類進(jìn)行遠(yuǎn)距離交換。這一流程和常規(guī)的構(gòu)造有很大差別,而且之前的連接插裝方法也完全沒有使用該流程。
為了解決這個問題,我們創(chuàng)建了 Transform API 。目的在于提供將第一方和第三方插裝連通并整合至構(gòu)造流程的 API 。該 API 不處理Gradle任務(wù),但處理需要插裝的其他東西,用插件進(jìn)行任務(wù)實體化和布線處理。
訪問http://tools.android.com/tech-docs/new-build-system/transform-api可了解更多關(guān)于transform API的信息
目前, Transform API 還在測試階段,我們希望能盡快進(jìn)入平穩(wěn)運(yùn)行階段,因此希望能得到你的建議。請加入我們的開發(fā)谷歌組,并提出建議:https://groups.google.com/forum/#!forum/adt-dev
OneAPM Mobile Insight 以真實用戶體驗為度量標(biāo)準(zhǔn)進(jìn)行 Crash 分析,監(jiān)控網(wǎng)絡(luò)請求及網(wǎng)絡(luò)錯誤,提升用戶留存。訪問 OneAPM 官方網(wǎng)站感受更多應(yīng)用性能優(yōu)化體驗,想閱讀更多技術(shù)文章,請訪問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客