- 原文作者 : Oleg ?elajev
- 譯者 : edvardhua
- 校對者: DeadLion, circlelove
只要你的項目相對較小,開發(fā)Android應(yīng)用的用戶體驗還是很棒的。然而隨著項目功能的增加,你會發(fā)現(xiàn)構(gòu)建項目的時間也會隨著增長。這種情況會導(dǎo)致你的大部分時間都花在如何更快的構(gòu)建項目,而不是為應(yīng)用增加更多的價值。
網(wǎng)上有很多教你如何加快Gradle構(gòu)建速度的教程。有一些很好的文章,譬如“Making Gradle builds faster”。 通過這些方法我們可以節(jié)省幾秒甚至幾分鐘的構(gòu)建時間,但是仍然存在一些構(gòu)建上的瓶頸。舉個例子,基于注釋的依賴注入使得項目架構(gòu)清晰,但是這對項目構(gòu)建時間是有很大影響的。
但是你可以嘗試一下使用JRebel for Android。每次改動代碼后不需要重新安裝新的 apk。而是在安裝完一次應(yīng)用后,通過增量包傳遞到設(shè)備或者模擬器上,并且能夠在應(yīng)用運行時進行更新。這個想法(熱部署)已經(jīng)在JRebel的java開發(fā)工具上面使用超過8年的時間。
拿Google IO 2015 app來看看如何使用JRebel for Android,以及它能為我們節(jié)省多少寶貴的時間。
安裝 JRebel for Android
JRebel for Android 是一個Android Studio的插件,你可以直接點擊IDE的 Plugins > Browse Repositories 鍵入“JRebel for Android”來搜索和安裝插件。
如果因為某些原因你無法訪問 maven 的公有倉庫,你可以直接在 JetBrians 官網(wǎng)下載,然后通過 Plugins > Install plugin from disk… 來安裝插件。
當(dāng)你安裝完插件后,你需要重啟Android Studio,在重啟之后,你需要提供你的姓名和郵箱來得到JRebel for Android的21天免費使用。
用 JRebel for Android 來運行你的應(yīng)用程序
安裝完插件后,只需要點擊 Run with JRebel for Android 按鈕,它會檢測這次代碼與上次是否有改動,然后決定是否構(gòu)建一個新的apk。Run with JRebel for Android 其實和Android Studio中的 Run 操作是一樣的。所以有同樣的運行流程,首先需要你選擇一個設(shè)備,然后再構(gòu)建apk安裝到那臺設(shè)備上去。
為了更新代碼和資源,JRebel for Android 需要處理項目 classes,并嵌入一個代理應(yīng)用。JRebel for Android只會運行在調(diào)試模式下,所以對于正式發(fā)布的版本來說是沒有影響的。另外,使用該插件也不需要你在項目中做任何改動。想要知道更多JRebel for Android的細(xì)節(jié),請看under the hood post。(譯者注:InfoQ的一篇介紹JRebel for Android的文章寫的不錯。)
所以在Google IO 2015應(yīng)用上點擊 Run with JRebel for Android 將會得到如下的結(jié)果:
在JRebel for Android應(yīng)用代碼修改
Apply changes 按鈕是使用 JRebel for Android的關(guān)鍵,它將會做最少的工作來將你代碼的改動更新到你的設(shè)備上去。如果你沒有使用 Run with JRebel for Android 來部署應(yīng)用的話,Apply changes 將會幫你做這部分的工作。
現(xiàn)在讓我們在應(yīng)用上做一個簡單的功能改動。針對于GoogleIO中每一個舉行的子會場你都可以發(fā)送反饋問卷,我們給這個問卷添加多一個輸入框輸入你的姓名,當(dāng)你完成反饋的時候會彈出Toast來感謝你的反饋。
步驟一: 在 session_feedback_fragment.xml 中添加一個EditTex組件。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:id="@+id/name_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</FrameLayout>
步驟2: 調(diào)整間距
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="@dimen/padding_normal"
android:paddingStart="@dimen/padding_normal"
android:paddingRight="@dimen/padding_normal"
android:paddingEnd="@dimen/padding_normal"
android:paddingTop="@dimen/spacing_micro"
android:paddingBottom="@dimen/padding_normal">
步驟3: 添加提示
<EditText
android:id="@+id/name_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/name_hint"/>
這些改動現(xiàn)在都是在同一個頁面上,每一次按下 Apply change 按鈕后,JRebel for Android都會調(diào)用Activity.recreate()。在最頂部的activity將會同樣的回調(diào)方法,就像設(shè)備從縱向切換到橫向那樣。
到目前為止我們都還只是改動resource文件,下面我們來改動Java代碼。
步驟4: 在 SessionFeedbackFragment.sumbitFeedback() 方法中彈出Toast
EditText nameInput = (EditText)
getView().findViewById(R.id.name_input);
Toast.makeText(getActivity(), "Thanks for the feedback " +
nameInput.getEditableText().toString(), Toast.LENGTH_SHORT).show();
應(yīng)用重啟動 vs Activity重啟動
并不是所有的改動都會觸發(fā)調(diào)用Activity.recreate()的。如果你在AndroidManifest改動了一些內(nèi)容,一個新的 apk 將會被構(gòu)建并增加安裝。在這種情況下,應(yīng)用將會重新啟動。或者你替換或改動了已經(jīng)被實現(xiàn)的superclass或者interfaces的時候也會導(dǎo)致應(yīng)用重啟動。下面有一份完整的對照表:
為什么我要嘗試使用 JRebel for Android
下面我列出了最有說服力的理由,來讓你使用它。
- 可以快速看到自己代碼改動的效果。
- 可以有時間打磨素完美的UI,而不用浪費時間在構(gòu)建上。
- 不需要在項目中做任何改動來支持 JRebel for Android。
- 在調(diào)試程序的同時還能更新代碼和資源文件。沒錯,JRebel for Android支持調(diào)試器的全部特性。
譯者注
另外,Google 在前不久發(fā)布的 Android Studio 2.0 中也增加了類似 JRebel 功能,稱之為 Instant Run。可謂良心,畢竟不用花銀子去購買收費的 JRebel for Android, 不僅為我們節(jié)約了銀子還節(jié)約了時間。使用方法也很簡單,具體的可以查看官方文檔
但是 JRebel for Android 與 Instant Run 之間還是存在區(qū)別的,我在 JRebel 的官網(wǎng)中找到一篇對比的文章,他們之間的差別可以用下面這張圖概括。
從對比圖中了解到其實 JRebel for Android 所支持的特性是比 Instant Run 多的多的,當(dāng)然,希望 Google 后續(xù)能夠讓 Instant Run 支持更多的特性。