[譯] 怎樣用 JRebel for Android

只要你的項目相對較小,開發Android應用的用戶體驗還是很棒的。然而隨著項目功能的增加,你會發現構建項目的時間也會隨著增長。這種情況會導致你的大部分時間都花在如何更快的構建項目,而不是為應用增加更多的價值。

網上有很多教你如何加快Gradle構建速度的教程。有一些很好的文章,譬如“Making Gradle builds faster”。 通過這些方法我們可以節省幾秒甚至幾分鐘的構建時間,但是仍然存在一些構建上的瓶頸。舉個例子,基于注釋的依賴注入使得項目架構清晰,但是這對項目構建時間是有很大影響的。

但是你可以嘗試一下使用JRebel for Android。每次改動代碼后不需要重新安裝新的 apk。而是在安裝完一次應用后,通過增量包傳遞到設備或者模擬器上,并且能夠在應用運行時進行更新。這個想法(熱部署)已經在JRebel的java開發工具上面使用超過8年的時間。

拿Google IO 2015 app來看看如何使用JRebel for Android,以及它能為我們節省多少寶貴的時間。

安裝 JRebel for Android

JRebel for Android 是一個Android Studio的插件,你可以直接點擊IDE的 Plugins > Browse Repositories 鍵入“JRebel for Android”來搜索和安裝插件。

如果因為某些原因你無法訪問 maven 的公有倉庫,你可以直接在 JetBrians 官網下載,然后通過 Plugins > Install plugin from disk… 來安裝插件。

當你安裝完插件后,你需要重啟Android Studio,在重啟之后,你需要提供你的姓名和郵箱來得到JRebel for Android的21天免費使用。

用 JRebel for Android 來運行你的應用程序

安裝完插件后,只需要點擊 Run with JRebel for Android 按鈕,它會檢測這次代碼與上次是否有改動,然后決定是否構建一個新的apk。Run with JRebel for Android 其實和Android Studio中的 Run 操作是一樣的。所以有同樣的運行流程,首先需要你選擇一個設備,然后再構建apk安裝到那臺設備上去。

為了更新代碼和資源,JRebel for Android 需要處理項目 classes,并嵌入一個代理應用。JRebel for Android只會運行在調試模式下,所以對于正式發布的版本來說是沒有影響的。另外,使用該插件也不需要你在項目中做任何改動。想要知道更多JRebel for Android的細節,請看under the hood post。(譯者注:InfoQ的一篇介紹JRebel for Android的文章寫的不錯。)

所以在Google IO 2015應用上點擊 Run with JRebel for Android 將會得到如下的結果:

在JRebel for Android應用代碼修改

Apply changes 按鈕是使用 JRebel for Android的關鍵,它將會做最少的工作來將你代碼的改動更新到你的設備上去。如果你沒有使用 Run with JRebel for Android 來部署應用的話,Apply changes 將會幫你做這部分的工作。

現在讓我們在應用上做一個簡單的功能改動。針對于GoogleIO中每一個舉行的子會場你都可以發送反饋問卷,我們給這個問卷添加多一個輸入框輸入你的姓名,當你完成反饋的時候會彈出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: 調整間距

<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"/>

這些改動現在都是在同一個頁面上,每一次按下 Apply change 按鈕后,JRebel for Android都會調用Activity.recreate()。在最頂部的activity將會同樣的回調方法,就像設備從縱向切換到橫向那樣。

到目前為止我們都還只是改動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();

應用重啟動 vs Activity重啟動

并不是所有的改動都會觸發調用Activity.recreate()的。如果你在AndroidManifest改動了一些內容,一個新的 apk 將會被構建并增加安裝。在這種情況下,應用將會重新啟動。或者你替換或改動了已經被實現的superclass或者interfaces的時候也會導致應用重啟動。下面有一份完整的對照表:

為什么我要嘗試使用 JRebel for Android

下面我列出了最有說服力的理由,來讓你使用它。

  • 可以快速看到自己代碼改動的效果。
  • 可以有時間打磨素完美的UI,而不用浪費時間在構建上。
  • 不需要在項目中做任何改動來支持 JRebel for Android。
  • 在調試程序的同時還能更新代碼和資源文件。沒錯,JRebel for Android支持調試器的全部特性。

譯者注

另外,Google 在前不久發布的 Android Studio 2.0 中也增加了類似 JRebel 功能,稱之為 Instant Run。可謂良心,畢竟不用花銀子去購買收費的 JRebel for Android, 不僅為我們節約了銀子還節約了時間。使用方法也很簡單,具體的可以查看官方文檔

但是 JRebel for Android 與 Instant Run 之間還是存在區別的,我在 JRebel 的官網中找到一篇對比的文章,他們之間的差別可以用下面這張圖概括。

JRebel for Android vs Instant Run

從對比圖中了解到其實 JRebel for Android 所支持的特性是比 Instant Run 多的多的,當然,希望 Google 后續能夠讓 Instant Run 支持更多的特性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,596評論 25 708
  • afinalAfinal是一個android的ioc,orm框架 https://github.com/yangf...
    passiontim閱讀 15,579評論 2 45
  • 病房每人發了份問卷調查,第一個問題是:「你覺得你正常嗎?」
    U0閱讀 375評論 1 8
  • 發過兩期彩鉛人物,彩鉛只是國畫創作過程中的調和劑,放松神經( ??? ? ??? ) 發一些最近畫的國畫,雅俗共賞...
    孟德兄留步閱讀 443評論 4 6