杰瑞科技汇

Android签名怎么操作?步骤是怎样的?

Android 应用签名终极教程

什么是签名?为什么必须签名?

在 Android 系统中,签名 是一个强制性的步骤,每个 APK 文件都必须经过数字签名才能被安装和运行。

为什么必须签名?

  • 身份验证:签名可以验证应用的来源,它确保用户安装的应用确实是你发布的,而不是别人冒充的,这就像一个“数字身份证”。
  • 完整性校验:签名可以确保应用在发布后没有被篡改,APK 文件在签名之后被任何第三方修改过,系统在安装时会检测到签名不匹配,从而拒绝安装,这保证了应用代码的完整性。
  • 升级机制:Android 系统通过签名来决定一个新安装的应用是否可以覆盖旧版本,只有当新应用的签名与旧版本完全相同时,系统才允许它进行升级,否则,系统会将其视为一个全新的应用。

签名是如何工作的?

它使用非对称加密技术:

  • 你拥有一对密钥:私钥公钥
  • 你使用 私钥 对你的应用进行签名(这个过程是保密的,只有你有)。
  • 你将 公钥 打包进 APK 文件中。
  • 安装时,Android 系统使用公钥来验证签名是否由对应的私钥生成,由于私钥只有你持有,所以可以证明 APK 是你发布的。

签名的两种方式:调试签名与发布签名

Android 开发中有两种主要的签名模式:

特性 调试签名 发布签名
用途 开发和测试阶段 发布到应用商店(Google Play, 华为应用市场等)
生成方式 Android Studio / Gradle 自动生成 必须由开发者自己创建
密钥库 debug.keystore (位于 ~/.android/ 目录) 自定义的 .jks.keystore 文件
别名 androiddebugkey 自定义别名
密码 android 自定义密码
有效期 36500 年 (有效期很长) 推荐至少 25 年,以确保应用升级顺畅

重要提示永远不要将 debug.keystore 用于发布应用! 它是公开的,任何人都可以用它来签名一个冒充你应用的应用,这会带来巨大的安全风险。


如何创建发布签名密钥库?

在发布应用之前,你必须创建自己的签名密钥,最常用的工具是 Java 的 keytool(它随 JDK 一起安装)。

打开命令行工具

  • Windows: 打开 cmdPowerShell
  • macOS / Linux: 打开 Terminal

执行 keytool 命令

运行以下命令来创建密钥库文件(通常以 .jks.keystore 为后缀)。

keytool -genkeypair -v -keystore my-release-key.jks -alias my-alias -keyalg RSA -keysize 2048 -validity 10000 -storepass YOUR_STORE_PASSWORD -keypass YOUR_KEY_PASSWORD -dname "CN=Your Name, OU=Your Unit, O=Your Organization, L=Your City, ST=Your State, C=Your Country"

命令参数详解:

  • -genkeypair: 生成密钥对(包含公钥和私钥)。
  • -keystore my-release-key.jks: 指定密钥库文件的名称和路径,这里我们创建了一个名为 my-release-key.jks 的文件。请妥善保管此文件,不要丢失或泄露!
  • -alias my-alias: 指定密钥的别名,这个别名用于在密钥库中唯一标识你的密钥。
  • -keyalg RSA: 指定密钥算法,RSA 是标准且安全的算法。
  • -keysize 2048: 指定密钥大小,2048 位是当前推荐的安全级别。
  • -validity 10000: 指定密钥的有效期,单位是天,这里设置为 10000(约 27 年),确保在应用生命周期内无需重新签名。
  • -storepass YOUR_STORE_PASSWORD: 设置密钥库的访问密码。请替换为强密码。
  • -keypass YOUR_KEY_PASSWORD: 设置别名的私钥密码。请替换为强密码。 (可以和 -storepass 相同,但建议不同)
  • -dname: 设置“可分辨名称”,包含你的身份信息,格式为 "CN=姓名, OU=部门, O=组织, L=城市, ST=省份, C=国家代码"
    • CN (Common Name): 通常是你的姓名或公司名。
    • C: 国家代码,CN 代表中国。

执行后,keytool 会在你当前所在的目录下生成 my-release-key.jks 文件。

安全提示

  • .jks 文件保存在安全的地方,最好加入版本控制系统(如 Git)的 .gitignore 文件中,或者使用专门的密钥管理服务。
  • 不要将密码硬编码在你的代码或配置文件中。

如何在 Android Studio 中配置签名?

创建好密钥后,你需要告诉 Android Studio 在构建发布版本时使用它。

使用 UI 界面(推荐新手)

  1. 打开你的 Android 项目。

  2. 进入 File -> Project Structure...

  3. 在左侧选择 Modules,然后选择你的 app 模块。

  4. 切换到 Signing 标签页。

  5. 点击右上角的 号,创建一个新的签名配置,例如命名为 release

  6. 填写以下信息:

    • Key store path: 点击 按钮,选择你刚刚创建的 my-release-key.jks 文件。
    • Key store password: 输入你在 keytool 中设置的 -storepass
    • Key alias: 输入你在 keytool 中设置的 -alias (my-alias)。
    • Key password: 输入你在 keytool 中设置的 -keypass
  7. 点击 OK 保存签名配置。

  8. 切换到 Build Types 标签页。

  9. 选择 release 构建类型。

  10. Signing Config 下拉菜单中,选择你刚刚创建的 release 签名配置。

  11. 点击 OK 保存所有更改。

直接修改 build.gradle 文件

这种方法更灵活,适合 CI/CD 流程。

  1. 打开 app 目录下的 build.gradle.kts (或 build.gradle) 文件。
  2. android { ... } 代码块中,添加一个 signingConfigs 配置:
// build.gradle.kts (Kotlin DSL)
android {
    // ... 其他配置
    signingConfigs {
        create("release") {
            storeFile = file("my-release-key.jks") // 密钥库文件路径
            storePassword = "YOUR_STORE_PASSWORD" // 密钥库密码
            keyAlias = "my-alias" // 别名
            keyPassword = "YOUR_KEY_PASSWORD" // 别名密码
        }
    }
    buildTypes {
        release {
            isMinifyEnabled = true // 启用代码混淆
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
            // 应用签名配置
            signingConfig = signingConfigs.getByName("release")
        }
    }
}
// build.gradle (Groovy DSL)
android {
    // ... other configurations
    signingConfigs {
        release {
            storeFile file("my-release-key.jks") // 密钥库文件路径
            storePassword "YOUR_STORE_PASSWORD" // 密钥库密码
            keyAlias "my-alias" // 别名
            keyPassword "YOUR_KEY_PASSWORD" // 别名密码
        }
    }
    buildTypes {
        release {
            minifyEnabled true // 启用代码混淆
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            // 应用签名配置
            signingConfig signingConfigs.release
        }
    }
}

如何生成已签名的 APK / AAB?

配置好签名后,就可以构建发布版本了。

生成 APK (Android Package Kit)

  • 在 Android Studio 顶部工具栏中,将构建变体从 debug 切换到 release
  • 点击旁边的 Build -> Generate Signed Bundle / APK...
  • 选择 APK,然后点击 Next
  • 如果之前通过 UI 配置,系统会自动找到你的 release 签名配置,如果没有,你需要点击 Choose existing... 来选择你的 .jks 文件并填写密码。
  • 选择你想包含的 release 变体(通常是 release)。
  • 点击 Finish,Android Studio 会在 app/build/outputs/apk/release/ 目录下生成已签名的 APK 文件。

生成 AAB (Android App Bundle) - 推荐方式

Google Play 商店现在推荐使用 AAB 格式,它会根据用户的设备自动生成和优化 APK。

  • 在 Android Studio 顶部工具栏中,确保是 release 变体。
  • 点击 Build -> Generate Signed Bundle / APK...
  • 选择 Android App Bundle,然后点击 Next
  • 同样,选择你的 release 签名配置。
  • 选择 release 变体。
  • 点击 Finish,已签名的 AAB 文件会生成在 app/build/outputs/bundle/release/ 目录下。

常见问题与解决方案

问题1:升级应用时提示“签名不匹配”

  • 原因:你尝试用一个新的、不同的密钥去签名一个已安装的应用。
  • 解决方案必须使用与首次发布时完全相同的 .jks 文件和密码,这就是为什么密钥的有效期要设置得足够长,如果你不小心丢失了原始密钥,那么用户将无法通过正常渠道升级,只能卸载后重新安装。

问题2:如何检查 APK 的签名信息?

可以使用 keytoolapksigner 命令行工具。

# 查看 APK 的签名信息
keytool -printcert -jarpath your-app.apk
# 或者使用 apksigner (在 Android SDK 的 build-tools 目录下)
./apksigner verify -print-certs your-app.apk

问题3:我应该将签名信息保存在哪里?

  • .jks 文件:这是最重要的资产,应该:
    • 备份到多个安全位置(如加密硬盘、云存储)。
    • 不要提交到公共的代码仓库(如 GitHub)。
    • 可以使用 GitHub Secrets 或其他 CI/CD 密钥管理服务来管理。
  • 密码:不要硬编码在代码里,同样,使用安全的环境变量或密钥管理服务。

  1. 理解签名:它是应用的身份证明和完整性保证。
  2. 区分调试和发布:开发用 debug.keystore,发布必须用自己创建的密钥。
  3. 创建密钥:使用 keytool 生成一个安全的 .jks 文件,并妥善保管。
  4. 配置签名:在 Android Studio 的 Project Structurebuild.gradle 中配置你的发布签名。
  5. 构建发布包:生成已签名的 APK 或 AAB 文件,准备上传到应用商店。
  6. 安全第一:永远不要泄露你的 .jks 文件和密码,否则你的应用将面临被仿冒的风险。

遵循以上步骤,你就可以安全、正确地为你的 Android 应用进行签名和发布了。

分享:
扫描分享到社交APP
上一篇
下一篇