kotlin安卓应用打包编译卡死的可能原因

运行这个命令后,经常卡到88%或者94%这种位置,每次都卡在:app:kspAppMaxDebugKotlin,在编译前段Gradle会先执行KSP任务(比如 kspDebugKotlin),也就是说ksp解析就没过。

在这个过程中

它做什么:

1.扫描你代码里的注解(比如 @Entity、@Parcelize),然后生成一堆新的 .kt 文件(比如 UserDao_Impl.kt)。

2.它不管什么:它不负责把 .kt 转成 .class,也不负责资源合并、签名、压缩这些事。

再加上我之前正好在Dao文件加了几个非常非常长SQL语句, 有 30 多个 or like

Room 编译时会生成一个极其复杂的查询计划。对于 SQLite 来说,这种写法会触发 "too many terms in compound SELECT" 之类的内部限制(虽然 SQLite 本身没有硬性限制,但 Room 的代码生成器会对 or 嵌套层级有限制)。

更重要的是,这种全字段模糊搜索在 Android 上根本不可行:

1.30 个 or like全部无法使用索引,全表扫描,每搜索一次都要扫描几千条记录。

2.搜索 30 个字段,每条记录要读取 30 个文本字段到内存进行比较

3.这个 Dao 被多个表使用,每个表都有类似查询,编译时间成倍增长

几十个or like会导致某些版本的 Room parser 会进入指数级分析,可能造成 Room Sql Parser 死循环,真是基础不行地动山摇。

还有一种可能是Room 在推导返回类型,例如:

fun searchAllFieldsAll(): List

Room 会检查:

每一列

nullable

converter

entity

SQL 越长:

SELECT *

虽然最终还是 Entity,

但是解析树非常大。

下面是卡住的情况

.\gradlew.bat assembleAppDebug

Task :app:stripAppDebugDebugSymbols

Unable to strip the following libraries, packaging them as they are: libandroidx.graphics.path.so, libarchive-jni.so, libimage_processing_util_jni.so, librenderscript-toolkit.so, librtmp-jni.so, libsurface_util_jni.so. Run with --info option to learn more.

<===========--> 88% EXECUTING 2m 31s

IDLE

IDLE

IDLE

IDLE

:app:kspAppMaxDebugKotlin

IDLE

相关推荐
骑着蜗牛撵大象3271 小时前
服务下线不再炸:分层关闭、TCP 存活探测与负载均衡排水的落地套路
android·tcp/ip·负载均衡·tcp·高可用·健康检查·优雅关闭
三少爷的鞋3 小时前
别再这么写协程了!Marcin Moskała 剖析的 几个常见协程误区与重构
android
mmsx4 小时前
Android 防二次打包第一道锁:签名校验与完整性校验
android·kotlin
mmsx4 小时前
Android 混淆不等于安全:二次打包链路完整走一遍
android·kotlin
小宋10216 小时前
Agent轨迹级评测实战:工具选择、预算超限与回归门禁
android·网络·人工智能·回归
墨天梦8 小时前
D05_ViewModel与单向数据流
android·kotlin
蒸鱼Yuzheng9 小时前
Android 构建可复现性:APK 指纹、文件级差异与供应链审计
android·apk·devops·软件供应链·可复现构建
墨天梦12 小时前
D03_Compose列表与稳定身份
android·gitee·kotlin
萌新杰少12 小时前
Kuikly股票查看软件开发体验——SaiRen
android·kotlin·客户端
vilya12 小时前
把 Python 塞进 APK:Chaquopy 打包实践
android·python