在 Flutter 中发布 APK(15)

作者 : 慕源网 本文共4035个字,预计阅读时间需要11分钟 发布时间: 2021-11-15 共366人阅读

介绍

这篇文章是关于如何在 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

  • 现在,我们需要生成签名证书来签署android apk。以下是生成签名证书的命令。您需要在终端中执行此命令,这将在终端打开的同一文件夹中生成 flutter_release_apk.jks 文件。

    Enter keystore password: abcd1234
    Re-enter new password: abcd1234

    What is your first and last name?
    [Unknown]: demo demo

    What is the name of your organizational unit?
    [Unknown]: demo

    What is the name of your organization?
    [Unknown]: demo

    What is the name of your City or Locality?
    [Unknown]: demo

    What is the name of your State or Province?
    [Unknown]: demo

    What is the two-letter country code for this unit?
    [Unknown]: 91

    Is 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 商店中上传。

  • 祝你好运,我希望你将来能做出很棒的应用程序 :)))

结论

在本文中,我们学习了如何生成发行版 apk。这种在 flutter 中生成 release apk 的方式非常安全,因为我们已经定义了单独的文件来存储我们的密钥库凭证,这是推荐的方式。

 


慕源网 » 在 Flutter 中发布 APK(15)

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录