Android应用签名与打包 #

一、签名概述 #

1.1 为什么需要签名 #

  • 应用唯一标识
  • 确保应用完整性
  • 应用更新验证
  • Google Play要求

1.2 签名类型 #

类型 说明
Debug签名 开发调试使用
Release签名 正式发布使用

二、生成签名密钥 #

2.1 使用Android Studio生成 #

  1. Build -> Generate Signed Bundle / APK
  2. 选择 APK
  3. Create new… 创建新密钥
  4. 填写密钥信息

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打包 #

  1. Build -> Generate Signed Bundle / APK
  2. 选择 APK
  3. 选择密钥库和输入密码
  4. 选择 release 构建变体
  5. 选择输出目录

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发布 #

  1. 创建开发者账号
  2. 创建应用
  3. 上传AAB
  4. 填写商店信息
  5. 提交审核

9.3 国内应用市场发布 #

  • 小米应用商店
  • 华为应用市场
  • OPPO应用商店
  • vivo应用商店
  • 腾讯应用宝
  • 360手机助手

十、总结 #

本章详细介绍了Android应用签名与打包:

  1. 签名的基本概念
  2. 生成签名密钥
  3. 配置签名信息
  4. 打包APK和AAB
  5. 多渠道打包
  6. 代码混淆
  7. 版本管理
  8. 发布流程

掌握签名与打包是Android开发者的必备技能。

最后更新:2026-03-26