在 Android 工程里,Debug 与 Release 是 Gradle 内置好的 Build Variant(构建变体),它们的主要区别体现在编译配置、调试能力、性能优化和安全性等方面。
Build Variant 是由 Build Type(debug / release / 你自定的 staging…)和 Product Flavor(如果有,例如 free / paid)组成的,默认工程没有任何 flavor,所以新建工程项目都只有 debug 和 release 两种变体。
一、Debug 与 Release 区别
1、用途
Debug 版本用于开发调试阶段。Release 版本用于正式发布到应用商店(即“正式版本”)。
2、 签名配置
签名密钥是一个加密文件(通常为 .jks 或 .keystore 格式),包含私钥(用于签名)和公钥(用于验证)。
(1) Debug 版本(调试秘钥)
使用 Android Studio 自动生成的调试密钥签名(debug.keystore),有效期 30 年,所有人通用。用于开发阶段临时签名,不可用于发布。
(2)Release 版本(发布秘钥)
使用开发者自己提供并保管的正式密钥(xxx.jks 或 .keystore),用于应用商店发布的 APK/AAB 签名,必须严格保密。
3、构建配置差异(build.gradle.kt)
(1)Debug 版本
isDebuggable = true (默认)
进程可被 jdwp/lldb attach,断点、Profiler 全部可用。默认为true,BuildConfig.DEBUG = true。isMinifyEnabled = false(默认)
不跑 R8/ProGuard,代码保持原样,编译快。isShrinkResources = false (默认)
不删除未用资源,包体大。
(2)Release 版本
isDebuggable = false
进程拒绝调试,Play 商店会拒绝带 isDebuggable = true 的 APK。isMinifyEnabled = true,并配置 proguardFiles
开启 R8 压缩、混淆、优化,体积减小 20~50%,也增加逆向难度。isShrinkResources = true
把未用图片、字符串一并裁掉。
(3)build.gradle.kt 示例
android {
......
buildTypes {
debug {
isDebuggable = true
isMinifyEnabled = false
isShrinkResources = false
}
release {
isDebuggable = false
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
isShrinkResources = true
}
}
}
4、性能优化
Debug 版本
未启用代码优化(如 ProGuard/R8),便于调试,启动速度慢,APK包体大。运行时解释执行多,可能运行较慢、出现卡顿现象。
Release 版本
启用 ProGuard/R8 优化、压缩代码,启动运行速度更快,内存占用更低。启用混淆后的代码更难以逆向工程。
5、调试与日志
Debug 版本
可调试,包含完整的调试符号(如行号、变量名),方便断点调试。默认启用 Log.d()、Log.v() 等详细日志,方便排查问题(adb logcat 直接看),但敏感信息易泄露。支持 Android Profiler、内存分析器等工具。
Release 版本
日志输出通常被禁用或混淆,(如 Log 语句默认被移除),无法通过 Android Studio 附加调试器。启用代码混淆(ProGuard/R8),调试端口未开放(默认 isDebuggable = false),更安全。
6、总结区别
| 特性 | Debug 版本 | Release 版本(正式版) |
|---|---|---|
| 用途 | 开发调试 | 正式发布到应用商店 |
| 签名 | 调试密钥(自动生成) | 开发者正式密钥(需保密) |
| 性能优化 | 代码未优化,保留原始结构,性能较低 | 代码进行混淆、压缩、优化,性能较高 |
| 调试与日志 | 支持断点调试、日志输出、分析工具使用 | 无调试支持,默认禁用日志输出 |
| 安全性 | 未代码优化,安全性低,代码易被逆向 | 使用代码混淆,安全性高,代码不易被逆向 |
二、正式版本(Release 版本)
Release 版本经过签名、混淆和优化后,即可作为正式版本发布到 Google Play 等平台。简单发布流程:
生成签名密钥(.jks 或 .keystore 文件)。在 build.gradle.tk 中的 release 中配置发布签名。构建 Release APK/AAB(通过 Build > Generate Signed Bundle/APK)。进行全面测试(性能、功能、兼容性等)。上传到应用商店。
三、签名秘钥
1、签名秘钥
签名密钥是一个加密文件(通常为 .jks 或 .keystore 格式),包含私钥(用于签名)和公钥(用于验证)。分为调试秘钥和发布秘钥,调试秘钥用户开发调试阶段,发布秘钥为开发者创建和保管的秘钥,用于应用商店发布的 APK/AAB 签名,必须严格保密。
2、签名过程
Android 的 “签名” 并不是简单地把整包 APK 用私钥加密,而是按下列顺序进行处理:
首先,区块做摘要;接着,用私钥加密摘要(使用私钥对 APK 的哈希值进行加密,生成数字签名)然后,把证书链和签名块塞进 APK(将签名和公钥一同嵌入 APK);最后,安装时再反向验证。
可通过 Android Studio 的 Generate Signed Bundle/APK 或命令行工具(jarsigner、apksigner)完成 AAR/APK 的签名。
3、签名的作用
签名的作用是证明 APK 的完整性和来源真实性,并赋予跨版本升级、权限共享、沙箱隔离等核心能力。身份识别
证明 APK 的开发者身份(如 Google Play 要求同一应用的所有更新必须使用同一密钥签名)。公钥证书中的 Issuser / Subject 就是应用的 “身份证”,若没有正确签名,系统拒绝安装,提示“无签名”,防止他人冒充开发者发布恶意应用。完整性性校验
确保 APK 未被篡改,安装时 PackageManager 用公钥对 MAINIFEST 中每一个文件的摘要再做一次验证,被篡改后摘要不匹配,安装失败。如果没有正确签名,植入木马、二次打包的 “盗版” APK 可任意流通。升级一致性
只有相同签名的 APK (signingSignature 字段一致)才能覆盖安装旧版本,否则系统会报“签名不一致”。如果没有正确签名,用户无法升级,只能先卸载旧版,丢失全部私有数据。权限共享 / 多进程
相同签名的应用可共享数据,运行在同一 UID(通过 android:sharedUserId(已废弃)或 )。如果没有正确签名,应用间无法安全地暴露定制 API,只能把接口暴露给任意应用,增加攻击面。沙箱身份绑定
首次安装时,系统根据签名生成应用 UID;后续重装签名不变才能保持 UID 不变,从而保留 /data/data/ 下的私有目录。如果没有正确签名,签名改变导致 UID 变化,原数据目录被系统隔离,失去数据继承的权利,相当于“全新应用”。应用市场 / 生态信任
Google Play、华为、小米等商店均会校验签名指纹;开发者后台上传的证书指纹与线上 APK 必须一致,防止冒名顶替。如果没有正确签名,攻击者可上架山寨应用,诱导用户安装,实施钓鱼、勒索。v1 / v2 / v3 / v4 签名方案
只是“签名格式”演进(JAR 签名 > APK 签名方案 v2 > v3 支持密钥轮换 > v4 支持增量更新),安全语义不变,系统仍只认证书指纹是否匹配。
4、Android Studio 中创建秘钥
(1)创建秘钥
Android Studio 中,点击 Build -> Generate Signed App Bundle or APK… 进入打包界面,选择 “APK”,点击 Next 按钮进入下一步,如下图:
点击 “Create new…” 按钮打开新建秘钥窗口:

在新建秘钥界面,选择要创建秘钥的路径及文件名称,然后点击 “OK” 按钮返回新建秘钥窗口:
输入KeyStore 密码、别名、私钥密码、有效时长等信息,点击 OK 按钮完成秘钥文件的创建。KeyStore 密码:用来锁住整个 .jks(或 .keystore)文件;以后任何人想修改、查看、删除里面的条目都必须输入该密码验证通过才能操作。私有密码:用来加密这个私钥本身。两个密码可以设置成相同的,既省心又避免 “KeyStore 与 Key 密码不一致” 导致的 Gradle 签名失败。
! ! ! 密钥的密码一定要记住 ! ! !

(2)查看秘钥文件
在 Android Studio 的 File -> Settings… 中安装秘钥浏览器插件(KS-Explorer):
安装插件后,点击上面生成的秘钥文件(release.jks),输入 keystore 秘钥后,可查看私钥的详细信息:


(3)配置秘钥文件
在工程的 local.properties 文件中添加签名秘钥字段:
storePassword=123456
keyPassword=654321
在模块的 build.gradle.kt 文件中增加签名配置:
// 配置签名秘钥
val localProperties = Properties()
val localPropertiesFile = rootProject.file("local.properties")
if (localPropertiesFile.exists()) {
localProperties.load(localPropertiesFile.inputStream())
}
android {
......
signingConfigs {
create("release") {
storeFile = file("signFile/release.jks")
storePassword = localProperties.getProperty("storePassword")
keyAlias = "release"
keyPassword = localProperties.getProperty("keyPassword")
}
}
buildTypes {
release {
......
signingConfig = signingConfigs.getByName("release")
}
}
(4)正式打包签名
Android Studio 中,将要打包的模块的变体更改为 release 版本:
点击 Build -> Generate Signed App Bundle or APK… 进入打包界面;选择 “APK”,点击 Next 按钮进入签名 APK 窗口,在该窗口中选中之前创建的秘钥文件(release.jks),输入秘钥文件 keystore 密码、别名和私钥密码,同时选中 “Remember passwords” 选项记住密码,然后点击 “Next” 按钮进入下一步:
选择 release 变体,点击 “Create” 开始签名打包 APK 文件:
等待签名打包完成后,在模块下会生成 release 目录,里面是打包生成的 release 安装包(app-relese.apk):

参考文档:
https://blog.csdn.net/qq_39150957/article/details/145602868


