天天看點

Android 利器,我開發了雲同步編譯工具

我相信使用過 MAC 的小夥伴們,無論是編譯 Java 項目,還是 Android 項目,在編譯稍微大點的項目,多多少少都會遇到下面的彈窗提示,當然 Win 也有類似的錯誤,隻不過提示的方式不一樣。我的 MAC 在當時買的時候是最高配,無奈現在的軟體需要占用的資源越來越多。

Android 利器,我開發了雲同步編譯工具
Android 利器,我開發了雲同步編譯工具

當你的電腦上同時出現上面兩個提示,意味着你的電腦已經有些年代了,目前我正在使用的 MAC 陪伴我度過了 8 年的時間,雖然我的主要方向是 Android,但是在此期間我開發過 PHP、Python、C++、逆向、JavaEE、Kotlin、前端等等項目,是以電腦上裝了很多互相依賴的開發工具包。

如果換電腦,對個人而言成本是非常高的,意味着很多軟體以及開發工具包都需要重新安裝,并且新電腦的系統版本很高,很多軟體都用不了,需要尋找新的替代品。還會遇到很多因為系統問題而導緻的編譯錯誤。是以我需要尋找一個在不換電腦(配置很低的)的情況,提高項目編譯速度的方法,同時減少對電腦的資源占用,是以我就開發了一個雲同步編譯工具。

在開發這個工具之前,我嘗試在 github 上尋找類似的項目來解決現有的問題,我隻找到了項目

mainframer

,但是這個項目作者已經好幾年沒有在維護這個項目了,使用起來比較麻煩,

idea

配置也比較麻煩。并不能完全解決我遇到的問題,是以雲同步編譯工具

SyncKit

就誕生了。

SyncKit

是基于

Intellij idea

開發的插件,适用于

AndroidStudio

以及

jetbrains

旗下的所有

idea

軟體,主要将本地的項目同步到遠端裝置,在遠端裝置上進行編譯,然後将編譯的結果拉回本地。

遠端裝置可以是 Nas、另外一台備用電腦、雲端(阿裡雲、騰訊雲、華為雲等等)、 Docker 虛拟出來的容器等等。

我有一台 NAS,配上同步編譯工具(SyncKit),在配上内網穿透,就可以享受在任意地點進行資料同步和遠端編譯。

(PS:内網穿透是我自己搭的一個服務,可以通過任意一個網絡,通路家裡的 NAS)

SyncKit

支援以下功能:

  • 支援資料同步到遠端裝置
  • 支援增量同步,本地檔案有修改或者新增才會同步到遠端裝置
  • 檔案過濾功能,過濾掉不需要同步的檔案
  • 遠端編譯功能
  • 對于 Android 應用,一鍵完成遠端編譯、自動安裝、打開目标 Activity
  • 一鍵安裝常用工具,部署開發環境
    • 一鍵安裝 JDK11
    • 一鍵安裝 Android SDK
    • 一鍵安裝 Android NDK
  • 支援 Mac 、ubuntu

TODO:

  • [ ] 支援指令行
  • [ ] 支援 Win
  • [ ] 支援資料雙向同步
  • [ ] 支援多台遠端裝置間切換
  • [ ] 支援 AAB 打包

代碼已經上傳到 Github 歡迎前往倉庫 hi-dhl/SyncKit 檢視,如果有幫助歡迎在倉庫 hi-dhl/SyncKit 右上角點個 star,如果你在使用過程中有任何問題,或者有其它的需求,歡迎給我提 issue。

hi-dhl/SyncKit

https://github.com/hi-dhl/SyncKit

如何安裝工具

  • 方法一:點選下發連結,下載下傳最新版本

    SyncKit-version.zip

    ,檔案

    SyncKit-version.zip

    不需要解壓,拖拽到 idea 開發工具中,将會自動安裝,點選重新開機即可。
    • 下載下傳位址一:https://github.com/hi-dhl/SyncKit/releases(實時更新)
    • 下載下傳位址二:https://plugins.jetbrains.com/plugin/19948-synckit/versions(需要官方稽核,更新比較慢)
  • 方法二:

    idea 開發工具 -> Preferences -> Plugins

    搜尋 SyncKit,安裝重新開機即可

安裝成功之後,将會在工具欄上出現下面的圖示。

Android 利器,我開發了雲同步編譯工具

工具如何使用

  • 按照圖示,點選 「插件配置」,或者按快捷鍵
    • Win:

      alt shift 5

    • Mac:

      option shift 5

Android 利器,我開發了雲同步編譯工具
  • 上一步操作完之後,将會彈出一個對話框,輸入對應的 Host(IP 或者域名)、端口号、使用者名即可,其它都是可選的
Android 利器,我開發了雲同步編譯工具
  • 配置 ssh 無密碼通路遠端裝置(可選)

如果你已經配置了,這一步可忽略,如果你沒有配置,按照下面的步驟執行,否則你每次執行的時候,都需要輸入密碼。

  • 執行下面指令,擷取本地電腦的

    SSH public key

cat ~/.ssh/id_rsa.pub
           

如果你的電腦之前沒有安裝過 SSH,執行下面指令安裝 SSH,一路回車,即可。

ssh-keygen -t rsa -C "test@qq. Com"
           
  • 進入遠端裝置,執行下面指令,将上一步擷取到的

    SSH public key

    ,追加到

    authorized_keys

    檔案中
mkdir -p ~/.ssh && echo ${SSH_PUBLIC_KEY} >> ~/.ssh/authorized_keys
           

上面都設定完之後,就可以開始使用雲同步編譯工具,進行遠端編譯,或者将本地檔案同步到遠端裝置,如下圖示。

點選「遠端編譯」将會出現如下界面

Android 利器,我開發了雲同步編譯工具

遠端裝置工具安裝

為了簡化伺服器的部署,我也提供了一鍵部署伺服器環境,按需在遠端裝置上安裝 JDK11 、Andriod SDK 、Andriod NDK。

同樣也可以在本地執行腳本,安裝對應的工具,點選「初始化」會在目前目錄下生成

.sync

檔案夾,在

.sync/script

檔案夾下執行對應的腳本即可。

bash install_jdk_11. Sh
bash install_android_sdk. Sh
bash install_android_ndk. Sh
           
Android 利器,我開發了雲同步編譯工具

可選功能

自動打開 Activity

點選 「插件配置」将會彈出配置對話框,在 Launch Activity 中,按照提示,輸入要打開的 Activity,将會在安裝完 App 之後,自動打開 Activity。

Android 利器,我開發了雲同步編譯工具

檔案過濾功能

工具支援檔案過濾功能,當我們同步檔案到遠端裝置,可以過濾掉不需要同步的檔案,點選 「插件配置」将會彈出配置對話框,在檔案過濾文本框中,輸入你不需要同步的檔案。

Android 利器,我開發了雲同步編譯工具

工具預設會自動生成一些同步規則,應該滿足 80% 的場景,如果有其他不需要同步的檔案,在檔案過濾文本框中,按照下面的格式,輸入你不需要同步的檔案,按行分割,一行一個,同步的時候,将會忽略這些檔案。

  • 某個檔案不需要同步,輸入檔案名即可,例如

    local.properties

  • 如果某個類型的檔案不需要同步,輸入檔案擴充名即可,例如

    *.log

  • 如果某個檔案夾不需要同步,輸入檔案夾加上

    /

    即可,例如

    build/

填入遠端裝置 SDK 或者 NDK 路徑

在編譯 Android 項目中,會自動識别 SDK 或者 NDK 路徑,如果失敗了,編譯将會出錯,這時需要手動輸入遠端裝置 SDK 或者 NDK 路徑。

Android 利器,我開發了雲同步編譯工具

常見問題

問題一:

ssh_askpass: exec (/usr/X11R6/bin/ssh-askpass): No such file or directory
           

按照如下方式解決:

  • 确認在遠端裝置檔案

    ~/.ssh/authorized_keys

    ,是否正确添加了本機的

    SSH public key

    ,執行下面指令,如果不需要輸入密碼,表示正确添加了
ssh -p 端口号 user@host

例如:
ssh -p 22 [email protected]
           
  • 如果已經添加了,嘗試執行下面指令即可解決,方案來自stackoverflow.com
ssh-keyscan -t rsa bitbucket. Org >> ~/. Ssh/known_hosts
           

問題二:

Execution failed for task ' :app: parseDebugLocalResources'.
> Could not resolve all files for configuration ' :app: androidApis'.
   > Failed to transform android. Jar to match attributes {artifactType=android-platform-attr, org. Gradle. Libraryelements=jar, org. Gradle. Usage=java-runtime}.
      > Execution failed for PlatformAttrTransform: /root/build/android-sdk/platforms/android-32/android. Jar.
         > /root/build/android-sdk/platforms/android-32/android. Jar
           

這可能是因為第一次下載下傳

android-32

時網絡問題被中斷,導緻檔案

/root/build/android-sdk/platforms/android-32/android.jar

不存在,我們可以手動删除

android-32

檔案夾,然後重新執行遠端編譯,會重新下載下傳

android-32

,如果下載下傳速度比較慢,可以在目前項目中,添加

alyun maven

倉庫,其它版本的 SDK 處理的方案都是一樣的。

yum install -y rsync unzip wget
           
  • 倉庫 SyncKit:https://github.com/hi-dhl/SyncKit
  • 下載下傳位址:https://github.com/hi-dhl/SyncKit/releases