在 Flutter 中发布 APK(15)
介绍
这篇文章是关于如何在 Flutter 中为 Android 生成发布 apk 的说明。我们将生成一个证书来签署一个未签名的 apk 以及所有其他必要的步骤来生成一个发布 apk。
步骤
- 如果您是 Flutter 的初学者,那么您可以查看我的博客Create a first app in Flutter。我创建了名为“flutter_release_apk”的应用程序
- 您可以在 app 文件夹 (android/app/build.gradle) 下的 build.gradle 中指定一些与 app 相关的设置。我在下面提到了重要的设置:
- applicationId
这在 Google Play 中的所有应用程序中必须是唯一的,因此请明智地选择名称。您的应用程序将以此名称标识,并且无法更改。 - versionCode
这是应用程序版本代码,每次在 Google Play 上更新应用程序时都需要更新。Google Play 商店不接受使用相同版本的代码进行更新。例如:
applicationId com.example.flutter_release_apk
versionCode 1
- applicationId
- 现在,我们需要生成签名证书来签署android apk。以下是生成签名证书的命令。您需要在终端中执行此命令,这将在终端打开的同一文件夹中生成 flutter_release_apk.jks 文件。
Enter keystore password: abcd1234
Re-enter new password: abcd1234What is your first and last name?
[Unknown]: demo demoWhat is the name of your organizational unit?
[Unknown]: demoWhat is the name of your organization?
[Unknown]: demoWhat is the name of your City or Locality?
[Unknown]: demoWhat is the name of your State or Province?
[Unknown]: demoWhat is the two-letter country code for this unit?
[Unknown]: 91Is CN=demo demo, OU=demo, O=demo, L=demo, ST=demo, C=91 correct?
[no]: yes生成 2,048 位 RSA 密钥对和自签名证书 (SHA256withRSA),有效期为 10,000 天
:CN=demo demo, OU=demo, O=demo, L=demo, ST=demo, C=91输入 <alias_name> 的
密钥密码(如果与密钥库密码相同,则返回):abcd1234重新输入新密码:abcd1234
[Storing flutter_release_apk.jks]所以,现在我有了我的终端打开的 flutter_release_apk.jksin 目录。
注意
安全地复制并保存此文件,因为每次需要更新应用程序时都需要它。如果您丢失了此文件,则以后将无法更新您的应用 - 现在,我们需要在 android 文件夹下创建一个名为“key.properties”的文件。此文件存储用于签署发布 apk 的凭据。将以下代码放入此文件并根据您的 jsk 文件进行更新
storePassword=abcd1234
keyPassword=abcd1234
keyAlias=alias_name
storeFile=/Applications/AMPPS/www/Flutter_Demos/flutter_release_apk/flutter_release_apk.jks保存文件。
- 现在,回到 app 目录下的 build.gradle 文件(android/app/build.gradle)。现在我们需要为发布 apk 生成定义一些设置。我将一些需要添加或更新的文本加粗。
-
def localProperties = new Properties() def localPropertiesFile = rootProject.file('local.properties') if (localPropertiesFile.exists()) { localPropertiesFile.withReader('UTF-8') { reader - > localProperties.load(reader) } } def flutterRoot = localProperties.getProperty('flutter.sdk') if (flutterRoot == null) { throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") } def flutterVersionCode = localProperties.getProperty('flutter.versionCode') if (flutterVersionCode == null) { flutterVersionCode = '1' } def flutterVersionName = localProperties.getProperty('flutter.versionName') if (flutterVersionName == null) { flutterVersionName = '1.0' } apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" def keystoreProperiesFile = rootProject.file("key.properties") def keystoreProperies = new Properties() keystoreProperies.load(new FileInputStream(keystoreProperiesFile)) android { compileSdkVersion 28 lintOptions { disable 'InvalidPackage' } defaultConfig { applicationId "com.example.flutter_release_apk" minSdkVersion 16 targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } signingConfigs { release { keyAlias keystoreProperies["keyAlias"] keyPassword keystoreProperies["keyPassword"] storeFile file(keystoreProperies["storeFile"]) storePassword keystoreProperies["storePassword"] } } buildTypes { release { // signingConfig signingConfigs.debug signingConfig signingConfigs.release } } } flutter { source '../..' } dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' }
-
保存文件。
- 现在,在终端中运行命令 flutter build apk –release。以下是我的终端日志,可以看到生成了我的release apk
MyVss-Mac-mini:flutter_release_apk myvs $ flutter build apk –release
Initializing gradle… 41.4s
Resolving dependencies… 46.5s
Calling mockable JAR artifact transform to create file: /Users/myvs/.gradle/caches/transforms-1/files-1.1/android.jar/fe6e28b8b8fb0fe581763b573c73df6a/android.jar with input /Users/myvs/Library/Android/sdk/platforms/android-28/android.jar
Running Gradle task ‘assembleRelease’…
Running Gradle task ‘assembleRelease’… Done 117.6s
Built build/app/outputs/apk/release/app-release.apk (4.9MB).
-
现在这个生成的 APK 可以作为发布 APK 上传到 Google Play 商店。
-
恭喜您现在可以上传任意数量的应用程序,以便在 Google Play 商店中上传。
-
祝你好运,我希望你将来能做出很棒的应用程序 :)))
结论
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!