Android 利器,我开发了云同步编译工具

我相信使用过 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

如何安装工具

安装成功之后,将会在工具栏上出现下面的图标。

工具如何使用

  • 按照图示,点击 「插件配置」,或者按快捷键
    • Win:alt shift 5
    • Mac:option shift 5
  • 上一步操作完之后,将会弹出一个对话框,输入对应的 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

上面都设置完之后,就可以开始使用云同步编译工具,进行远程编译,或者将本地文件同步到远程设备,如下图示。

点击「远程编译」将会出现如下界面

远程设备工具安装

为了简化服务器的部署,我也提供了一键部署服务器环境,按需在远程设备上安装 JDK11Andriod SDKAndriod 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 root@192.160.0.100
  • 如果已经添加了,尝试执行下面命令即可解决,方案来自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 处理的方案都是一样的。

问题三:

在使用云同步编译工具(SyncKit)时,提示缺少工具而导致失败,执行下面命令安装对应的工具即可。

yum install -y rsync unzip wget

代码已经上传到 Github 欢迎前往仓库 hi-dhl/SyncKit 查看,如果有帮助欢迎在仓库 hi-dhl/SyncKit 右上角点个 star,如果你在使用过程中有任何问题,或者有其它的需求,欢迎给我提 issue。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容