任丘市网站建设价格,玉泉营网站建设,网站建设 客户评价,从化高端网站建设一、Flutter 打包 flutter build apk --release二、生成 release 签名文件#xff1a;autoclick-key.jks⚠️ 此步骤只需要做 一次。已经有 autoclick-key.jks 的话#xff0c;可以直接跳到后面的签名配置。2.1 生成 keystore 的命令在项目根目录执行#xff08;确保 androi…一、Flutter 打包flutter build apk --release二、生成 release 签名文件autoclick-key.jks⚠️ 此步骤只需要做一次。已经有autoclick-key.jks的话可以直接跳到后面的签名配置。2.1 生成 keystore 的命令在项目根目录执行确保android/app目录存在keytool -genkeypair \ -v \ -keystore ./android/app/autoclick-key.jks \ -alias autoclick \ -keyalg RSA \ -keysize 2048 \ -validity 10000参数说明-keystore ./android/app/autoclick-key.jks生成的 keystore 文件路径与文件名放在android/app目录下后续 Gradle 会按这个路径去找-alias autoclick此 keystore 中 key 的别名后续local.properties和验证命令都要用同一个 alias-validity 10000证书有效期天数10000 天 ≈ 27 年可按需调整2.2 生成过程中的交互说明执行命令后keytool会按顺序问你Keystore 密码例如YourStorePassword名字与姓氏 (CN)例如***组织单位 (OU)例如Development组织名称 (O)例如****城市或区域 (L)例如***省/市/自治区 (ST)例如***国家代码 (C)例如CN最后会给出一行类似CN****, OUDevelopment, O****, Ljinan, STshandong, CCN 是否正确? [否]:这里输入y或yes即可完成生成。2.3 生成后的文件位置与备份生成成功后文件路径android/app/autoclick-key.jks这个文件非常重要以后所有版本更新必须使用同一个 keystore 签名丢失后将无法给已安装用户推送升级建议备份到安全位置例如移动硬盘 / 私有云盘记录keystore 文件名autoclick-key.jkskeystore 密码storePasswordaliasautoclickkey 密码keyPassword若与 keystore 密码不同三、APK 文件名修改方案说明3.1 核心目标在保持 Flutter 默认生成的app-release.apk的同时额外复制一份带有应用名 版本号的 APKautoclick-v1.0.0(1)-release.apk示例这样既不影响 Flutter 工具寻找默认 APK又方便对外发布。3.2 版本号来源local.properties在build.gradle.kts中通过local.properties获取 Flutter 写入的版本信息// 1️⃣ 从 local.properties 中读取 Flutter 写入的版本号 val localProperties Properties().apply { val localPropsFile rootProject.file(local.properties) if (localPropsFile.exists()) { load(FileInputStream(localPropsFile)) } } // 如果没取到就给个默认值防止构建失败 val flutterVersionCode: Int (localProperties.getProperty(flutter.versionCode) ?: 1).toInt() val flutterVersionName: String localProperties.getProperty(flutter.versionName) ?: 1.0.0Flutter 在运行flutter build时会自动往local.properties写入flutter.versionCode、flutter.versionName这里直接读出来用于 APK 命名。3.3 自定义拷贝 重命名 Release APK在android/app/build.gradle.kts底部定义任务// 重命名 flutter-apk 产物Release 版本 tasks.register(copyAndRenameFlutterApkRelease) { doLast { val outputDir file($buildDir/outputs/flutter-apk) if (!outputDir.exists()) { println(flutter-apk dir not found, skip rename (release)) returndoLast } val appName autoclick val vName flutterVersionName val vCode flutterVersionCode outputDir.listFiles()?.forEach { file - if (file.isFile file.extension apk release in file.name) { val newName ${appName}-v${vName}(${vCode})-release.apk val newFile File(outputDir, newName) // ✅ 注意copy 而不是 rename保留原始 app-release.apk file.copyTo(newFile, overwrite true) println(Copied and renamed flutter-apk → $newName) } } } }关键点说明遍历build/outputs/flutter-apk下的所有.apk文件只处理文件名中包含release的 APK新文件命名规则${appName}-v${versionName}(${versionCode})-release.apk 例autoclick-v1.0.0(1)-release.apk使用copyTo()保证原始app-release.apk不被删除Flutter 仍然能找到默认 APK3.4 与 assembleRelease 任务关联为了在每次构建 Release APK 时自动执行上述复制任务// ✅ 用 matching 动态关联 assembleRelease 任务避免 “Task not found” 错误 tasks.matching { it.name assembleRelease }.configureEach { finalizedBy(copyAndRenameFlutterApkRelease) }含义在 Gradle 中匹配名为assembleRelease的任务为其追加finalizedBy(copyAndRenameFlutterApkRelease)即assembleRelease执行完成后自动执行拷贝重命名任务3.5 打包后目录结构示例执行flutter build apk --release成功后build/app/outputs/flutter-apk/目录中会同时存在app-release.apk # Flutter 默认产物 autoclick-v1.0.0(1)-release.apk # 自定义命名产物用于发布对外发包 / 安装测试时推荐使用autoclick-v1.0.0(1)-release.apk四、签名配置说明signingConfigs local.properties4.1 Gradle 中的签名配置在android { signingConfigs { ... } }中signingConfigs { create(release) { // 这里从 local.properties 中读取参数这里有个 app/ // 所以 keytool 生成的 jks 要放到 android/app 目录下 storeFile localProperties.getProperty(storeFile) ?.let { File(rootProject.projectDir, app/$it) } storePassword localProperties.getProperty(storePassword) keyAlias localProperties.getProperty(keyAlias) keyPassword localProperties.getProperty(keyPassword) } }在buildTypes中启用 release 签名buildTypes { getByName(release) { isMinifyEnabled true isShrinkResources true // 使用上面的 release 签名配置 signingConfig signingConfigs.getByName(release) // 只需要手动创建 proguard-rules.pro可以是空文件但要放在 app 目录下 proguardFiles( getDefaultProguardFile(proguard-android-optimize.txt), proguard-rules.pro ) } getByName(debug) { isMinifyEnabled false isShrinkResources false } }4.2 local.properties 中的签名字段示例在android/local.properties中新增敏感信息请自己替换# keystore 文件名相对 android/app 路径 storeFileautoclick-key.jks # keystore 密码 storePassword你的_keystore_密码 # key 别名alias例如autoclick keyAliasautoclick # key 密码通常与 storePassword 相同也可以不同 keyPassword你的_key_密码⚠️ 注意autoclick-key.jks文件应位于android/app/autoclick-key.jks请勿将包含密码的local.properties和.jks文件提交到公共仓库如 GitHub 公共仓库五、签名验证keystore 与 APK 对应关系签名验证分两步验证keystore 自身信息别名、证书 DN、指纹验证APK 使用的签名证书确认与 keystore 一致5.1 查看 keystore 证书信息keytool在项目根目录执行或调整路径到实际位置keytool -list -v -keystore ./android/app/autoclick-key.jks -alias autoclick命令说明-keystore指向你的 keystore 文件-alias你生成 keystore 时设置的别名这里是autoclick执行后会让你输入keystore 密码成功后会输出类似Alias name: autoclick Creation date: ... Entry type: PrivateKeyEntry Owner: CN***, OUDevelopment, O***, L****, ST****, CCN SHA1: AA:BB:CC:DD:... SHA256: 11:22:33:44:... ...建议记录下Owner证书 DNSHA1SHA256后续与 APK 对比使用。5.2 验证 Release APK 的签名证书apksigner使用你自定义命名的 Release APK 文件apksigner verify --print-certs \ build/app/outputs/flutter-apk/autoclick-v1.0.0(1)-release.apk如果系统找不到apksigner可以使用 Android SDK 中的完整路径例如$ANDROID_HOME/build-tools/build-tools-version/apksigner verify --print-certs \ build/app/outputs/flutter-apk/autoclick-v1.0.0(1)-release.apk输出示例Verifies Verified using v2 scheme (APK Signature Scheme v2) Verified using v3 scheme (APK Signature Scheme v3) Number of signers: 1 核对要点Signer #1 certificate DN是否与keytool -list输出的Owner一致SHA-1 digest/SHA-256 digest是否与 keystore 中的SHA1/SHA256一致如果两处信息完全一致说明✅autoclick-v1.0.0(1)-release.apk确实是用android/app/autoclick-key.jks中 alias 为autoclick的 key 进行签名的可以作为正式 Release 包对外发布。六、常见问题 FAQQ1目录里有两个 APK我到底用哪个app-release.apkFlutter 默认生成工具链依赖它autoclick-v1.0.0(1)-release.apk通过copyAndRenameFlutterApkRelease任务生成推荐作为对外发布 / 安装测试 / 上架的文件签名一致用哪一个都行建议统一使用自定义命名的那个。Q2每次改版本号需要改哪里Flutter 侧在pubspec.yaml中修改version: 1.0.011.0.0flutter.versionName1flutter.versionCode执行构建命令时Flutter 会自动同步到local.properties Gradle 的flutterVersionName/flutterVersionCode会自动更新 自定义 APK 命名也会随之变化无需额外修改代码。Q3如何确认当前 Release 是否用的是 debug 签名如果apksigner输出中出现类似CNAndroid Debug, OAndroid, CUS则说明是debug 签名需要检查buildTypes { release { signingConfig signingConfigs.getByName(release) } }是否正确local.properties中的storeFile等字段是否填写完整keystore 路径是否存在、密码是否正确七、keytool 常用操作速查进阶本节是对 keytool 相关操作的补充方便以后查看 / 维护 keystore。 生成 keystore 的命令已在第二章给出这里不再重复。7.1 查看 keystore 中所有别名alias 列表如果忘记 keystore 中有哪些 alias可以不加-alias只看列表keytool -list -keystore ./android/app/autoclick-key.jks系统会让你输入 keystore 密码然后打印所有别名名称。 再根据别名使用前面的keytool -list -v -keystore ./android/app/autoclick-key.jks -alias autoclick查看某个具体 alias 的详细证书信息。7.2 修改 keystore 密码 / key 密码可选操作修改 keystore 密码keytool -storepasswd -keystore ./android/app/autoclick-key.jks修改某个 alias 对应的 key 密码keytool -keypasswd \ -keystore ./android/app/autoclick-key.jks \ -alias autoclick修改后记得同步更新android/local.properties中的storePassword新的_keystore_密码 keyPassword新的_key_密码7.3 导出证书可用于对接第三方平台部分第三方平台会要求你提供签名证书.cer/.pemkeytool -exportcert \ -keystore ./android/app/autoclick-key.jks \ -alias autoclick \ -file ./android/app/autoclick-cert.cer \ -rfc生成的autoclick-cert.cer就可以提供给需要校验证书的第三方。