Android Studio 连接真机运行Release包
前言
Jetpack Compose 的 Release 包通常比 Debug 包性能好很多,尤其在 UI 渲染、启动速度和内存使用方面。
这种差异远大于传统 View 系统,主要原因在于 Compose 的编译机制和运行时特性。
Compose Compiler 优化仅在 Release 生效
- Compose 使用 Kotlin 编译器插件(
compose-compiler)对@Composable函数进行字节码转换。 - 在 Release 模式下:
- 启用 智能重组(Smart Recomposition) 的完整优化
- 插入 跳过逻辑(skippability):未变化的 Composable 可完全跳过执行
- 生成更高效的 restart scope(重组作用域)
- 在 Debug 模式下:
- 禁用大部分编译器优化,以便支持热重载(Live Edit)和调试
- 重组与跳过行为仍由状态驱动,但整体优化程度弱于 Release,实测帧率与启动等往往明显落后
注意:
📌 官方明确指出:“Compose 在 debug 和 release 模式下的性能存在显著差异”
签名
真机安装或对外分发时,Release 构建必须用发布证书签名,否则无法作为正式包使用。
下面用「密钥库文件 + Gradle 签名配置」完成发布签名,脚本写在 App 模块(app/build.gradle 或 app/build.gradle.kts),下面分 Kotlin DSL 与 Groovy 两节对照。
若还没有密钥库,可在本机用 keytool 生成一份,-keystore、-alias 请换成你的路径与别名。
1 | keytool -genkeypair -v -keystore release.keystore -alias release -keyalg RSA -keysize 2048 -validity 10000 |
将 *.jks、*.keystore 或 *.p12 放在不要提交到 Git 的目录(例如仓库外,或仓库内已加入 .gitignore 的 keystores/)。
推荐在项目根目录(与 settings.gradle.kts 同级)新建 keystore.properties,只在本机或 CI 注入,并把该文件名写进 .gitignore。
storeFile 一般写成相对 App 模块目录 的路径,密钥库放在仓库内忽略目录时,常用 ../keystores/xxx.p12 这种写法。
1 | storePassword=在此填写密钥库口令 |
使用传统 JKS 时通常可省略 storeType 一行,或写 storeType=JKS。
若密钥库为 PKCS12(.p12),请保留 storeType=PKCS12,与 keytool -storetype PKCS12 生成的文件一致。
build.gradle.kts
在 plugins { ... } 与 android { ... } 之间读入根目录的 keystore.properties,避免把口令写进版本库。
signingConfigs 名称这里用 release,与 buildTypes 里的 release 对应,便于阅读。
1 | import java.io.FileInputStream |
本地若没有有效的 keystore.properties 或路径填错,Sync / 打 Release 包 阶段可能报错,请对照路径与字段名逐项检查。
CI 上可将同名键改为由环境变量写入临时 keystore.properties,或改用 providers.environmentVariable(...) 读取,避免在日志中打印密钥。
build.gradle
Groovy 脚本与上一节语义相同:在 android { } 之前加载根目录属性文件,再在 signingConfigs.release 与 buildTypes.release 中引用。
1 | def keystorePropertiesFile = rootProject.file("keystore.properties") |
若不需要让 Debug 与 Release 共用发布证书,保持 debug 里不设置 signingConfig 即可,继续使用 Android 默认 debug 密钥库,降低发布密钥在日常调试中泄露的风险。
开启
前提:
- 已完成上文 签名配置(Release 必须签名)
release构建类型已绑定signingConfig(见上一节)
操作步骤:
- 打开 Build Variants 面板(View → Tool Windows → Build Variants)
- 将模块的 Active Build Variant 从
debug改为release - 点击 ▶️ Run(或 Debug)
注意:
- 默认 Release 包 关闭日志、禁用调试器,可能无法断点调试。