Skip to content

打包与签名 ​

一、Android 端 ​

1. 签名文件的作用 ​

1、应用程序升级:如果你希望用户无缝升级到新的版本,那么你必须用同一个证书进行签名。这是由于只有以同一个证书签名,系统才会允许安装升级的应用程序。如果你采用了不同的证书,那么系统会要求你的应用程序采用不同的包名称,在这种情况下相当于安装了一个全新的应用程序。如果想升级应用程序,签名证书要相同,包名称要相同!

2、应用程序模块化:Android 系统可以允许同一个证书签名的多个应用程序在一个进程里运行,系统实际把他们作为一个单个的应用程序,此时就可以把我们的应用程序以模块的方式进行部署,而用户可以独立的升级其中的一个模块

3、代码或者数据共享:Android 提供了基于签名的权限机制,那么一个应用程序就可以为另一个以相同证书签名的应用程序公开自己的功能。以同一个证书对多个应用程序进行签名,利用基于签名的权限检查,你就可以在应用程序间以安全的方式共享代码和数据了。不同的应用程序之间,想共享数据,或者共享代码,那么要让他们运行在同一个进程中,而且要让他们用相同的证书签名。

2. 生成签名文件 ​

  1. 寻找到你的 jdk 的 bin 目录下,默认安装路径在 C:\Program Files\Java 文件夹下面

  2. 通过管理员的方式打开 cmd,输入:cd C:\Program Files\Java\jdk1.8.0_91\bin

  3. 再输入 keytool 命令行,回车生成帮助方法

bash
keytool -genkey -v -keystore D:/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias sign

参数说明:

  • keytool:密钥和证书管理工具
  • genkey:产生密钥(这里是 jdk1.8.0,属于旧版,jdk21 新版的命令是 genkeypair)
  • -v:增加详细输出模式,这样在执行命令时会显示更多的信息。
  • keystore:证书的存放路径和名字
  • keyalg RSA -keysize 2048:使用 2048 位 RSA 算法对签名加密
  • validity 10000:有效期时间,这里是 10000 天
  • alias sign:别名 sign

执行后按提示输入:

  • 第一行:自定义密码
  • 第二行:确认密码
  • 其他行按回车
  • 最后一行输入 y,回车确定

最后在 D 盘中生成了一个 key.jks 文件

3. 项目配置 ​

新建 [project]/android/key.properties

properties
keyAlias=sign
keyPassword=your_password
storeFile=D:/key.jks
storePassword=your_password

修改 [project]/android/app/build.gradle

  1. 在 android 代码块之前将你 properties 文件的密钥库信息添加进去:
groovy
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

android {
    ...
}

这样就把 key.properties 文件加载到 keystoreProperties 对象中

  1. 找到 buildTypes 代码块:
groovy
buildTypes {
    release {
        // TODO: Add your own signing config for the release build.
        // Signing with the debug keys for now,
        // so `flutter run --release` works.
        signingConfig signingConfigs.debug
    }
}

替换为:

groovy
signingConfigs {
    release {
        keyAlias keystoreProperties['keyAlias']
        keyPassword keystoreProperties['keyPassword']
        storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
        storePassword keystoreProperties['storePassword']
    }
}
buildTypes {
    release {
        signingConfig signingConfigs.release
    }
}

现在我们 app 的发布版本就会被自动签名了

当你更改 gradle 文件后,也许需要运行一下 flutter clean。这将防止缓存的版本影响签名过程

4. 生成 APK ​

运行

bash
flutter build apk --target-platform android-arm --split-per-abi

或者

bash
flutter build apk //(相对上面那个命令,此命令打包的apk相对大一些)

或者

bash
flutter build appbundle //(aab包)