Android应用签名与打包 #
一、签名概述 #
1.1 为什么需要签名 #
- 应用唯一标识
- 确保应用完整性
- 应用更新验证
- Google Play要求
1.2 签名类型 #
| 类型 | 说明 |
|---|---|
| Debug签名 | 开发调试使用 |
| Release签名 | 正式发布使用 |
二、生成签名密钥 #
2.1 使用Android Studio生成 #
- Build -> Generate Signed Bundle / APK
- 选择 APK
- Create new… 创建新密钥
- 填写密钥信息
2.2 使用命令行生成 #
bash
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-alias
2.3 密钥信息 #
| 字段 | 说明 |
|---|---|
| Keystore | 密钥库文件 |
| Keystore password | 密钥库密码 |
| Key alias | 密钥别名 |
| Key password | 密钥密码 |
三、配置签名 #
3.1 在build.gradle中配置 #
kotlin
android {
signingConfigs {
create("release") {
storeFile = file("release.jks")
storePassword = "your_store_password"
keyAlias = "your_key_alias"
keyPassword = "your_key_password"
}
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
}
3.2 安全存储签名信息 #
kotlin
// 创建 keystore.properties 文件
storePassword=your_store_password
keyPassword=your_key_password
keyAlias=your_key_alias
storeFile=release.jks
// 在build.gradle中读取
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
android {
signingConfigs {
create("release") {
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
}
}
}
3.3 添加到.gitignore #
text
keystore.properties
*.jks
*.keystore
四、打包APK #
4.1 使用Android Studio打包 #
- Build -> Generate Signed Bundle / APK
- 选择 APK
- 选择密钥库和输入密码
- 选择 release 构建变体
- 选择输出目录
4.2 使用Gradle命令打包 #
bash
# 打包Debug APK
./gradlew assembleDebug
# 打包Release APK
./gradlew assembleRelease
# 打包所有变体
./gradlew assemble
4.3 APK输出位置 #
text
app/build/outputs/apk/
├── debug/
│ └── app-debug.apk
└── release/
└── app-release.apk
五、打包AAB #
5.1 什么是AAB #
Android App Bundle (AAB) 是Google Play使用的发布格式,可以自动生成优化的APK。
5.2 打包AAB #
bash
./gradlew bundleRelease
5.3 AAB输出位置 #
text
app/build/outputs/bundle/release/
└── app-release.aab
六、多渠道打包 #
6.1 配置Flavor #
kotlin
android {
flavorDimensions += "channel"
productFlavors {
create("google") {
dimension = "channel"
manifestPlaceholders["channel"] = "google"
}
create("huawei") {
dimension = "channel"
manifestPlaceholders["channel"] = "huawei"
}
create("xiaomi") {
dimension = "channel"
manifestPlaceholders["channel"] = "xiaomi"
}
}
}
6.2 在Manifest中配置 #
xml
<meta-data
android:name="CHANNEL"
android:value="${channel}" />
6.3 使用美团Walle #
kotlin
dependencies {
implementation("com.meituan.android.walle:library:1.1.7")
}
// 读取渠道
val channel = WalleChannelReader.getChannel(context)
七、代码混淆 #
7.1 启用混淆 #
kotlin
android {
buildTypes {
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
}
7.2 ProGuard规则 #
proguard
# 保留应用类
-keep public class com.example.** { *; }
# 保留Parcelable
-keepclassmembers class * implements android.os.Parcelable {
static ** CREATOR;
}
# 保留Serializable
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# Retrofit
-keepattributes Signature
-keepattributes *Annotation*
-keep class retrofit2.** { *; }
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}
# OkHttp
-dontwarn okhttp3.**
-dontwarn okio.**
-keep class okhttp3.** { *; }
-keep interface okhttp3.** { *; }
# Gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class com.google.gson.** { *; }
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
八、版本管理 #
8.1 版本号配置 #
kotlin
android {
defaultConfig {
versionCode = 1
versionName = "1.0.0"
}
}
8.2 自动版本号 #
kotlin
android {
defaultConfig {
versionCode = gitVersionCode()
versionName = gitVersionName()
}
}
fun gitVersionCode(): Int {
return try {
val process = Runtime.getRuntime().exec("git rev-list --count HEAD")
val reader = BufferedReader(InputStreamReader(process.inputStream))
reader.readLine().toInt()
} catch (e: Exception) {
1
}
}
fun gitVersionName(): String {
return try {
val process = Runtime.getRuntime().exec("git describe --tags")
val reader = BufferedReader(InputStreamReader(process.inputStream))
reader.readLine()
} catch (e: Exception) {
"1.0.0"
}
}
九、发布流程 #
9.1 发布前检查 #
- [ ] 版本号更新
- [ ] 签名配置正确
- [ ] 混淆规则完整
- [ ] 日志关闭
- [ ] 测试通过
9.2 Google Play发布 #
- 创建开发者账号
- 创建应用
- 上传AAB
- 填写商店信息
- 提交审核
9.3 国内应用市场发布 #
- 小米应用商店
- 华为应用市场
- OPPO应用商店
- vivo应用商店
- 腾讯应用宝
- 360手机助手
十、总结 #
本章详细介绍了Android应用签名与打包:
- 签名的基本概念
- 生成签名密钥
- 配置签名信息
- 打包APK和AAB
- 多渠道打包
- 代码混淆
- 版本管理
- 发布流程
掌握签名与打包是Android开发者的必备技能。
最后更新:2026-03-26