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.gradleapp/build.gradle.kts),下面分 Kotlin DSLGroovy 两节对照。

若还没有密钥库,可在本机用 keytool 生成一份,-keystore-alias 请换成你的路径与别名。

1
keytool -genkeypair -v -keystore release.keystore -alias release -keyalg RSA -keysize 2048 -validity 10000

*.jks*.keystore*.p12 放在不要提交到 Git 的目录(例如仓库外,或仓库内已加入 .gitignorekeystores/)。

推荐项目根目录(与 settings.gradle.kts 同级)新建 keystore.properties,只在本机或 CI 注入,并把该文件名写进 .gitignore

storeFile 一般写成相对 App 模块目录 的路径,密钥库放在仓库内忽略目录时,常用 ../keystores/xxx.p12 这种写法。

1
2
3
4
5
storePassword=在此填写密钥库口令
keyPassword=若与库口令相同可重复填写
keyAlias=release
storeFile=../keystores/release.p12
storeType=PKCS12

使用传统 JKS 时通常可省略 storeType 一行,或写 storeType=JKS

若密钥库为 PKCS12.p12),请保留 storeType=PKCS12,与 keytool -storetype PKCS12 生成的文件一致。

build.gradle.kts

plugins { ... }android { ... } 之间读入根目录的 keystore.properties,避免把口令写进版本库。

signingConfigs 名称这里用 release,与 buildTypes 里的 release 对应,便于阅读。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.FileInputStream
import java.util.Properties

val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}

android {
signingConfigs {
create("release") {
if (keystorePropertiesFile.exists()) {
storeFile = file(keystoreProperties["storeFile"] as String)
(keystoreProperties["storeType"] as String?)?.let { storeType = it }
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
}
}
}

buildTypes {
val releaseSigning = signingConfigs.getByName("release")
getByName("release") {
signingConfig = releaseSigning
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
getByName("debug") {
isMinifyEnabled = false
// 若要让 Debug 变体也使用发布证书(便于真机调试),取消下一行注释。
// signingConfig = releaseSigning
}
}
}

本地若没有有效的 keystore.properties 或路径填错,Sync / 打 Release 包 阶段可能报错,请对照路径与字段名逐项检查。

CI 上可将同名键改为由环境变量写入临时 keystore.properties,或改用 providers.environmentVariable(...) 读取,避免在日志中打印密钥。

build.gradle

Groovy 脚本与上一节语义相同:在 android { } 之前加载根目录属性文件,再在 signingConfigs.releasebuildTypes.release 中引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
signingConfigs {
release {
if (keystorePropertiesFile.exists()) {
storeFile file(keystoreProperties["storeFile"])
if (keystoreProperties["storeType"] != null) {
storeType keystoreProperties["storeType"]
}
storePassword keystoreProperties["storePassword"]
keyAlias keystoreProperties["keyAlias"]
keyPassword keystoreProperties["keyPassword"]
}
}
}

buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
}
debug {
minifyEnabled false
signingConfig signingConfigs.release
}
}
}

若不需要让 Debug 与 Release 共用发布证书,保持 debug 里不设置 signingConfig 即可,继续使用 Android 默认 debug 密钥库,降低发布密钥在日常调试中泄露的风险。

开启

前提:

  • 已完成上文 签名配置(Release 必须签名)
  • release 构建类型已绑定 signingConfig(见上一节)

操作步骤:

  1. 打开 Build Variants 面板(View → Tool Windows → Build Variants)
  2. 将模块的 Active Build Variantdebug 改为 release
  3. 点击 ▶️ Run(或 Debug)

注意:

  • 默认 Release 包 关闭日志、禁用调试器,可能无法断点调试。