有没有受 Android 工程编译慢困扰的老安卓,推荐个我自己做的方案

2 天前
 sickworm

背景是这样的,21 年的时候我突然灵光一闪,想着“如果我编译的文件足够少,应该要编译的足够快”,然后在 3 个月肝了一个 MVP 出来(还拿去答辩通过了)。 这是当时录的 视频

方案核心是用了三个黑魔法:

  1. 源码编译只用 javac/kotlinc 编单个文件;
  2. 资源编译用 aapt2 ,但被我改成了支持增量 link 的定制版本;
  3. 部署会优先走 Android Studio 的 Apply Changes ,可以热重载; 这一套下来耗时可以压在 3 秒内。

不过当时基本只是个玩具,动不动就失败崩溃。而且当时公司比较流行把工程放到云服务器编译,只拉 apk 下来,导致我这个需要本地 build 产物的方案不太好落地。后面就是 2 年断断续续的沉沦和奋起,反正没有占上班资源,都是自己下班时间搞,所以也没 KPI 。

直到 23 年我突然想到(有点晚)可以用 rsync 把文件也拉到本地,所以又奋起了一波,在 23 年终于做了个 v1 版本,给组内同学开始试用起来。后面老板也给力帮忙推了一波,人开始渐渐多了起来,继续疯狂迭代了 2 年(一年 1000+ 个 commit ),迭代到现在已经挺稳定了。

简述插件优势就是:

  1. 平均 3s 编译耗时(需要先 gradle 编译一次生成产物,改源码增量,改 gradle 文件重新降级);
  2. 直接装 IDE 插件就能用,不用改工程;
  3. 磨了 5 年,公司内部推广了 2 年半,接了十来个生产工程,编译了 80W 次(插件有个编译次数的上报),已经比较稳定了。

今年想走公司仓库开源,估计就是这两个月的事情。目前还没开源,但插件可以直接下载用。我在外网放了一份,看看有没有感兴趣的老哥试用一下,提前给点反馈。接入文档

3978 次点击
所在节点    Android
61 条回复
luckyc
2 天前
卧槽, 大佬.
superkkk
2 天前
我习惯用 github 的 action 流水线自动编译,就是很慢,让 ai 帮忙改配置文件就行了,自己本地不用搭建一坨安卓的环境
sickworm
2 天前
@luckyc 🧎‍♀️
sickworm
2 天前
@superkkk 我们这暂时还没法全走云端,不过也是迟早的事情。到时候不知道我这方案还能不能继续产生价值,万一 ai 干啥都是 one shot 都没有调试的事了
BestEicky
2 天前
真大佬啊,就是这个下载太慢了,6kb/s
WebKit
2 天前
就不能直接放个 github 或者其他不需要登录的文档吗
sickworm
2 天前
@WebKit 抱歉了,因为后面打算换个组织开源所以仓库目前是私有的没法访问
sickworm
2 天前
@BestEicky 我这是阿里云 100M 水管,奇怪了,其他人暂时没遇到
SuperLino
2 天前
用起来了,神器! Android 终于有了类似 web 的开发体验! nb
NathanDo
2 天前
所以这个插件必须依托 Android Studio 吗? 能不能让 AI 通过 command 使用
sickworm
2 天前
@SuperLino 卧槽这么快,欢迎提意见
sickworm
2 天前
@NathanDo 做了 agent 能力,已经支持 cli 调用了,但本质还是调去 android studio 的插件 runtime 。不打开 android studio 的纯 cli 不少人也有诉求,正在做
sickworm
2 天前
@NathanDo 接入文档最下面有个使用介绍
hlayk
2 天前
试了下很强 问一下例如要发正式版本了 是不是主动降级 Gradle 编译 然后在打包 这样安全些?还有这个主动降级和 Build->Clean project / File Invalidate Caches 有什么关系吗?我为了完全重新编译是不是还是 点击一下 File Invalidate Caches 更稳妥?
sickworm
2 天前
@hlayk 感谢关注,回答一下
1. 插件是 for debug 的,发正式版本不要用,首先默认情况下增量文件是保存在设备的,apk 不含增量变更;其次 release 包混淆后情况变得非常复杂,不可靠
2. 主动降级是命令行运行 gradle 进行编译 e.g. ./gradlew :app:assembleDebug (会从 IDE 读具体的命令),把 gradle 产物刷一遍
3. Build->Clean project 会把 gradle 产物清掉,插件会自动失效,需要降级一次
4. File Invalidate Caches 只清理 IDEA 的缓存,对插件以及 gradle 都无任何影响
5. 完全重新编译 clean 就够用了,产物都删掉了
hlayk
2 天前
@sickworm 我刚刚试了下 打包选择 AAB 或者 apk 里面选 release 也是几秒就出结果了 发正式版如何关掉插件?
kalixi
2 天前
我连连接了几台手机,run 一下,给每一一台都轮流装了,选择设备以及无效了,神奇
zy0829
2 天前
我可不可以理解为这就是热更新
sickworm
2 天前
@kalixi 收到,我试试
sickworm
2 天前
@hlayk 不运行 jugg:* 的配置就可以了,右上角 Run Configuration 切换回 Android 的运行配置
你说的打包应该是完全不走插件的

总结就是没有黑魔法 - 只有选了 jugg:* ,点击 Run/debug 按钮才会走插件的编译,其他任何 Android Studio 操作都不侵入

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.6688988.xyz/t/1229264

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX