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

相关推荐
KevinWang_3 小时前
Android Hilt 依赖注入
android
古法安卓3 小时前
Android-深入理解 Android 回调(Callback)机制
android·性能优化·android studio
古法安卓3 小时前
Android-车机 GNSS 定位数据接收问题排查
android·java·android studio
FungLeo5 小时前
Flutter 吸顶分组列表实战:语义桶分组 + 点击头平滑滚动
android·flutter
阿巴斯甜6 小时前
Android 自定义权限
android
FungLeo6 小时前
Flutter 超长 StatefulWidget 拆分术:part of + extension on State 实战
android·flutter·dart
小王C语言8 小时前
MySQL 数据类型:数值类型、字符串类型、日期和时间类型、enum 和 set、find_in_set 查询
android·数据库·mysql
我命由我123458 小时前
Android 控件 - CardView(快速实现圆角)
android·java·java-ee·kotlin·android studio·android-studio·android runtime
码云数智-园园8 小时前
Android 全方位性能优化合集
android·性能优化
hunterandroid9 小时前
[Android 从零到一] Compose 动画实战:从 AnimatedVisibility 到复杂转场与手势联动
android