我相信使用過 MAC 的小夥伴們,無論是編譯 Java 項目,還是 Android 項目,在編譯稍微大點的項目,多多少少都會遇到下面的彈窗提示,當然 Win 也有類似的錯誤,隻不過提示的方式不一樣。我的 MAC 在當時買的時候是最高配,無奈現在的軟體需要占用的資源越來越多。
當你的電腦上同時出現上面兩個提示,意味着你的電腦已經有些年代了,目前我正在使用的 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
不需要解壓,拖拽到 idea 開發工具中,将會自動安裝,點選重新開機即可。SyncKit-version.zip
- 下載下傳位址一:https://github.com/hi-dhl/SyncKit/releases(實時更新)
- 下載下傳位址二:https://plugins.jetbrains.com/plugin/19948-synckit/versions(需要官方稽核,更新比較慢)
- 方法二:
搜尋 SyncKit,安裝重新開機即可idea 開發工具 -> Preferences -> Plugins
安裝成功之後,将會在工具欄上出現下面的圖示。
工具如何使用
- 按照圖示,點選 「插件配置」,或者按快捷鍵
- Win:
alt shift 5
- Mac:
option shift 5
- Win:
- 上一步操作完之後,将會彈出一個對話框,輸入對應的 Host(IP 或者域名)、端口号、使用者名即可,其它都是可選的
- 配置 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
上面都設定完之後,就可以開始使用雲同步編譯工具,進行遠端編譯,或者将本地檔案同步到遠端裝置,如下圖示。
點選「遠端編譯」将會出現如下界面
遠端裝置工具安裝
為了簡化伺服器的部署,我也提供了一鍵部署伺服器環境,按需在遠端裝置上安裝 JDK11 、Andriod SDK 、Andriod NDK。
同樣也可以在本地執行腳本,安裝對應的工具,點選「初始化」會在目前目錄下生成
.sync
檔案夾,在
.sync/script
檔案夾下執行對應的腳本即可。
bash install_jdk_11. Sh
bash install_android_sdk. Sh
bash install_android_ndk. Sh
可選功能
自動打開 Activity
點選 「插件配置」将會彈出配置對話框,在 Launch Activity 中,按照提示,輸入要打開的 Activity,将會在安裝完 App 之後,自動打開 Activity。
檔案過濾功能
工具支援檔案過濾功能,當我們同步檔案到遠端裝置,可以過濾掉不需要同步的檔案,點選 「插件配置」将會彈出配置對話框,在檔案過濾文本框中,輸入你不需要同步的檔案。
工具預設會自動生成一些同步規則,應該滿足 80% 的場景,如果有其他不需要同步的檔案,在檔案過濾文本框中,按照下面的格式,輸入你不需要同步的檔案,按行分割,一行一個,同步的時候,将會忽略這些檔案。
- 某個檔案不需要同步,輸入檔案名即可,例如
local.properties
- 如果某個類型的檔案不需要同步,輸入檔案擴充名即可,例如
*.log
- 如果某個檔案夾不需要同步,輸入檔案夾加上
即可,例如/
build/
填入遠端裝置 SDK 或者 NDK 路徑
在編譯 Android 項目中,會自動識别 SDK 或者 NDK 路徑,如果失敗了,編譯将會出錯,這時需要手動輸入遠端裝置 SDK 或者 NDK 路徑。
常見問題
問題一:
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